由 zip 压缩绕过目录穿越限制导致的 getshell 分析
字数 1002 2025-08-29 08:30:24
ZIP压缩绕过目录穿越限制导致的Getshell分析
漏洞原理
该漏洞源于ZIP压缩文件处理过程中对目录穿越防护的绕过。当系统解压ZIP文件时,如果没有正确验证或过滤路径中的特殊字符(如../),攻击者可以构造恶意ZIP文件实现任意文件写入,最终可能导致服务器被完全控制(getshell)。
关键原理点
-
ZIP压缩命令的特殊路径处理:
zip -r ./a.zip ..\*.\a这种命令模式可能绕过目录限制..表示上级目录,*是通配符,a是文件名的一部分
-
解压时的验证缺失:
- 系统未正确验证ZIP文件中包含的路径
- 目录穿越防护被特殊构造的payload绕过
漏洞复现步骤
1. 准备恶意ZIP文件
- 创建一个包含特殊路径的文件结构
- 使用zip命令构造恶意压缩包:
zip -r ./malicious.zip ..\*.\malicious_file
2. 寻找上传点
- 在目标CMS系统中找到允许上传ZIP文件的功能点(如主题上传)
- 上传构造好的恶意ZIP文件
3. 观察效果
- 检查系统目录结构变化
- 确认是否在预期外的目录创建了文件
4. Getshell利用
-
在Linux环境下:
- 写入反弹shell的定时任务文件
- 例如写入到
/var/spool/cron/root或/etc/cron.d/
-
设置监听:
nc -lvnp [监听端口] -
等待定时任务执行,获取反弹shell
漏洞代码分析
漏洞路由定位
- 找到处理ZIP上传和解压的路由
- 分析解压功能的代码实现
防护绕过机制
- 系统虽然有限制目录穿越的代码
- 但特殊payload(如包含
*的模式)可以绕过防护:..\*.\file这种模式可能被错误解析- 星号(*)在路径处理中被特殊对待
错误处理
- 解压过程中可能出现报错
- 但报错发生在文件已经写入之后,不影响漏洞利用
防护建议
-
严格验证ZIP文件中的路径:
- 过滤所有
../等目录穿越尝试 - 检查绝对路径
- 过滤所有
-
限制解压目录:
- 强制在指定目录内解压
- 使用chroot等隔离技术
-
文件权限控制:
- 运行解压功能的用户应具有最小权限
- 关键目录设置只读权限
-
输入验证:
- 检查ZIP文件内容白名单
- 限制允许的文件类型和扩展名
-
日志监控:
- 记录所有文件解压操作
- 监控异常文件创建行为
总结
该漏洞展示了文件处理过程中路径验证的重要性。通过精心构造的ZIP文件,攻击者可以绕过常规防护实现任意文件写入,最终可能导致服务器完全沦陷。开发人员应特别注意文件上传和解压功能的安全性设计,实施多层防护措施。