
寫在前面的話
早在2008年,Chris Evans就發(fā)現(xiàn)了通過在標(biāo)簽中添加惡意參數(shù)來跨域竊取Firefox數(shù)據(jù)的可能性。如果你感興趣的話,你現(xiàn)在仍然可以閱讀當(dāng)初他所發(fā)表的那篇研究報(bào)告【傳送門】。
他曾在報(bào)告中解釋稱:
現(xiàn)代Web模型對(duì)遠(yuǎn)程網(wǎng)站中標(biāo)簽內(nèi)的數(shù)據(jù)沒有任何的限制。如果目標(biāo)遠(yuǎn)程數(shù)據(jù)沒有必要在標(biāo)簽中出現(xiàn),那么你可能就會(huì)面臨著跨域數(shù)據(jù)泄漏的風(fēng)險(xiǎn)。
整個(gè)觀點(diǎn)的實(shí)現(xiàn)使用了JavaScript錯(cuò)誤信息和302重定向,一般來說,現(xiàn)代瀏覽器會(huì)使用類似“Script error”這樣的通用信息來替代原本復(fù)雜的JavaScript錯(cuò)誤信息,并以此來防止網(wǎng)站將錯(cuò)誤內(nèi)容泄露給遠(yuǎn)程域名。但對(duì)于同源網(wǎng)站來說,它們是可以讀取到詳細(xì)的JavaScript錯(cuò)誤信息的。
IE瀏覽器存在同樣的問題
通過研究和分析之后,我在IE瀏覽器上也發(fā)現(xiàn)了同樣的問題,但是這里有一個(gè)特殊的前提條件:加載的頁面(具體來說是一個(gè)標(biāo)簽頁-Tab)必須開啟頁面的開發(fā)者工具(Developers Tools)。
沒錯(cuò),這非常的奇怪,而且開發(fā)者工具沒有打開的話,我們就無法利用這個(gè)漏洞了。除此之外,還有下面這兩種限制條件:
(1)必須使用有效的JavaScript變量名;
(2)標(biāo)簽中的數(shù)據(jù)必須是有效的JavaScript代碼;
對(duì)攻擊者來說,最佳的錯(cuò)誤信息形式為“xxxis not defined”,它表示某個(gè)名稱并沒有與任何變量進(jìn)行綁定,此時(shí)你就可以跨域竊取這類單個(gè)單詞的數(shù)據(jù)了。但如果跨域數(shù)據(jù)為CSV,例如“a,b, c”,你仍可以通過遍歷的方式竊取到這三部分信息。
因此,只要我們能夠滿足上面這些前提條件,我們就能夠跨域竊取到任何CSV文件的內(nèi)容。實(shí)際上只要滿足了上述條件,除了CSV文件之外,幾乎任何類型的數(shù)據(jù)我們都可以竊取到。而且,如果目標(biāo)頁面沒有指定字符集(charset)的話,我們還可以使用不同的字符集來竊取數(shù)據(jù)。如果你對(duì)這部分內(nèi)容感興趣的話,可以參考Gareth的這篇技術(shù)報(bào)告【傳送門】。
由于ChirsEvan之前給出的PoC已經(jīng)無法使用了,所以我重新制作了一個(gè)PoC。訪問地址如下:
http://rootme.in/xssi?url=/redirect%3Furl%3Dhttp%3A%2f%2frequest.rootme.in%2ftoken.csv

感興趣的同學(xué)可以自己動(dòng)手嘗試一下,你可以替換鏈接中的參數(shù),比方說這樣:
http://rootme.in/xssi?url=http://example.com/user_info.js&eval=alert(email)
PoC演示視頻
下面是一個(gè)15秒的PoC演示視頻:
后話
我已經(jīng)將該問題上報(bào)給了微軟公司,但由于這項(xiàng)技術(shù)的實(shí)現(xiàn)前提是開啟開發(fā)者工具(或提前開啟),因此微軟方面不認(rèn)為這是一個(gè)非常嚴(yán)重的漏洞,不過他們表示很可能在將來的版本更新中解決這個(gè)問題。

下面這個(gè)PoC是針對(duì)微軟Edge瀏覽器的,如果你感興趣的話,可以自行查看:
http://blog.portswigger.net/2016/11/json-hijacking-for-modern-web.html
緩解方案
廣大開發(fā)人員以及網(wǎng)站管理員可以使用下列方法緩解這種安全風(fēng)險(xiǎn):
1. 使用POST方法;
2. 使用秘密令牌(CSRF);
3. 讓URL地址無法預(yù)測;
4. 對(duì)代碼中的引用進(jìn)行嚴(yán)格審查;
如果數(shù)據(jù)需要通過ajax請(qǐng)求來獲取,那么我們可以參考下面這兩種方案:
1. 使用類似for(;

這樣的Parser-Breaking語句;
2. 使用自定義的HTTP頭;
除此之外,我們也可以通過指定正確的Content-Type頭以及X-Content-Type-Options:nosniff來防止這種類型的攻擊。但是,對(duì)于那些不支持X-Content-Type-Options的瀏覽器來說,這種方法就不起作用了。
|