Apache Struts2 文件上传漏洞分析(CVE-2023-50164)
字数 1022 2025-08-19 12:41:40
Apache Struts2 文件上传漏洞分析(CVE-2023-50164)教学文档
漏洞概述
Apache Struts2 是一个开源的 Java Web 应用程序开发框架,用于构建企业级Web应用程序。CVE-2023-50164是一个文件上传漏洞,攻击者可在特定条件下通过污染上传参数实现任意文件上传,进而执行任意代码。
影响范围
- Struts 2.0.0 - 2.3.37
- Struts 2.5.0 - 2.5.32
- Struts 6.0.0 - 6.3.0
漏洞分析
关键知识点
-
ActionSupport:表示一个Struts2的Action,包含三个关键属性:
upload:上传的文件fileFileName:上传的文件名fileContentType:上传的文件类型
-
文件上传机制:
- 未配置时:使用
javax.servlet.context.tempdir默认参数 - 配置后:使用指定路径
- 未配置时:使用
漏洞前提条件
必须存在一个文件上传接口,这是漏洞利用的"特定条件"。
漏洞原理
-
参数处理机制:
- Struts2处理HTTP参数时对大小写不敏感
- 可通过参数覆盖控制上传路径和文件名
-
关键流程:
- 默认情况下会进入
setMultipartSaveDir方法确定存储路径 - 生成临时文件(tmp)
- 正常情况下Struts会删除临时文件
- 默认情况下会进入
-
漏洞触发点:
- 通过控制参数顺序和大小写形式,可以绕过路径限制
- 构造特定参数组合可实现目录穿越
漏洞复现
环境搭建
- 下载Struts 6.3.0源码
- 创建自定义Action类:
public class UploadAction extends ActionSupport {
private File upload;
private String uploadContentType;
private String uploadFileName;
private String caption;
// getter和setter方法
public String upload() {
String path = "D:\\uploads\\a\\";
String realPath = path + File.separator + uploadFileName;
// 文件上传处理
return SUCCESS;
}
}
- 配置struts-fileupload.xml添加action映射
攻击向量构造
构造参数顺序和大小写组合:
{
Upload=File{name='Upload'},
UploadFileName=File{name='UploadFileName'},
uploadFileName=../../shell.jsp,
UploadContentType=File{name='UploadContentType'}
}
最终上传路径会被解析为:D:\uploads\a\../../shell.jsp,实现目录穿越。
修复方案
- 升级到官方最新版本
- 避免暴露未授权的文件上传路径
- 为文件上传功能添加严格的拦截器检查
- 官方补丁主要修复点:
- 添加参数长度限制检查
- 严格处理文件删除操作
- 增强参数处理的安全性
补充说明
该漏洞可与文件名类型修改功能结合使用,形成更强大的攻击组合。在实际利用时,可考虑结合CC3等攻击链实现更复杂的攻击效果。
参考资源
- 官方补丁下载:https://struts.apache.org/download.cgi
- 测试用例参考:
HttpParametersTest类中的大小写处理测试