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

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

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

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