梦想家内容管理系统 Zip Slip Traversal Vulnerability
字数 1193 2025-08-09 17:09:26

梦想家内容管理系统 (Dreamer CMS) Zip Slip 目录遍历漏洞分析

漏洞概述

ZIP Slip 目录遍历漏洞是一种利用 ZIP 压缩包中特殊构造的文件路径,在解压时覆盖系统关键文件或写入恶意代码的安全漏洞。梦想家内容管理系统 (Dreamer CMS) 在主题文件解压处理过程中存在此漏洞。

漏洞原理

ZIP 目录遍历机制

  1. ZIP 压缩包格式允许包含 ../ 这样的相对路径字符串
  2. 攻击者可以构造包含多个 ../ 的文件路径,如 ../../../../../../../../../../../etc/hosts
  3. 当系统解压此类 ZIP 文件时,会跳转出当前工作目录,将文件解压到其他目录中

Java 实现细节

  1. Java 使用 ZipEntry 类的 getName() 方法获取 ZIP 条目名称
  2. 如果 ZIP 文件中包含 ../ 字符串,该方法会原样返回
  3. 如果未对返回值进行过滤,继续解压操作会导致文件被解压到非预期目录

风险示例

受影响系统

梦想家内容管理系统 (Dreamer CMS) 的风格设置功能:

  • 允许用户通过网络下载新主题
  • 主题文件实质为 ZIP 压缩包
  • 源码地址:https://gitee.com/isoftforce/dreamer_cms

漏洞验证步骤

  1. 使用 evilzip 工具构造恶意 ZIP 文件:
    • 工具地址:https://github.com/TheKingOfDuck/evilzip
  2. 上传构造的恶意 ZIP 文件
  3. 系统解压时会将文件写入预期外的目录

漏洞代码分析

主题文件处理流程:

  1. 从服务器下载 ZIP 格式的主题包
  2. 解压时未对 entry.getName() 返回的字符串进行 ../ 过滤

关键缺陷代码:

// 伪代码示例
ZipEntry entry = zipFile.getEntry("malicious/../../../../file.txt");
String name = entry.getName(); // 返回包含../的路径
File outputFile = new File(name); // 未做路径规范化处理
// 解压操作...

漏洞利用

利用方法

  1. 构造包含恶意文件的 ZIP 包:
    • 使用 evilzip 等工具生成
    • 设置恶意文件路径如 ../../../../path/to/vulnerable/location
  2. 上传恶意 ZIP 包
  3. 系统解压时会将文件写入非预期位置

实际攻击场景

  1. 写入计划任务实现持久化
  2. 写入 Webshell 实现任意代码执行
  3. 覆盖系统关键文件造成拒绝服务

利用示例

  1. 将编译好的 jar 包部署到目标系统
  2. 生成恶意 jar 包并上传
  3. 成功获取反弹 shell

修复建议

  1. ZipEntry.getName() 返回值进行规范化处理:
    String name = entry.getName();
    File outputFile = new File(targetDir, name).getCanonicalFile();
    
    if (!outputFile.getCanonicalPath().startsWith(targetDir.getCanonicalPath())) {
        throw new IOException("Entry is outside of the target dir: " + name);
    }
    
  2. 使用安全的解压库或方法
  3. 限制上传文件的类型和内容
  4. 对解压操作进行沙箱隔离

总结

ZIP Slip 漏洞是一种常见的文件处理漏洞,Dreamer CMS 由于未对 ZIP 文件中的路径进行安全检查,导致攻击者可以通过构造恶意 ZIP 文件实现目录遍历和任意文件写入。开发者应始终对用户提供的文件路径进行规范化验证,确保解压操作不会逃逸出目标目录。

梦想家内容管理系统 (Dreamer CMS) Zip Slip 目录遍历漏洞分析 漏洞概述 ZIP Slip 目录遍历漏洞是一种利用 ZIP 压缩包中特殊构造的文件路径,在解压时覆盖系统关键文件或写入恶意代码的安全漏洞。梦想家内容管理系统 (Dreamer CMS) 在主题文件解压处理过程中存在此漏洞。 漏洞原理 ZIP 目录遍历机制 ZIP 压缩包格式允许包含 ../ 这样的相对路径字符串 攻击者可以构造包含多个 ../ 的文件路径,如 ../../../../../../../../../../../etc/hosts 当系统解压此类 ZIP 文件时,会跳转出当前工作目录,将文件解压到其他目录中 Java 实现细节 Java 使用 ZipEntry 类的 getName() 方法获取 ZIP 条目名称 如果 ZIP 文件中包含 ../ 字符串,该方法会原样返回 如果未对返回值进行过滤,继续解压操作会导致文件被解压到非预期目录 风险示例 受影响系统 梦想家内容管理系统 (Dreamer CMS) 的风格设置功能: 允许用户通过网络下载新主题 主题文件实质为 ZIP 压缩包 源码地址:https://gitee.com/isoftforce/dreamer_ cms 漏洞验证步骤 使用 evilzip 工具构造恶意 ZIP 文件: 工具地址:https://github.com/TheKingOfDuck/evilzip 上传构造的恶意 ZIP 文件 系统解压时会将文件写入预期外的目录 漏洞代码分析 主题文件处理流程: 从服务器下载 ZIP 格式的主题包 解压时未对 entry.getName() 返回的字符串进行 ../ 过滤 关键缺陷代码: 漏洞利用 利用方法 构造包含恶意文件的 ZIP 包: 使用 evilzip 等工具生成 设置恶意文件路径如 ../../../../path/to/vulnerable/location 上传恶意 ZIP 包 系统解压时会将文件写入非预期位置 实际攻击场景 写入计划任务实现持久化 写入 Webshell 实现任意代码执行 覆盖系统关键文件造成拒绝服务 利用示例 将编译好的 jar 包部署到目标系统 生成恶意 jar 包并上传 成功获取反弹 shell 修复建议 对 ZipEntry.getName() 返回值进行规范化处理: 使用安全的解压库或方法 限制上传文件的类型和内容 对解压操作进行沙箱隔离 总结 ZIP Slip 漏洞是一种常见的文件处理漏洞,Dreamer CMS 由于未对 ZIP 文件中的路径进行安全检查,导致攻击者可以通过构造恶意 ZIP 文件实现目录遍历和任意文件写入。开发者应始终对用户提供的文件路径进行规范化验证,确保解压操作不会逃逸出目标目录。