深入分析IE地址欄內(nèi)容泄露漏洞
前言
在本文中,我們探討的對(duì)象是IE瀏覽器,盡管該瀏覽器略顯老態(tài),但是其用戶還是很多的,所以不容忽視。我最近對(duì)MSRC感到很欣喜,因?yàn)樗麄冋趯⒐ぷ髦匦囊浦罞dge瀏覽器、設(shè)計(jì)漏洞,甚至提高了漏洞賞金,這看起來(lái)確實(shí)不錯(cuò)。
所有這些都是好消息,但我仍然認(rèn)為現(xiàn)在就急著拋棄IE還為時(shí)尚早。例如,現(xiàn)在所有的IE用戶在zombie腳本漏洞(已經(jīng)公開(kāi)數(shù)月,但是仍然尚未得到修補(bǔ))面前都可能變成僵尸程序。千萬(wàn)不要忽視這個(gè)問(wèn)題的嚴(yán)重性,請(qǐng)想象一下攻擊者可以做什么:他們可以一直潛伏在你的瀏覽器中,當(dāng)你瀏覽其他網(wǎng)站的時(shí)候,他們就有足夠的時(shí)間做一些見(jiàn)不得光的事情,比如挖掘數(shù)字貨幣等。此外,IE的阻止彈出窗口功能已經(jīng)被完全攻陷了,但是好像并沒(méi)有引起人們的注意??傊?,我認(rèn)為這些漏洞應(yīng)該得到修補(bǔ),或至少給IE用戶一個(gè)醒目的警告,比如“我們不再支持這個(gè)瀏覽器,請(qǐng)使用Microsoft Edge”。
在我看來(lái),微軟正在試圖擺脫IE,這個(gè)毫無(wú)疑問(wèn)。不過(guò),如果直接告訴用戶他們的舊版瀏覽器沒(méi)有像Edge那樣得到足夠的維護(hù)會(huì)顯得更誠(chéng)實(shí)一些。根據(jù)Netmarketshare的統(tǒng)計(jì)顯示,IE仍比Edge更受歡迎,兩者用戶之比是17% vs 6%。
我堅(jiān)信在安全方面IE應(yīng)該像Edge那樣得到同等的對(duì)待,否則就應(yīng)該完全放棄它。但是不管未來(lái)怎樣,我們現(xiàn)在先來(lái)探討一下IE上的另一個(gè)漏洞:允許攻擊者知道用戶將要瀏覽的地址。什么,這是讀心術(shù)嗎?不,當(dāng)然不是,下面讓我們來(lái)看看IE是如何讓攻擊者做出魔幻般的事情的。
摘要
當(dāng)腳本在object-html標(biāo)簽內(nèi)執(zhí)行時(shí),位置對(duì)象將獲得焦點(diǎn)并返回主位置,而不是它自己的位置。 確切地說(shuō),它將返回寫入地址欄中的文本。如果讀者是急性子的話,可以先觀看視頻,了解一下攻擊者是如何讀取用戶輸入到IE地址欄內(nèi)的內(nèi)容的!
對(duì)象和文檔模式
對(duì)象標(biāo)簽的行為方式取決于documentMode的渲染方式。 例如,如果我們?cè)陧?yè)面的開(kāi)頭添加兼容性元標(biāo)記的話,它的外觀和行為就像一個(gè)iframe,但它會(huì)認(rèn)為這是一個(gè)頂層窗口。
- <head>
- <!-- COMPATIBILITY META TAG -->
- <meta http-equiv="X-UA-Compatible" content="IE=8" />
- </head>
- <object data="obj.html" type="text/html"></object>
- <head>
- <!-- COMPATIBILITY META TAG -->
- <meta http-equiv="X-UA-Compatible" content="IE=8" />
- </head>
- <object data="obj.html" type="text/html"></object>
在上面的代碼中,“obj.html”在對(duì)象內(nèi)部進(jìn)行渲染,并且其內(nèi)容被放入與iframe類似的方框中,然而,雖然在窗口對(duì)象與頂層對(duì)象進(jìn)行比較時(shí)返回值為true,但是它并非頂層窗口。我們可以看一下在對(duì)象標(biāo)簽內(nèi)執(zhí)行的代碼:雖然它認(rèn)為window == top,但是事實(shí)并非如此。
在IE上進(jìn)行測(cè)試
我們的對(duì)象認(rèn)為它是頂層窗口,甚至其他frameElement之類的成員也總是返回null——這種行為只出現(xiàn)在(IE的)頂層窗口中。
下面,讓我們嘗試相同的代碼在沒(méi)有兼容性標(biāo)簽的情況下會(huì)怎樣。這時(shí),該對(duì)象就能了解它所在的位置了,并且其行為類似于iframe。
在IE上進(jìn)行測(cè)試
本質(zhì)上,該對(duì)象在較舊的文檔模式中被渲染為一個(gè)獨(dú)立的實(shí)體,但在一個(gè)較新的文檔模式中將被渲染為一個(gè)iframe。無(wú)論如何,在內(nèi)部它們都是WebBrowser控件,所以Trident引擎會(huì)暴露相同的成員。
繼承的窗口成員
讓我們重新回到較舊的documentMode,尋找一種利用這個(gè)混淆漏洞的方法,不過(guò)事情貌似并不那么糟糕,因?yàn)榭缬蛳拗迫匀淮嬖?,而且X-FRAME-OPTIONS頭部的工作效果非常好。 有一些成員,如window.name,它們是通過(guò)對(duì)象繼承得到的(該對(duì)象會(huì)繼承其父對(duì)象的名稱),不過(guò)這也不是太糟糕——但是某些廣告技術(shù)會(huì)全地使用window.name來(lái)跨iframe傳遞信息,這種做法是很危險(xiǎn)的。
話雖如此,至少有一個(gè)繼承的對(duì)象真的會(huì)引起麻煩:位置。在對(duì)象標(biāo)簽內(nèi),location.href將返回主(頂層)窗口的位置。下面的代碼將其對(duì)象的源指向object_location.html,但是當(dāng)我們檢索它的位置時(shí),它返回的是頂層窗口。
在IE上進(jìn)行測(cè)試
再次重申,這個(gè)混淆漏洞本身是沒(méi)有用的,因?yàn)槲覀內(nèi)匀辉谕粋€(gè)域。即使我們可以找到一個(gè)頂層的位置,只要我們?cè)谕粋€(gè)域,那也沒(méi)有多大意思。為此,我嘗試改變對(duì)象的位置,但沒(méi)有成功。如果你想在這個(gè)領(lǐng)域進(jìn)行研究,我建議可以更深入一些,因?yàn)槲艺J(rèn)為會(huì)有更多的可能性。無(wú)論如何,在嘗試實(shí)現(xiàn)UXSS(持久性是現(xiàn)實(shí)攻擊中一切的關(guān)鍵)時(shí),我獲得了一個(gè)驚喜:當(dāng)對(duì)象被注入到onbeforeunload時(shí),我們得到的不再是頂層窗口的位置,而是瀏覽器的將要到達(dá)的位置或當(dāng)前寫入地址欄的內(nèi)容。
換句話說(shuō),如果我們?cè)谟脩綦x開(kāi)主頁(yè)面的同時(shí)檢索對(duì)象的location.href,我們將能夠知道她在地址欄中輸入的內(nèi)容,或者如果點(diǎn)擊鏈接,我們將會(huì)獲悉瀏覽器要鏈接的地址。
這里,我們只是中斷新站點(diǎn)的加載并展示用戶的URL。當(dāng)然,如果是攻擊者的話,他們會(huì)直接回填地址并加載站點(diǎn),并且這一切對(duì)于用戶來(lái)說(shuō)都是透明的。實(shí)際上,在用戶離開(kāi)時(shí),我們直接執(zhí)行document.write就行了。
- window.onbeforeunload = function()
- {
- document.write('<object data="loc.html" type="text/html" width="800" height="300"></object>');
- document.close();
- }
- window.onbeforeunload = function()
- {
- document.write('<object data="loc.html" type="text/html" width="800" height="300"></object>');
- document.close();
- }
并在那個(gè)恰當(dāng)?shù)臅r(shí)刻讀取位置(onbeforeunload)。
- document.write("Let me read your mind. You wanted to go here: " + location.href +);
好了,現(xiàn)在我們就能在用戶離開(kāi)時(shí)獲取對(duì)象位置,從而確切地知道她在地址欄中輸入的內(nèi)容。當(dāng)然,它不一定是一個(gè)完整的URL,例如,如果用戶在地址欄中輸入單詞,它將自動(dòng)被轉(zhuǎn)換為搜索查詢URL(IE默認(rèn)為Bing),這當(dāng)然可以被完整讀取!
在IE上進(jìn)行測(cè)試