本文僅用于技術研究,禁止用于非法用途。
Author:枷鎖
文章目錄
- 一、XML基礎
- 1. 什么是XML?
- 2. XML語法規則
- 3. 數據類型
- 二、DTD
- 1. 認識DTD
- 2. 聲明DTD
- 3. DTD實體
- 4. 如何防御XXE攻擊?
- 5. 總結
一、XML基礎
1. 什么是XML?
XML : 可擴展標記語言(Extensible Markup Language)是一種用于??結構化存儲和傳輸數據??的文本格式標記語言。XML用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
XML 就是讓你用自己定義的標簽(比如 <價格>3999</價格>)把數據包成純文本,讓不同系統和軟件都能讀懂的一種通用數據格式。
作用:XML的設計宗旨是傳輸數據,不是顯示數據。XML在web中的應用已十分廣泛。XML是各種應用程序之間數據傳輸最常用的格式。與HTML的區別在于一個被設計用來展示數據,一個用來傳輸數據。
特點 :
- XML 的設計宗旨是傳輸數據,而非顯示數據;
- XML 標簽沒有被預定義,需要自行定義標簽;
- XML 被設計為具有自我描述性;
- XML 是 W3C 的推薦標準。
與 HTML 相比:
- HTML 用于定義數據的展示,專注于它應該是什么樣子;XML 用于傳輸和存儲數據。
- 都是用標簽組織文本內容,但是XML沒有預定義的標簽。
XML文檔結構包括XML聲明(可選)、DTD文檔類型定義(可選)、文檔元素。下面是一個XML文檔實例:
<?xml version="1.0" encoding="UTF-8"?> <!--XML 聲明-->
<girls><girl><hair>短頭發</hair><eye>大眼睛</eye><face>可愛的臉龐</face><summary age="23">我最愛的女孩</summary></girl>
</girls>
說明:
- 第一行是 XML 聲明。它定義 XML 的版本(1.0)和所使用的編碼(UTF-8)。
- XML注釋:。
- 第二行是文檔的根元素(girls)。
- 后面就是子元素以及元素結尾。
- 整個XML是一種樹形結構(根節點,子節點)。
元素:XML 元素指的是從開始標簽直到結束標簽的部分(包括標簽)。一個元素可以包含: - 其他元素(子元素)
- 文本
- 屬性
2. XML語法規則
- XML 聲明文件是可選部分,如果存在需要放在文檔的第一行。
- XML 必須包含根元素,它是所有其他元素的父元素。上文中的girls就是根元素。
(1) 所有 XML 元素都必須有關閉標簽(成雙成對出現)
在 XML 中,省略關閉標簽是非法的。所有元素都必須有關閉標簽:
<p>This is a paragraph</p>
<p>This is another paragraph</p>
注釋:XML 聲明沒有關閉標簽。這不是錯誤。聲明不屬于XML本身的組成部分。它不是 XML 元素,也不需要關閉標簽。
(2) XML 標簽對大小寫敏感
XML 標簽對大小寫敏感。在 XML 中,標簽必須使用相同的大小寫來編寫打開標簽和關閉標簽:
<Message>這是錯誤的。</message>
<message>這是正確的。</message>
(3) XML 必須正確地嵌套
在 XML 中,所有元素都必須彼此正確地嵌套:
<b><i>This text is bold and italic</i></b>
(4) XML 的屬性值須加引號
與 HTML 類似,XML 也可擁有屬性(名稱/值的對)。
在 XML 中,XML 的屬性值須加引號。請研究下面的兩個 XML 文檔。第一個是錯誤的,第二個是正確的:
<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note>
<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note>
在第一個文檔中的錯誤是,note 元素中的 date 屬性沒有加引號。
3. 數據類型
主要有兩種數據類型:
- PCDATA:被解析的字符數據,其中的標簽會被當作標記來處理,而實體會被展開。
- CDATA:不被解析的字符數據,其中的標簽不會被當作標記來對待,其中的實體也不會被展開。
二、DTD
1. 認識DTD
DTD(Document Type Definition)文檔類型定義。
DTD是用來控制文檔的一個格式規范的,由 XML 設計者或作者開發。
在DTD中定義了XML中存在什么標簽、擁有什么屬性、以及其它元素里面有什么元素等。
??DTD(文檔類型定義)是XML的“語法說明書”??,用來規定XML文檔里能寫哪些標簽、標簽怎么嵌套、哪些屬性必須填 —— 就像老師批改作文時用的《寫作格式要求》。
下面是一個DTD文檔的實例:
<!ELEMENT girls (girl)*>
<!ELEMENT girl (hair, eye, face, summary)>
<!ELEMENT hair (#PCDATA)>
<!ELEMENT eye (#PCDATA)>
<!ELEMENT face (#PCDATA)>
<!ELEMENT summary (#PCDATA)>
<!ATTLIST summary age CDATA "0">
說明:
- 第一行定義了girls元素,它可以有任意個girl子元素,其中型號(*)表示出現0次或者多次。
- 第二行定義了girl元素,它有4個子元素,并且在girl中必須且只能出現一次。
- 第三行定義了hair元素,該元素的數據類型為PCDATA。
- 第七行聲明了summary元素的age屬性,屬性類型是CDATA,默認值是“0”。
2. 聲明DTD
第一個例子中 XML 文檔并不包含標簽定義,它由我們第二個例子的 DTD 來完成。XML文檔要使用
DTD定義的標簽,就要先聲明DTD。DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
(1) 內部聲明DTD
- 內部聲明必須使用
<!DOCTYPE>
元素.
(2) 外部引用DTD
我們可以從外部的dtd文件中引用(這也是xxe漏洞產生的原因)。引用格式為:
<!DOCTYPE 根元素 SYSTEM "URL">
比如:
<?xml version="1.0" encoding="UTF-8"?> <!--XML 聲明-->
<!DOCTYPE girls SYSTEM "girls.dtd">
<girls><girl><hair>短頭發</hair><eye>大眼睛</eye><face>可愛的臉龐</face><summary age="23">我最愛的女孩</summary></girl>
</girls>
URL中常見的協議有:
3. DTD實體
實體(ENTITY):如果在 XML 文檔中需要頻繁使用某一條數據,我們可以預先給這個數據起一個別名
(類似于變量),即一個ENTITY,然后在文檔中調用它。
實體是用于定義引用普通文本或特殊字符的快捷方式的變量。
實體可以分為通用實體和參數實體,都可以內部聲明或者外部引用。
1. DTD實體是什么?
DTD實體(Entity) 是XML文檔中的一種“變量”或“占位符”,它允許你定義一個值(比如一段文本、一個文件內容、甚至一個網絡請求的結果),然后在XML文檔中通過 &實體名;
來引用它。
類比理解
- 就像編程里的變量:
XML里類似:author = "劉慈欣" # 定義變量 print(author) # 使用變量
<!ENTITY author "劉慈欣"> <!-- 定義實體 -->
最終解析時會變成:<作者>&author;</作者> <!-- 使用實體 -->
<作者>劉慈欣</作者>
2. DTD實體的分類
DTD實體主要分為 3種類型,每種有不同的用途:
(1)內部實體(存儲固定文本)
作用:定義一個固定的字符串,在XML里復用。
語法:
<!ENTITY 實體名 "文本內容">
示例:
<!ENTITY book_title "三體">
<!ENTITY book_author "劉慈欣">
XML調用:
<書><書名>&book_title;</書名><作者>&book_author;</作者>
</書>
解析后:
<書><書名>三體</書名><作者>劉慈欣</作者>
</書>
(2)外部實體(加載外部文件或URL)
作用:引用外部文件、網頁、甚至系統命令的結果。
語法:
<!ENTITY 實體名 SYSTEM "文件路徑或URL">
示例:
<!ENTITY secret_file SYSTEM "file:///etc/passwd"> <!-- 讀取Linux密碼文件 -->
<!ENTITY website SYSTEM "http://example.com/data.txt"> <!-- 加載網頁內容 -->
XML調用:
<數據>&secret_file;</數據>
解析后:
<數據>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...</數據>
?? 這是黑客攻擊的入口!(后面會講XXE漏洞)
(3)參數實體(DTD內部復用)
作用:在DTD內部定義可復用的規則(普通XML不能直接調用)。
語法:
<!ENTITY % 實體名 "DTD規則">
示例:
<!ENTITY % book_rule "書名, 作者, 價格">
<!ELEMENT 書籍 (%book_rule;)>
解析后:
<書籍><書名>三體</書名><作者>劉慈欣</作者><價格>59.9</價格>
</書籍>
3. DTD實體的安全風險(XXE漏洞)
XXE漏洞:
XXE(XML External Entity) 漏洞是指攻擊者利用 外部實體 加載惡意內容,比如:
- 讀取服務器上的敏感文件(
/etc/passwd
、C:\Windows\win.ini
) - 掃描內網服務(
http://192.168.1.1/admin
) - 發起SSRF攻擊(讓服務器訪問惡意網站)
攻擊示例
(1)讀取本地文件
<?xml version="1.0"?>
<!DOCTYPE hack [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>&xxe;</user>
服務器返回:
<user>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...</user>
(2)掃描內網
<!ENTITY xxe SYSTEM "http://192.168.1.1:8080/admin">
如果服務器返回數據,說明內網存在管理后臺。
(3)遠程代碼執行(某些環境下)
<!ENTITY xxe SYSTEM "expect://id">
可能返回當前用戶權限(uid=0(root)
)。
4. 如何防御XXE攻擊?
開發者應該怎么做?
-
禁用DTD和外部實體解析(最有效)
- Java示例:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
- PHP示例:
libxml_disable_entity_loader(true);
- Java示例:
-
輸入過濾
- 檢查XML是否包含
<!DOCTYPE
或<!ENTITY
。
- 檢查XML是否包含
-
使用JSON替代XML
- 現代API推薦用JSON(沒有實體解析風險)。
安全測試如何檢測XXE?
- 提交測試Payload:
<?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data>
- 觀察響應是否包含
/etc/passwd
的內容。
5. 總結
關鍵點 | 說明 |
---|---|
DTD實體是什么 | XML的“變量”,用于復用數據 |
內部實體 | 存儲固定文本,如 <!ENTITY name "Alice"> |
外部實體 | 加載文件/URL,黑客利用它讀文件(XXE漏洞) |
參數實體 | DTD內部復用規則,如 <!ENTITY % rule "a,b,c"> |
XXE漏洞 | 攻擊者通過外部實體讀取 /etc/passwd |
防御方法 | 禁用外部實體解析 + 輸入過濾 |
一句話記住DTD實體:
DTD實體是XML的變量,外部實體可能被黑客利用讀取服務器文件(XXE漏洞),必須禁用!
DTD實體是XXE漏洞的根源,安全開發必須禁用外部實體解析!
宇宙級免責聲明??
🚨 重要聲明:本文僅供合法授權下的安全研究與教育目的!🚨
1.合法授權:本文所述技術僅適用于已獲得明確書面授權的目標或自己的靶場內系統。未經授權的滲透測試、漏洞掃描或暴力破解行為均屬違法,可能導致法律后果(包括但不限于刑事指控、民事訴訟及巨額賠償)。
2.道德約束:黑客精神的核心是建設而非破壞。請確保你的行為符合道德規范,僅用于提升系統安全性,而非惡意入侵、數據竊取或服務干擾。
3.風險自擔:使用本文所述工具和技術時,你需自行承擔所有風險。作者及發布平臺不對任何濫用、誤用或由此引發的法律問題負責。
4.合規性:確保你的測試符合當地及國際法律法規(如《計算機欺詐與濫用法案》(CFAA)、《通用數據保護條例》(GDPR)等)。必要時,咨詢法律顧問。
5.最小影響原則:測試過程中應避免對目標系統造成破壞或服務中斷。建議在非生產環境或沙箱環境中進行演練。
6.數據保護:不得訪問、存儲或泄露任何未授權的用戶數據。如意外獲取敏感信息,應立即報告相關方并刪除。
7.免責范圍:作者、平臺及關聯方明確拒絕承擔因讀者行為導致的任何直接、間接、附帶或懲罰性損害責任。
🔐 安全研究的正確姿勢:
? 先授權,再測試
? 只針對自己擁有或有權測試的系統
? 發現漏洞后,及時報告并協助修復
? 尊重隱私,不越界
?? 警告:技術無善惡,人心有黑白。請明智選擇你的道路。
希望這個教程對你有所幫助!記得負責任地進行安全測試。