记一次由追踪溯源发现的不安全解压GetShell
字数 1487 2025-08-18 11:39:04

不安全解压漏洞分析与防御指南

漏洞概述

不安全解压漏洞是指应用程序在处理压缩文件时,未对压缩包内文件的路径进行严格校验,导致攻击者可以通过构造恶意压缩包实现目录穿越,从而将恶意文件写入系统非预期位置的安全漏洞。本文通过一个实际案例详细分析此类漏洞的利用方式、危害及防御措施。

案例背景

某CMS系统因ZIP解压功能存在缺陷,攻击者通过精心构造的ZIP文件实现目录穿越,将包含Webshell的war包解压到Tomcat的webapps目录,导致系统被入侵。

攻击流程分析

  1. 信息收集与爆破攻击

    • 攻击者首先对CMS登录接口(POST /cmscp/login.do)实施爆破攻击
    • 爆破成功HTTP状态码为302,失败为303
  2. Webshell上传与部署

    • 攻击者利用ZIP解压功能上传恶意war包
    • 通过目录穿越技术使war包跳出CMS根目录
    • war包自动部署到Tomcat的webapps目录
  3. 恶意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包跳出预设目录
  4. 漏洞接口利用

    • 攻击目标接口:GET /cmscp/core/web_file_2/unzip.do?ids={ids}&parentId={parentId}
    • 该接口调用WebFileUploadsController.javaunzip方法
    • 最终由AntZipUtil类的unzip方法执行解压操作

漏洞代码分析

  1. 问题代码位置

    • WebFileControllerAbstractor.java中的unzip方法
    • 调用AntZipUtil.unzip方法时未对ZIP压缩包内文件名进行校验
  2. 根本原因

    • 解压过程中直接使用压缩包内文件的原始路径进行写入
    • 未限制文件解压的目标路径
    • 未对文件扩展名进行过滤

防御方案

安全开发建议

  1. 文件扩展名限制

    • 禁止解压危险扩展名文件:.war, .jsp, .jspx, .jsp::$DATA(Windows特有)
    • 根据业务需求设置允许的文件类型白名单
  2. 解压路径限制

    • 强制所有文件解压到指定目录内
    • 检查解压路径是否包含../等目录穿越字符
    • 使用规范化路径函数确保路径在预期范围内
  3. 文件大小限制

    • 限制单个压缩包的总大小
    • 限制压缩包内文件数量
    • 防止压缩炸弹攻击
  4. 权限控制

    • Web应用目录设置最小必要权限
    • 解压过程使用低权限账户执行

安全产品防护

  1. 网站安全狗/云御防护

    • 启用网站后台防护功能
    • 配置暴破攻击防护
    • 设置Webshell检测规则
  2. 服务器防护

    • 使用服务器安全产品的文件目录守护功能
    • 监控关键目录的文件变更
    • 设置文件完整性检查

漏洞复现与检测

  1. 恶意ZIP生成方法

    • 使用Python的zipfile模块构造特殊路径的ZIP文件
    • 或使用工具修改ZIP文件的内部路径结构
  2. 漏洞检测方法

    • 上传包含目录穿越路径的测试ZIP文件
    • 检查文件是否被解压到预期目录之外
    • 使用安全扫描工具检测解压功能

总结

不安全解压漏洞是一种常见但危害严重的安全问题,开发人员在实现解压功能时必须考虑路径校验、文件类型限制等多重安全措施。同时,运维人员应部署专业的安全防护产品,形成纵深防御体系,确保即使单一防护措施失效,系统仍能保持安全状态。

通过本案例的分析,我们可以看到,即使是看似简单的文件解压功能,如果实现不当也可能导致整个系统沦陷。安全开发需要贯穿软件生命周期的每个环节,从设计、编码到测试都需要充分考虑各种潜在的攻击场景。

不安全解压漏洞分析与防御指南 漏洞概述 不安全解压漏洞是指应用程序在处理压缩文件时,未对压缩包内文件的路径进行严格校验,导致攻击者可以通过构造恶意压缩包实现目录穿越,从而将恶意文件写入系统非预期位置的安全漏洞。本文通过一个实际案例详细分析此类漏洞的利用方式、危害及防御措施。 案例背景 某CMS系统因ZIP解压功能存在缺陷,攻击者通过精心构造的ZIP文件实现目录穿越,将包含Webshell的war包解压到Tomcat的webapps目录,导致系统被入侵。 攻击流程分析 信息收集与爆破攻击 攻击者首先对CMS登录接口( POST /cmscp/login.do )实施爆破攻击 爆破成功HTTP状态码为302,失败为303 Webshell上传与部署 攻击者利用ZIP解压功能上传恶意war包 通过目录穿越技术使war包跳出CMS根目录 war包自动部署到Tomcat的webapps目录 恶意ZIP文件构造 使用Python脚本生成基础ZIP文件 将包含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文件 检查文件是否被解压到预期目录之外 使用安全扫描工具检测解压功能 总结 不安全解压漏洞是一种常见但危害严重的安全问题,开发人员在实现解压功能时必须考虑路径校验、文件类型限制等多重安全措施。同时,运维人员应部署专业的安全防护产品,形成纵深防御体系,确保即使单一防护措施失效,系统仍能保持安全状态。 通过本案例的分析,我们可以看到,即使是看似简单的文件解压功能,如果实现不当也可能导致整个系统沦陷。安全开发需要贯穿软件生命周期的每个环节,从设计、编码到测试都需要充分考虑各种潜在的攻击场景。