菜单

XML 外部实体 (XXE) 注入

相关源文件

XML 外部实体 (XXE) 注入是一种 Web 安全漏洞,当应用程序在未正确禁用外部实体引用时解析来自不受信任源的 XML 输入时发生。此漏洞允许攻击者访问服务器端文件、执行服务器端请求伪造 (SSRF),并在某些情况下执行远程代码或发起拒绝服务攻击。

有关 XML 处理相关的漏洞,请参阅 XSLT 注入

XXE 漏洞的工作原理

XML 解析器可以处理在 XML 文档的文档类型定义 (DTD) 部分中定义的外部实体引用。当应用程序接受 XML 输入并使用易受攻击的解析器配置对其进行处理时,攻击者可以利用此功能。

来源:XXE Injection/README.md3-4 XXE Injection/README.md43-57

XXE 漏洞类型

XXE 漏洞可以根据应用程序的行为以不同的方式利用

类型描述用例示例
经典 XXE直接检索文件内容读取 /etc/passwd 或其他敏感文件
基于错误的 XXE通过错误消息提取数据在无法直接输出时泄露数据
盲注 XXE带外数据渗漏在没有反射输出时提取数据
DoS XXE导致资源耗尽十亿乐(Billion Laughs)或二次方爆炸攻击

来源:XXE Injection/README.md71-102 XXE Injection/README.md164-178

检测 XXE 漏洞

要检测应用程序是否易受 XXE 攻击,您可以提交一个基本的实体测试

这会测试应用程序是否处理外部实体并在响应中显示其内容。

来源:XXE Injection/README.md50-70

利用 XXE 检索文件

经典 XXE

来源:XXE Injection/README.md77-102

Base64 编码的 XXE

当直接检索可能会被过滤或编码不当时

来源:XXE Injection/README.md111-115

PHP 包装器位于 XXE 内

对于 PHP 应用程序,可以使用过滤器包装器来读取源代码

来源:XXE Injection/README.md117-130

XInclude 攻击

当无法修改 DOCTYPE 元素时

来源:XXE Injection/README.md132-148

利用 XXE 进行 SSRF 攻击

XXE 可通过让服务器访问内部资源来执行服务器端请求伪造

来源:XXE Injection/README.md150-162

利用 XXE 进行拒绝服务

十亿乐攻击

此攻击创建嵌套实体,这些实体会指数级扩展,可能耗尽服务器内存。

来源:XXE Injection/README.md164-178

其他 DoS 技术

  • YAML 攻击
  • 参数乐攻击

来源:XXE Injection/README.md179-207

利用基于错误的 XXE

基于错误的 XXE 在无法直接输出时使用错误消息来提取数据。

使用本地 DTD 文件

此技术利用本地 DTD 文件将敏感文件包含在错误消息中。

来源:XXE Injection/README.md209-255

利用盲注 XXE

当无法看到直接输出时,可以通过带外技术渗漏数据。

基本盲注 XXE

使用远程回调测试盲注 XXE

来源:XXE Injection/README.md335-347

带外 XXE

此技术将文件内容发送到攻击者控制的服务器。

来源:XXE Injection/README.md367-380

WAF 绕过技术

字符编码绕过

XML 解析器使用各种方法来检测编码

  • HTTP Content-Type 标头
  • 字节顺序标记 (BOM)
  • 文档的开头符号
  • XML 声明

将载荷转换为不同的编码可以绕过 WAF 过滤器

来源:XXE Injection/README.md422-446

JSON 端点中的 XXE

尝试将 Content-Type 从 JSON 切换到 XML

内容类型数据
application/json{"search":"name","value":"test"}
application/xml<?xml version="1.0" encoding="UTF-8" ?><root><search>name</search><value>data</value></root>

来源:XXE Injection/README.md447-466

各种文件格式中的 XXE

XXE 漏洞可能存在于内部使用 XML 的各种文件格式中。

SVG 中的 XXE

来源:XXE Injection/README.md470-486

SOAP 中的 XXE

来源:XXE Injection/README.md521-529

文档文件中的 XXE

Office 文档(DOCX、XLSX)是包含可被利用的 XML 文件的 ZIP 存档

  1. 使用 7z x -oXXE xxe.docx 提取
  2. 修改 XML 文件以包含 XXE 载荷
  3. 使用 zip -r -u ../xxe.docx * 重新打包

来源:XXE Injection/README.md531-587 XXE Injection/README.md589-616

防御机制

为防止 XXE 漏洞

  1. 禁用 XML 解析器中的外部实体和 DTD 处理
  2. 尽可能使用更简单的数据格式,如 JSON
  3. 对 XML 内容应用适当的输入验证
  4. 保持 XML 处理库更新
  5. 实现安全标头和内容安全策略

不同语言的安全配置示例

语言安全配置
PHPlibxml_disable_entity_loader(true)
Javafactory.setFeature("https://apache.ac.cn/xml/features/disallow-doctype-decl", true)
Python使用 defusedxml
.NETXmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit

来源:XXE Injection/README.md41-49

XXE 利用工具

一些工具可以帮助进行 XXE 利用

  • staaldraad/xxeftp:一个带有 FTP 支持的迷你 Web 服务器,用于 XXE 载荷
  • lc/230-OOB:一个用于文件内容检索的带外 XXE 服务器
  • enjoiz/XXEinjector:自动 XXE 漏洞利用
  • BuffaloWill/oxml_xxe:将 XXE 漏洞嵌入到不同的文件类型中
  • bytehope/wwe:在 PHP 中以最少的标志演示 XXE

来源:XXE Injection/README.md41-49

结论

XML 外部实体 (XXE) 注入对于处理 XML 输入的应用程序来说仍然是一个重大的安全风险。了解各种利用技术并实施适当的防御措施对于保护应用程序免受这些攻击至关重要。

通过禁用外部实体处理并保持 XML 解析器更新,开发人员可以有效地减轻其应用程序中 XXE 漏洞的风险。