记一次由追踪溯源发现的不安全解压GetShell
字数 1487 2025-08-18 11:39:04
不安全解压漏洞分析与防御指南
漏洞概述
不安全解压漏洞是指应用程序在处理压缩文件时,未对压缩包内文件的路径进行严格校验,导致攻击者可以通过构造恶意压缩包实现目录穿越,从而将恶意文件写入系统非预期位置的安全漏洞。本文通过一个实际案例详细分析此类漏洞的利用方式、危害及防御措施。
案例背景
某CMS系统因ZIP解压功能存在缺陷,攻击者通过精心构造的ZIP文件实现目录穿越,将包含Webshell的war包解压到Tomcat的webapps目录,导致系统被入侵。
攻击流程分析
-
信息收集与爆破攻击
- 攻击者首先对CMS登录接口(
POST /cmscp/login.do)实施爆破攻击 - 爆破成功HTTP状态码为302,失败为303
- 攻击者首先对CMS登录接口(
-
Webshell上传与部署
- 攻击者利用ZIP解压功能上传恶意war包
- 通过目录穿越技术使war包跳出CMS根目录
- war包自动部署到Tomcat的webapps目录
-
恶意ZIP文件构造
- 使用Python脚本生成基础ZIP文件
import zipfile if __name__ == "__main__": try: binary = b'<script>alert("helloworld")</script>' zipFile = zipfile.ZipFile("test5.zip", "a", zipfile.ZIP_DEFLATED) info = zipfile.ZipInfo("test5.zip") zipFile.writestr("safedog.html", binary) zipFile.close() except IOError as e: raise e- 将包含Webshell的war包拖拽到生成的ZIP文件中
- 构造的ZIP文件路径为
test5.zip\,使解压时war包跳出预设目录
-
漏洞接口利用
- 攻击目标接口:
GET /cmscp/core/web_file_2/unzip.do?ids={ids}&parentId={parentId} - 该接口调用
WebFileUploadsController.java的unzip方法 - 最终由
AntZipUtil类的unzip方法执行解压操作
- 攻击目标接口:
漏洞代码分析
-
问题代码位置
WebFileControllerAbstractor.java中的unzip方法- 调用
AntZipUtil.unzip方法时未对ZIP压缩包内文件名进行校验
-
根本原因
- 解压过程中直接使用压缩包内文件的原始路径进行写入
- 未限制文件解压的目标路径
- 未对文件扩展名进行过滤
防御方案
安全开发建议
-
文件扩展名限制
- 禁止解压危险扩展名文件:
.war,.jsp,.jspx,.jsp::$DATA(Windows特有) - 根据业务需求设置允许的文件类型白名单
- 禁止解压危险扩展名文件:
-
解压路径限制
- 强制所有文件解压到指定目录内
- 检查解压路径是否包含
../等目录穿越字符 - 使用规范化路径函数确保路径在预期范围内
-
文件大小限制
- 限制单个压缩包的总大小
- 限制压缩包内文件数量
- 防止压缩炸弹攻击
-
权限控制
- Web应用目录设置最小必要权限
- 解压过程使用低权限账户执行
安全产品防护
-
网站安全狗/云御防护
- 启用网站后台防护功能
- 配置暴破攻击防护
- 设置Webshell检测规则
-
服务器防护
- 使用服务器安全产品的文件目录守护功能
- 监控关键目录的文件变更
- 设置文件完整性检查
漏洞复现与检测
-
恶意ZIP生成方法
- 使用Python的zipfile模块构造特殊路径的ZIP文件
- 或使用工具修改ZIP文件的内部路径结构
-
漏洞检测方法
- 上传包含目录穿越路径的测试ZIP文件
- 检查文件是否被解压到预期目录之外
- 使用安全扫描工具检测解压功能
总结
不安全解压漏洞是一种常见但危害严重的安全问题,开发人员在实现解压功能时必须考虑路径校验、文件类型限制等多重安全措施。同时,运维人员应部署专业的安全防护产品,形成纵深防御体系,确保即使单一防护措施失效,系统仍能保持安全状态。
通过本案例的分析,我们可以看到,即使是看似简单的文件解压功能,如果实现不当也可能导致整个系统沦陷。安全开发需要贯穿软件生命周期的每个环节,从设计、编码到测试都需要充分考虑各种潜在的攻击场景。