代码审计之上传自解压漏洞
字数 1586 2025-08-07 08:22:33

Java代码审计:上传自解压漏洞分析与利用

0x00 漏洞概述

上传自解压漏洞是一种容易被忽略的安全问题,当网站对上传功能进行了黑白名单过滤时,可能会忽略压缩包解压后的文件是否为恶意文件。本文以jspxcms_v9.0.0为例,详细分析该漏洞的成因、利用方式及修复建议。

0x01 环境搭建

所需资源

  • 安装包下载地址: https://www.ujcms.com/uploads/jspxcms-9.0.0-release.zip
  • 源码下载地址: https://www.ujcms.com/uploads/jspxcms-9.0.0-release-src.zip

搭建步骤

  1. 创建数据库并导入database目录下的sql文件数据
  2. 将压缩包中的ROOT目录替换Tomcat的ROOT目录
  3. 修改ROOT\WEB-INF\classes\application.properties中的数据库配置
  4. 启动Tomcat
  5. 访问http://[IP]:8080/cmscp/index.do
  6. 使用默认账号登录: admin/空

0x02 漏洞分析

漏洞定位

  1. 在IDEA中全局搜索关键字unzip
  2. 重点关注SiteController.java第157行的接口

关键代码分析

src/main/java/com/jspxcms/core/web/back/SiteController.java中的相关代码:

// 接收上传数据
MultipartFile file = params.getFile("file");
// 创建临时文件
File tempFile = FileUtils.getTempFile(FileUtils.getTempDirectory(), null);
file.transferTo(tempFile);
// 解压临时文件
AntZipUtils.unzip(tempFile, unzipFile);
// 删除临时压缩包
FileUtils.deleteQuietly(tempFile);

com/jspxcms/common/file/AntZipUtils.java中的解压方法:

public static void unzip(File zipFile, File destDir) throws IOException {
    // 遍历压缩包中的文件
    Enumeration<? extends ZipEntry> entries = zipFileInputStream.getEntries();
    while (entries.hasMoreElements()) {
        ZipEntry entry = entries.nextElement();
        // 创建文件对象
        File entryFile = new File(destDir, entry.getName());
        // 写入文件内容
        FileUtils.copyInputStreamToFile(zipFileInputStream, entryFile);
    }
}

漏洞成因

  1. 系统接收上传的压缩包文件
  2. 将压缩包解压到临时目录
  3. 未对解压后的文件类型进行校验
  4. 允许上传任意文件类型,包括恶意脚本

0x03 漏洞利用

基本利用方式

  1. 制作包含恶意JSP文件的ZIP压缩包
  2. 上传压缩包,系统自动解压
  3. 访问解压后的恶意文件

