利用窗口引用漏洞和XSS漏洞實(shí)現(xiàn)瀏覽器劫持
一、前言
最近國(guó)內(nèi)關(guān)于XSS漏洞的技術(shù)文檔都比較少,所以決定寫(xiě)這篇文檔,其中的很多細(xì)節(jié)和朋友們都溝通討論很久了,其中包括了我對(duì)瀏覽器同源策略和XSS的一些理解。XSS漏洞從Session劫持、釣魚(yú)、XSSWORM等主流攻擊方式發(fā)展到現(xiàn)在,告訴了大家一個(gè)真正的跨站師是不會(huì)被條條框框所束縛,跨站師們?cè)诓粩嗟膭?chuàng)新,跨站師們會(huì)展示XSS漏洞的所有可能。
二、同源策略簡(jiǎn)敘
同源策略是瀏覽器的安全基礎(chǔ),它是瀏覽器支持的客戶端腳本的重要安全標(biāo)準(zhǔn),我們可以從“源”上了解這一安全標(biāo)準(zhǔn),按照W3C的標(biāo)準(zhǔn)這個(gè)“源”包括域名、協(xié)議和端口,各大瀏覽器都曾爆出過(guò)很多同源策略漏洞,危害程度各有不同,比如從06年開(kāi)始流行至今的MS06-014網(wǎng)頁(yè)木馬漏洞都已經(jīng)完全顛覆了同源策略。這次的文檔主要說(shuō)的是DOM的同源策略(參考2)中的一個(gè)漏洞,然后從漏洞引申到XSS漏洞如何利用DOM的同源策略特性,最終實(shí)現(xiàn)瀏覽器劫持。
三、理解window對(duì)象的同源策略
窗口即指的是瀏覽器窗口,每個(gè)瀏覽器窗口都可以使用window對(duì)象實(shí)例來(lái)表示,window對(duì)象有很多屬性和方法,寫(xiě)一個(gè)簡(jiǎn)單的腳本可以歷遍出window對(duì)象的所有屬性和方法:
這些window對(duì)象的屬性和方法可以改變窗口的外觀和窗口網(wǎng)頁(yè)的內(nèi)容,當(dāng)這些屬性和方法只在一個(gè)窗口中使用并不會(huì)凸顯出安全問(wèn)題,但是當(dāng)多個(gè)window對(duì)象開(kāi)始互相引用的時(shí)候,這些屬性和方法就必須遵循同源策略。
舉一個(gè)簡(jiǎn)單的例子,如果在a.com的網(wǎng)頁(yè)可以調(diào)用b.com網(wǎng)頁(yè)window對(duì)象的屬性和方法,那么跨站師就可以隨便XSS互聯(lián)網(wǎng)上任何一個(gè)網(wǎng)站了,所以為了避免安全問(wèn)題,同源策略是必須的。我們可以把下面的腳本保存為demo.html到本地打開(kāi)或者丟到遠(yuǎn)程服務(wù)器上進(jìn)行測(cè)試,這個(gè)腳本的效果是調(diào)用不同源的子窗口window對(duì)象的屬性和方法,我們會(huì)發(fā)現(xiàn)location屬性的值類(lèi)型是空白的,這種情況太特殊了,說(shuō)明不同源的父窗口引用子窗口window對(duì)象的location屬性并沒(méi)有被拒絕訪問(wèn)。
四、窗口引用功能中的同源策略漏洞
4.1 父窗口引用子窗口的同源策略問(wèn)題
去年我在幻影雜志發(fā)過(guò)的IE6跨域腳本漏洞,這個(gè)問(wèn)題微軟已經(jīng)發(fā)布了ms08-058補(bǔ)丁修復(fù),但這個(gè)漏洞仍然暴露了父窗口引用子窗口的同源策略問(wèn)題。根據(jù)第二部分的測(cè)試,我們知道瀏覽器并沒(méi)有阻止父窗口訪問(wèn)非同源子窗口的location屬性值,我們可以使用下面的腳本進(jìn)行測(cè)試,會(huì)發(fā)現(xiàn)父窗口可以控制非同源子窗口location屬性值。
4.2 子窗口引用父窗口的同源策略問(wèn)題
五、利用窗口引用漏洞劫持瀏覽器
經(jīng)過(guò)上面三個(gè)枯燥的測(cè)試,我們已經(jīng)暴露了瀏覽器一個(gè)非常嚴(yán)重的安全問(wèn)題,非同源的子窗口和父窗口可以互相引用控制window對(duì)象的location屬性值,并沒(méi)有嚴(yán)格遵循同源策略,那么用戶在瀏覽器中的所有點(diǎn)擊行為都有可能被跨站師變相控制。
我們打開(kāi)瀏覽器訪問(wèn)互聯(lián)網(wǎng)上的各個(gè)網(wǎng)站,無(wú)時(shí)無(wú)刻不在點(diǎn)擊鏈接,我們點(diǎn)擊鏈接想要產(chǎn)生的結(jié)果是去訪問(wèn)我們想要去的URL地址,用戶的正常點(diǎn)擊只會(huì)產(chǎn)生兩個(gè)結(jié)果,打開(kāi)新窗口或者當(dāng)前窗口轉(zhuǎn)跳,試想一下你在SNS網(wǎng)站、電子商務(wù)網(wǎng)站、BLOG、論壇里點(diǎn)擊一個(gè)正常的鏈接后,打開(kāi)了一個(gè)“無(wú)害”的網(wǎng)頁(yè),原本瀏覽的信任網(wǎng)頁(yè)卻已經(jīng)被悄悄替換了,大家可以聯(lián)想一下會(huì)產(chǎn)生什么可怕的后果。
下面我寫(xiě)了一個(gè)劫持瀏覽器的小Demo,思路是獲取REFERER后生成鏡像頁(yè)面,同時(shí)加入我們的劫持腳本。比如把這個(gè)hjk_ref.php丟到本地服務(wù)器上測(cè)試,將http://127.0.0.1/hjk_ref.php這樣的鏈接發(fā)到任意一個(gè)網(wǎng)站上,點(diǎn)擊鏈接打開(kāi)新窗口,當(dāng)所有的注意力都停滯在新窗口的時(shí)候,3秒后一個(gè)鏡像頁(yè)面將會(huì)悄悄替換鏈接所在頁(yè)。按照類(lèi)似的思路,發(fā)揮跨站師的想象力,可以做更多的事情,所有的一切僅僅是因?yàn)辄c(diǎn)擊了一個(gè)鏈接。
注:各大主流瀏覽器僅opera和internet explorer 8不存在窗口引用漏洞。
六、利用XSS漏洞劫持瀏覽器
延續(xù)第四部分的思路,這部分將進(jìn)入本文的一個(gè)重要環(huán)節(jié).跨站師們都知道XSS漏洞分為持久和非持久兩種,這兩種類(lèi)型的漏洞無(wú)論怎么利用都無(wú)法跳出窗口的生命周期,窗口關(guān)閉后XSS漏洞的效果也就完全消失,窗口的限制一直束縛著跨站師們的發(fā)揮,我這里將和大家一起討論跨站師的終極技巧:
6.1 正向跨窗口劫持
大家可以先試驗(yàn)下hijack_open.js這個(gè)腳本,比如打開(kāi)http://bbs.dvbbs.net/動(dòng)網(wǎng)論壇主頁(yè),我們?cè)诘刂窓诶飶?fù)制下面的代碼使用偽協(xié)議注入hijack_open腳本,然后整個(gè)頁(yè)面的鏈接就都被劫持住了,點(diǎn)擊論壇里的任意一個(gè)鏈接,打開(kāi)的新窗口都會(huì)被注入了一個(gè)alert對(duì)話框腳本。
6.2 反向跨窗口劫持
同樣我們也可以在動(dòng)網(wǎng)論壇試驗(yàn),新打開(kāi)任意一個(gè)版塊的窗口,在地址欄里復(fù)制下面的代碼使用偽協(xié)議注入hijack_opener腳本,我們會(huì)發(fā)現(xiàn)原來(lái)的頁(yè)面被反向注入了一個(gè)alert對(duì)話框腳本。
6.3 極度危險(xiǎn)的跨框架窗口引用劫持
在vul參數(shù)中寫(xiě)入下面的hijack_frame_opener腳本,跨站師就可以反向跨框架引用窗口注入腳本。
6.4 極度危險(xiǎn)的正反向跨窗口遞歸劫持
luoluo建議我加上了這一部分,窗口之間的引用關(guān)系可能是復(fù)雜的,我們可以通過(guò)window的opener屬性鏈反向遞歸查找窗口注入XSS腳本,將互相引用過(guò)的同域窗口全部劫持,并通過(guò)異常處理規(guī)避之間跨域頁(yè)面的訪問(wèn)異常,代碼如下:
假設(shè)頁(yè)面打開(kāi)序列有A域->B域->A域的情況,通過(guò)對(duì)第二個(gè)A域頁(yè)面的反向遞歸劫持則可以劫持B域之前的A域頁(yè)面,從而實(shí)現(xiàn)“隔空打擊”。
同理,正向跨窗口劫持也可以實(shí)現(xiàn)遞歸劫持所有同域的鏈接,對(duì)每個(gè)打開(kāi)的被劫持的頁(yè)面執(zhí)行和第一個(gè)頁(yè)面一樣的劫持腳本,但是正向遞歸沒(méi)法實(shí)現(xiàn)反向遞歸的那種“隔空打擊”。
結(jié)合正向和反向的鏈?zhǔn)竭f歸劫持,最終我們可以劫持所有的同域頁(yè)面。
6.5 完全控制瀏覽器
一個(gè)跨站腳本漏洞的真正意義在程序員的角度是輸入和輸出問(wèn)題,而在跨站師的角度則是能夠進(jìn)入同源策略了,可以擺脫同源策略的束縛做任何想做的事情??缯編焸兛梢岳肵SS漏洞在同源策略允許的范圍內(nèi)再跨頁(yè)面注入腳本,可以不再為窗口關(guān)閉后XSS漏洞的效果消失而煩惱,劫持窗口后的跨站師們可以任意發(fā)揮,劫持表單,劫持請(qǐng)求,劫持輸入等等,我就不再列舉實(shí)例。無(wú)論是持久型還是非持久型的XSS漏洞都是能夠發(fā)揮最大的威力的,最后實(shí)現(xiàn)跨站師的終極目標(biāo)-完全控制瀏覽器。
七、后記
文章涉及的安全技術(shù)全部都是純研究性質(zhì),請(qǐng)不要將這些技術(shù)使用在非法途徑上。安全與應(yīng)用永遠(yuǎn)是一個(gè)矛盾體,通往安全的路永遠(yuǎn)不止一條。感謝對(duì)這篇文檔的思路和技術(shù)給予過(guò)幫助的luoluo、cnqing、linx以及80Sec團(tuán)隊(duì)的所有成員。
八、參考
1.http://en.wikipedia.org/wiki/Same_origin_policy
2.http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_DOM_access
3.http://www.w3.org/TR/Window/
4.http://img.hexun.com/2009-05-07/117458375.txt
5.http://www.80sec.com/all-browser-security-alert.html
6.http://www.80sec.com/ms08-058-attacks-google.html