梦想家内容管理系统 Zip Slip Traversal Vulnerability
字数 1193 2025-08-09 17:09:26
梦想家内容管理系统 (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()返回的字符串进行../过滤
关键缺陷代码:
// 伪代码示例
ZipEntry entry = zipFile.getEntry("malicious/../../../../file.txt");
String name = entry.getName(); // 返回包含../的路径
File outputFile = new File(name); // 未做路径规范化处理
// 解压操作...
漏洞利用
利用方法
- 构造包含恶意文件的 ZIP 包:
- 使用 evilzip 等工具生成
- 设置恶意文件路径如
../../../../path/to/vulnerable/location
- 上传恶意 ZIP 包
- 系统解压时会将文件写入非预期位置
实际攻击场景
- 写入计划任务实现持久化
- 写入 Webshell 实现任意代码执行
- 覆盖系统关键文件造成拒绝服务
利用示例
- 将编译好的 jar 包部署到目标系统
- 生成恶意 jar 包并上传
- 成功获取反弹 shell
修复建议
- 对
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); } - 使用安全的解压库或方法
- 限制上传文件的类型和内容
- 对解压操作进行沙箱隔离
总结
ZIP Slip 漏洞是一种常见的文件处理漏洞,Dreamer CMS 由于未对 ZIP 文件中的路径进行安全检查,导致攻击者可以通过构造恶意 ZIP 文件实现目录遍历和任意文件写入。开发者应始终对用户提供的文件路径进行规范化验证,确保解压操作不会逃逸出目标目录。