如何使用瀏覽器功能來幫助查找DOM XSS

  翻譯文章,原文:How to use browser features to help find DOM XSS.[1]

Gmail隱藏的消息

去年,我在Gmail網站上查找了DOM XSS。我決定不使用url參數或電子郵件本身作為攻擊的源頭,而是決定使用更謹慎但無處不在的postMessage api[2]。乍一看,Gmail收件箱似乎是一個簡單的網頁,但是,如果您看一眼,它實際上是相互之間可以交流的十幾個不同的網頁(或iframe)。


如何使用瀏覽器功能來幫助查找DOM XSS


我的首要任務是使跨框架消息可見。這不是DevTools中的本機功能。相反,您可以使用此簡單的postMessage logger擴展[3]。重新加載後,控制檯頻繁的一幀一幀地來回發送消息。


如何使用瀏覽器功能來幫助查找DOM XSS


<code>每個消息都有一個目標(接收消息的框架),一個源(發送該消息的框架),一個源(源的域)和數據,它們可以是字符串或JSON對象(或任何其他對象)在該過程中將被克隆的對象的種類)。如果源使用window.opener,window.open()和window.frames,則消息可以通過任何框架發送到另一個框架,甚至可以從不同的域甚至從不同的選項卡發送。/<code>

目標使用以下方式接受消息:

<code>addEventListener("message", function(message){/* handle message here */})/<code>

就像在擴展名中一樣。

如果消息太多,則可以自定義擴展名以按消息的任何屬性過濾消息。我一直在尋找有趣的消息,特別是一條消息在數據中包含一個url:


如何使用瀏覽器功能來幫助查找DOM XSS


此消息是由“ hangouts.google.com”發送到“ mail.google.com”的。消息數據中不僅有URL,而且URL中包含單詞“ frame”。有趣…

瀏覽器工具箱

我轉到了DevTools的網絡標籤,並按“ doc”類型過濾了請求,即“ top window url and iframes src”。相同的URL:


如何使用瀏覽器功能來幫助查找DOM XSS


我還可以確認請求來源為 “mail.google.com”,這是一個好兆頭,因為它是接收郵件的域。紅色圓圈中的值是請求的發起者,即加載iframe的JS代碼。您可以單擊它,它直接將您帶到源選項卡中的相應代碼。取消壓縮代碼,設置斷點,重新加載,然後觸發斷點:


如何使用瀏覽器功能來幫助查找DOM XSS


瞧!觸發請求的函數是appendChild()。這幾乎是我們從不可讀的代碼中可以理解的所有內容。但是藉助調試器,我們可以確認參數包含一個src設置為url的iframe。如果單擊右側“調用堆棧”中的功能,則可以瀏覽程序的“控制流”並瞭解其邏輯。

例如,以下是框架接收消息的方式:


如何使用瀏覽器功能來幫助查找DOM XSS


您甚至可以看到消息來源發送的代碼:


如何使用瀏覽器功能來幫助查找DOM XSS


<code>跨多個文件和數千行代碼,在偵聽器和URL加載之間有許多功能。當您調試如此繁重的網頁時,瀏覽器凍結,中斷或跳過斷點的情況並不少見,這是反覆試驗的問題!/<code>

我嘗試使用數據“javascript:alert(1)”而不是url從控制檯向框架發送一條消息。我沒有警報框,但收到了CSP(內容安全策略)錯誤消息。


如何使用瀏覽器功能來幫助查找DOM XSS


值得慶幸的是,當時IE11和Edge並沒有實施此CSP規則,因此我能夠在這些瀏覽器上觸發警報框。沒有檢查郵件的來源。一個簡單的攻擊情形是從攻擊者網頁開始,打開Gmail的新標籤,然後使用postMessage將有效負載注入Gmail標籤。Gmail標籤會加載javascript iframe,並且攻擊者可以在受害者的Gmail頁面上執行任意代碼,這意味著它可以讀取和發送電子郵件,更改在此電子郵件中註冊的帳戶的密碼等…

隨機通道名稱

仍然存在一個問題:在這麼多的幀之間進行如此多的通信,很容易造成混淆,因此消息通常具有一個通道名稱。名稱是由“mail.google.com”生成的隨機6個字符,並在第一條消息中傳輸到“hangouts.google.com”。在收到的所有後續郵件中,“hangouts.google.com”會檢查其是否包含正確的通道名稱,如果不正確,則不會處理該郵件。

攻擊者不知道頻道名稱,因此6個字母數字數字可能無法嘗試全部使用。隨機生成器是“Math.random()”,它不安全,過去曾被Google工程師在Facebook中找到XSS漏洞[4]!但是,該技術要求隨機生成器的狀態在跨域選項卡之間共享,現在不再如此。第三種解決方案是在Gmail標籤中的框架層次結構中加載由攻擊者控制的iframe。由於iframe的跨域重定向在瀏覽器中的工作方式,Gmail X-Frame-Options標頭為“SAMEORIGIN”,並且郵件是使用參數targetOrigin “*” 發送的,因此可以攔截通道名稱並執行XSS。

總結

我找不到在Gmail中加載iframe的簡便方法,但是有了這一切,我很有信心將報告發送到Google VRP,幾天後,我收到了“不錯的答案”答案和獎勵。Google通過添加對包含url的郵件的來源的檢查來修復它。XSS不再起作用,但是如果您要驗證,該消息仍會發送。

References

[1] How to use browser features to help find DOM XSS.: https://opnsec.com/2020/05/dom-xss-in-gmail-with-a-little-help-from-chrome/

[2] postMessage api: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

[3] postMessage logger擴展: https://github.com/opnsec/postMessage-logger

[4] XSS漏洞: http://ifsec.blogspot.com/2012/09/of-html5-security-cross-domain.html


分享到:


相關文章: