SOAP 协议中的 XML 外部实体注入(XXE)漏洞

引言

在 Web 开发的演进历程中,SOAP (Simple Object Access Protocol) 曾是企业级服务和分布式系统的核心协议。尽管 RESTful API 在当今的互联网应用中占据主导地位,但在金融、电信和遗留的企业资源规划(ERP)系统中,基于 XML 的 SOAP 协议依然被广泛使用。然而,正是这种对 XML 强依赖的特性,为安全领域中极具破坏性的漏洞------XML 外部实体注入(XXE, XML External Entity Injection)提供了温床。

本文将探讨 SOAP 协议中 XXE 漏洞的原理、攻击向量、现实场景中的变体(如 MTOM/XOP)以及全方位的防御策略。


一、 SOAP 协议与 XML 解析基础

1.1 SOAP 的结构

SOAP 是一种基于 XML 的通信协议,其标准结构由以下部分组成:

  • Envelope (信封):定义了 XML 文档是一个 SOAP 消息。
  • Header (消息头):包含可选的元数据(如身份验证、事务处理)。
  • Body (消息体):包含实际的调用请求或响应数据。
1.2 XML 解析与实体(Entities)

XML 规范允许定义"实体",类似于编程语言中的变量。实体分为:

  • 内部实体:在 DTD(文档类型定义)中定义并在文档中引用。
  • 外部实体 :通过 URI(通常是 file://http://)指向外部资源。

当 XML 解析器(如 Java 的 DocumentBuilder 或 PHP 的 SimpleXML)配置不当,允许解析外部实体时,XXE 漏洞便产生了。


二、 SOAP XXE 漏洞的攻击原理

在 SOAP 请求中,攻击者可以篡改 HTTP 请求的 Body,在 Envelope 标签之前或之内注入恶意 DTD。

2.1 基础文件读取

这是最常见的攻击形式。攻击者定义一个外部实体指向服务器上的敏感文件(如 /etc/passwd),然后在 SOAP 消息的某个参数字段中引用该实体。

恶意请求示例:

xml 复制代码
POST /services/OrderService HTTP/1.1
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getOrder>
      <orderId>&xxe;</orderId>
    </getOrder>
  </soap:Body>
</soap:Envelope>

如果服务器配置脆弱,它会解析 &xxe; 并将其内容替换为 /etc/passwd 的文本,最终在响应包中回显给攻击者。

2.2 带外数据提取 (OOB XXE)

当服务器不直接在响应中回显数据(即"盲"XXE)时,攻击者可以利用外部 DTD。

攻击者会让受害者服务器向攻击者控制的服务器发起请求,并将读取到的文件内容通过 URL 参数发送出去:

  1. 加载攻击者托管的 .dtd 文件。
  2. 受害者读取文件。
  3. 受害者将内容发送给攻击者的 Web 日志。

三、 高级变体:XOP/MTOM 注入

在现代 SOAP 框架(如 Apache CXF, Axis2)中,为了优化大文件传输(如图片、PDF),引入了 MTOM (Message Transmission Optimization Mechanism)XOP (XML-binary Optimized Packaging)

devarea.htb 靶机的题目,这种机制可以通过 multipart/related 内容类型绕过基础的 WAF 过滤。

3.1 攻击逻辑

传统的 XXE 拦截器可能只寻找 <!ENTITY 关键词。但 XOP 注入利用了 <xop:Include> 标签的 href 属性。

  • 协议混淆 :通过设置 Content-Type: multipart/related,攻击者可以将主 XML 与"附件"分离。
  • 资源引用 :在 XML 内部使用 href="file:///etc/systemd/system/hoverfly.service"

这种方式的隐蔽性极高,因为它利用了协议合法的特性来执行非法的操作。


四、 漏洞的影响与危害

  1. 敏感信息泄露 :读取服务器配置文件、源代码、凭据(如 .ssh/id_rsa)或云服务元数据(AWS 169.254.164.254)。
  2. 服务端请求伪造 (SSRF):利用服务器作为跳板,攻击内网其他不向公网开放的 API。
  3. 拒绝服务 (DoS):通过"XML 炸弹"(Billion Laughs Attack),利用实体的递归引用耗尽服务器内存。
  4. 执行远程代码 (RCE) :在极少数情况下,如果服务器安装了特定的 PHP 扩展(如 expect://),XXE 可以直接导致代码执行。

五、 深度防御策略

防御 XXE 漏洞的核心在于正确配置 XML 解析器,遵循"默认拒绝"原则。

5.1 解析器安全配置 (以 Java 为例)

在处理 SOAP 消息前,应显式禁用外部实体解析:

java 复制代码
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 禁用外部实体 (XXE)
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// 禁用 DTD
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
5.2 框架层面的防御
  • Apache CXF : 确保升级到最新版本,并检查 org.apache.cxf.stax.allowEntities 属性是否设置为 false
  • 禁用不必要的协议:如果不需要文件上传功能,应禁用 MTOM/XOP 支持。
5.3 架构与网络层面的加固
  • 使用 WAF:部署 Web 应用防火墙,识别并拦截包含 DTD 声明或敏感协议(file://, gopher://)的 XML 请求。
  • 最小权限原则 :运行 Web 服务的系统用户应处于 chroot 环境中,或至少无权读取系统敏感目录(如 /etc/systemd/, /root/)。
  • 输出脱敏:避免将详细的解析错误回显给用户,防止报错注入。

六、 总结

SOAP XXE 漏洞虽然是"老面孔",但在复杂的现代网络架构中,由于协议嵌套(如 MTOM)和开发框架的配置复杂性,它依然具有极高的实战价值。

安全开发者和审计人员不应仅仅寻找 DTD 标签,还应关注 XOP 引用、外部架构定义(XSD)以及各种解析器的边界情况。通过关闭外部实体加载、严格的输入验证以及多层防御体系,我们才能在享受 XML 强大扩展性的同时,确保系统的安全性。

相关推荐
Dxy12393102162 小时前
Python如何对XML进行格式化
xml·python
一名优秀的码农3 小时前
vulhub系列-64-Cereal: 1(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
一名优秀的码农3 小时前
vulhub系列-66-Hms?: 1(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
CHICX12293 小时前
5.SQL 注入之高权限注入(下):文件读写 + 写 Shell,从数据库权限到服务器控制权
web安全·网络安全
Sombra_Olivia3 小时前
Vulhub 中的 bash CVE-2014-6271
安全·web安全·网络安全·渗透测试·vulhub
CHICX12293 小时前
6.SQL 注入之基础防御:从魔术引号到类型校验,彻底封堵注入漏洞
web安全·网络安全
路baby3 小时前
Pikachu安装过程中常见问题(apache和MySQL无法正常启动)
计算机网络·mysql·网络安全·adb·靶场·apache·pikachu
以太浮标3 小时前
华为eNSP模拟器综合实验之- 华为USG6000V防火墙配置防御DoS攻击实战案例解析
运维·网络协议·网络安全·华为·信息与通信
网络安全许木3 小时前
自学渗透测试第八天(网络安全法、伦理规范与工具链联动)
windows·web安全·网络安全·渗透测试·kali linux