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

漏洞分析

关键知识点

  1. ActionSupport:表示一个Struts2的Action,包含三个关键属性:

    • upload:上传的文件
    • fileFileName:上传的文件名
    • fileContentType:上传的文件类型
  2. 文件上传机制

    • 未配置时:使用javax.servlet.context.tempdir默认参数
    • 配置后:使用指定路径

漏洞前提条件

必须存在一个文件上传接口,这是漏洞利用的"特定条件"。

漏洞原理

  1. 参数处理机制

    • Struts2处理HTTP参数时对大小写不敏感
    • 可通过参数覆盖控制上传路径和文件名
  2. 关键流程

    • 默认情况下会进入setMultipartSaveDir方法确定存储路径
    • 生成临时文件(tmp)
    • 正常情况下Struts会删除临时文件
  3. 漏洞触发点

    • 通过控制参数顺序和大小写形式,可以绕过路径限制
    • 构造特定参数组合可实现目录穿越

漏洞复现

环境搭建

  1. 下载Struts 6.3.0源码
  2. 创建自定义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;
    }
}
  1. 配置struts-fileupload.xml添加action映射

攻击向量构造

构造参数顺序和大小写组合:

{
    Upload=File{name='Upload'},
    UploadFileName=File{name='UploadFileName'},
    uploadFileName=../../shell.jsp,
    UploadContentType=File{name='UploadContentType'}
}

最终上传路径会被解析为:D:\uploads\a\../../shell.jsp,实现目录穿越。

修复方案

  1. 升级到官方最新版本
  2. 避免暴露未授权的文件上传路径
  3. 为文件上传功能添加严格的拦截器检查
  4. 官方补丁主要修复点:
    • 添加参数长度限制检查
    • 严格处理文件删除操作
    • 增强参数处理的安全性

补充说明

该漏洞可与文件名类型修改功能结合使用,形成更强大的攻击组合。在实际利用时,可考虑结合CC3等攻击链实现更复杂的攻击效果。

参考资源

  • 官方补丁下载:https://struts.apache.org/download.cgi
  • 测试用例参考:HttpParametersTest类中的大小写处理测试
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类: 配置struts-fileupload.xml添加action映射 攻击向量构造 构造参数顺序和大小写组合: 最终上传路径会被解析为: D:\uploads\a\../../shell.jsp ,实现目录穿越。 修复方案 升级到官方最新版本 避免暴露未授权的文件上传路径 为文件上传功能添加严格的拦截器检查 官方补丁主要修复点: 添加参数长度限制检查 严格处理文件删除操作 增强参数处理的安全性 补充说明 该漏洞可与文件名类型修改功能结合使用,形成更强大的攻击组合。在实际利用时,可考虑结合CC3等攻击链实现更复杂的攻击效果。 参考资源 官方补丁下载:https://struts.apache.org/download.cgi 测试用例参考: HttpParametersTest 类中的大小写处理测试