高级利用技巧

  1. 目录穿越攻击

    • 制作包含路径穿越的ZIP文件(如../../webapps/ROOT/shell.jsp
    • 上传后文件会被解压到Tomcat的webapps目录
  2. 结合Shiro权限绕过

    • 系统使用Shiro 1.3.2(存在已知权限绕过漏洞)
    • 将后台漏洞转变为前台RCE
  3. 绕过JSP路径限制

    • 系统过滤器会自动在JSP访问路径前加上/jsp
    • 直接将shell上传到jsp目录下即可访问

利用步骤详解

  1. 制作恶意WAR包:

    jar -cvf shell.war shell.jsp
    
  2. 使用Python脚本创建目录穿越的ZIP文件:

    import zipfile
    z = zipfile.ZipFile('exploit.zip', 'w')
    z.writestr('../../webapps/shell.war', open('shell.war', 'rb').read())
    z.close()
    
  3. 上传ZIP文件,系统自动解压到webapps目录

  4. Tomcat自动解压WAR包并部署

  5. 访问恶意JSP文件获取权限

0x04 修复建议

  1. 升级版本:升级到最新版本的jspxcms
  2. 文件类型校验
    • 在解压前检查压缩包内容
    • 限制可解压的文件类型
  3. 路径限制
    • 禁止解压路径中包含../等目录穿越字符
    • 限制解压目录为指定安全目录
  4. 权限控制
    • 升级Shiro到最新版本
    • 对所有敏感操作添加权限校验
  5. 输入过滤
    • 对上传文件名进行规范化处理
    • 使用白名单机制限制可上传文件类型

0x05 总结

  1. 上传自解压漏洞常被忽略,但危害严重
  2. 代码审计时应重点关注文件操作相关功能
  3. 后台漏洞可通过组合其他漏洞(如权限绕过)提升危害
  4. 开发时应遵循最小权限原则,对所有上传内容进行严格校验

附录:相关技术点

  1. Java ZIP解压原理:使用java.util.zip包处理压缩文件
  2. Tomcat自动部署机制:webapps目录下的WAR包会自动解压部署
  3. Shiro权限绕过漏洞:CVE-2020-1957等低版本Shiro存在的安全问题
  4. 路径规范化处理:使用getCanonicalPath()而非简单拼接路径

通过本文的分析,读者可以深入理解上传自解压漏洞的原理和利用方式,并在实际开发和安全审计中有效识别和防范此类安全问题。

Java代码审计:上传自解压漏洞分析与利用 0x00 漏洞概述 上传自解压漏洞是一种容易被忽略的安全问题,当网站对上传功能进行了黑白名单过滤时,可能会忽略压缩包解压后的文件是否为恶意文件。本文以jspxcms_ v9.0.0为例,详细分析该漏洞的成因、利用方式及修复建议。 0x01 环境搭建 所需资源 安装包下载地址: https://www.ujcms.com/uploads/jspxcms-9.0.0-release.zip 源码下载地址: https://www.ujcms.com/uploads/jspxcms-9.0.0-release-src.zip 搭建步骤 创建数据库并导入database目录下的sql文件数据 将压缩包中的ROOT目录替换Tomcat的ROOT目录 修改 ROOT\WEB-INF\classes\application.properties 中的数据库配置 启动Tomcat 访问 http://[IP]:8080/cmscp/index.do 使用默认账号登录: admin/空 0x02 漏洞分析 漏洞定位 在IDEA中全局搜索关键字 unzip 重点关注 SiteController.java 第157行的接口 关键代码分析 src/main/java/com/jspxcms/core/web/back/SiteController.java 中的相关代码: com/jspxcms/common/file/AntZipUtils.java 中的解压方法: 漏洞成因 系统接收上传的压缩包文件 将压缩包解压到临时目录 未对解压后的文件类型进行校验 允许上传任意文件类型,包括恶意脚本 0x03 漏洞利用 基本利用方式 制作包含恶意JSP文件的ZIP压缩包 上传压缩包,系统自动解压 访问解压后的恶意文件 高级利用技巧 目录穿越攻击 : 制作包含路径穿越的ZIP文件(如 ../../webapps/ROOT/shell.jsp ) 上传后文件会被解压到Tomcat的webapps目录 结合Shiro权限绕过 : 系统使用Shiro 1.3.2(存在已知权限绕过漏洞) 将后台漏洞转变为前台RCE 绕过JSP路径限制 : 系统过滤器会自动在JSP访问路径前加上 /jsp 直接将shell上传到jsp目录下即可访问 利用步骤详解 制作恶意WAR包: 使用Python脚本创建目录穿越的ZIP文件: 上传ZIP文件,系统自动解压到webapps目录 Tomcat自动解压WAR包并部署 访问恶意JSP文件获取权限 0x04 修复建议 升级版本 :升级到最新版本的jspxcms 文件类型校验 : 在解压前检查压缩包内容 限制可解压的文件类型 路径限制 : 禁止解压路径中包含 ../ 等目录穿越字符 限制解压目录为指定安全目录 权限控制 : 升级Shiro到最新版本 对所有敏感操作添加权限校验 输入过滤 : 对上传文件名进行规范化处理 使用白名单机制限制可上传文件类型 0x05 总结 上传自解压漏洞常被忽略,但危害严重 代码审计时应重点关注文件操作相关功能 后台漏洞可通过组合其他漏洞(如权限绕过)提升危害 开发时应遵循最小权限原则,对所有上传内容进行严格校验 附录:相关技术点 Java ZIP解压原理 :使用 java.util.zip 包处理压缩文件 Tomcat自动部署机制 :webapps目录下的WAR包会自动解压部署 Shiro权限绕过漏洞 :CVE-2020-1957等低版本Shiro存在的安全问题 路径规范化处理 :使用 getCanonicalPath() 而非简单拼接路径 通过本文的分析,读者可以深入理解上传自解压漏洞的原理和利用方式,并在实际开发和安全审计中有效识别和防范此类安全问题。