代码审计之上传自解压漏洞
字数 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
搭建步骤
- 创建数据库并导入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中的相关代码:
// 接收上传数据
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);
}
}
漏洞成因
- 系统接收上传的压缩包文件
- 将压缩包解压到临时目录
- 未对解压后的文件类型进行校验
- 允许上传任意文件类型,包括恶意脚本
0x03 漏洞利用
基本利用方式
- 制作包含恶意JSP文件的ZIP压缩包
- 上传压缩包,系统自动解压
- 访问解压后的恶意文件
高级利用技巧
-
目录穿越攻击:
- 制作包含路径穿越的ZIP文件(如
../../webapps/ROOT/shell.jsp) - 上传后文件会被解压到Tomcat的webapps目录
- 制作包含路径穿越的ZIP文件(如
-
结合Shiro权限绕过:
- 系统使用Shiro 1.3.2(存在已知权限绕过漏洞)
- 将后台漏洞转变为前台RCE
-
绕过JSP路径限制:
- 系统过滤器会自动在JSP访问路径前加上
/jsp - 直接将shell上传到jsp目录下即可访问
- 系统过滤器会自动在JSP访问路径前加上
利用步骤详解
-
制作恶意WAR包:
jar -cvf shell.war shell.jsp -
使用Python脚本创建目录穿越的ZIP文件:
import zipfile z = zipfile.ZipFile('exploit.zip', 'w') z.writestr('../../webapps/shell.war', open('shell.war', 'rb').read()) z.close() -
上传ZIP文件,系统自动解压到webapps目录
-
Tomcat自动解压WAR包并部署
-
访问恶意JSP文件获取权限
0x04 修复建议
- 升级版本:升级到最新版本的jspxcms
- 文件类型校验:
- 在解压前检查压缩包内容
- 限制可解压的文件类型
- 路径限制:
- 禁止解压路径中包含
../等目录穿越字符 - 限制解压目录为指定安全目录
- 禁止解压路径中包含
- 权限控制:
- 升级Shiro到最新版本
- 对所有敏感操作添加权限校验
- 输入过滤:
- 对上传文件名进行规范化处理
- 使用白名单机制限制可上传文件类型
0x05 总结
- 上传自解压漏洞常被忽略,但危害严重
- 代码审计时应重点关注文件操作相关功能
- 后台漏洞可通过组合其他漏洞(如权限绕过)提升危害
- 开发时应遵循最小权限原则,对所有上传内容进行严格校验
附录:相关技术点
- Java ZIP解压原理:使用
java.util.zip包处理压缩文件 - Tomcat自动部署机制:webapps目录下的WAR包会自动解压部署
- Shiro权限绕过漏洞:CVE-2020-1957等低版本Shiro存在的安全问题
- 路径规范化处理:使用
getCanonicalPath()而非简单拼接路径
通过本文的分析,读者可以深入理解上传自解压漏洞的原理和利用方式,并在实际开发和安全审计中有效识别和防范此类安全问题。