CVE-2022-22965 Spring Framework 任意文件写入漏洞
字数 2228 2025-08-11 17:40:22

Spring Framework 任意文件写入漏洞(CVE-2022-22965)深度分析

漏洞概述

CVE-2022-22965是Spring Framework中存在的一个高危任意文件写入漏洞,可导致远程代码执行(RCE)。该漏洞影响特定版本的Spring Framework,结合JDK 9+和Tomcat环境可被利用。

受影响版本

  • JDK版本:JDK 9及以上版本
  • Spring Framework版本
    • Spring Framework 5.3.X < 5.3.18
    • Spring Framework 5.2.X < 5.2.20
  • 中间件:Tomcat

前置知识

1. SpringMVC参数绑定

SpringMVC支持将HTTP请求中的参数或请求体内容自动转换为Controller方法的参数,避免了手动从HttpServletRequest获取数据。它支持多层嵌套的参数绑定。

2. Java Bean PropertyDescriptor

PropertyDescriptor是java.beans包下的类,用于获取符合Java Bean规范的对象属性和get/set方法。

3. Spring BeanWrapperImpl

BeanWrapper接口是对Bean的包装,提供便捷的Bean属性访问和设置方法。BeanWrapperImpl是其默认实现,通过PropertyDescriptor操作被包装的Bean对象。

4. Tomcat AccessLogValve

Tomcat的Valve用于处理请求和响应,AccessLogValve专门用于记录访问日志(access_log)。默认配置在server.xml中,所有部署在Tomcat中的Web应用都会执行。

漏洞原理

攻击者利用SpringMVC的多层嵌套参数绑定功能,通过HTTP请求修改Tomcat日志相关配置参数:

  • class.module.classLoader.resources.context.parent.pipeline.first.pattern:日志文件内容
  • class.module.classLoader.resources.context.parent.pipeline.first.suffix:日志文件后缀
  • class.module.classLoader.resources.context.parent.pipeline.first.directory:日志文件存放路径
  • class.module.classLoader.resources.context.parent.pipeline.first.prefix:日志文件名
  • class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat:日志文件日期后缀

通过精心构造这些参数,攻击者可以在服务器上写入任意文件(如JSP木马),实现远程代码执行。

漏洞复现

环境搭建

  1. 下载Tomcat 9.0.60

    • 下载地址:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.60/bin/
    • 解压即可使用
  2. 部署WAR包

    • 下载测试WAR包(示例链接:https://pan.baidu.com/s/1MHQkPA0kvdhyTR0sXToPFQ?pwd=squ5)
    • 删除Tomcat webapps目录下的ROOT文件夹
    • 将下载的WAR包重命名为ROOT.war并放入webapps目录
  3. 启动Tomcat

    • 运行bin目录下的startup.bat
    • 出现"Spring"字样表示部署成功
  4. 解决中文乱码(如需要):

    • 修改conf/logging.properties文件
    • 将所有UTF-8改为GBK

漏洞利用

  1. 访问目标网站:http://IP:8080
  2. 运行EXP工具(示例:https://pan.baidu.com/s/1cLwdSmQKclc9xqRy6rTPlA?pwd=g6tt)
    • 命令:python exploit.py --url http://IP:8080/
  3. 成功利用后会生成木马文件(如xiaoyuan.jsp),可通过参数cmd执行命令

修复建议

  1. 升级Spring Framework

    • 升级到5.3.18或5.2.20及以上版本
  2. 降低JDK版本

    • 降级到JDK 8(不受该漏洞影响)
  3. 升级Tomcat

    • 升级到最新版本
  4. 应用层防护

    • 使用WAF、IPS等设备过滤包含"class"、"classloader"等关键字的请求
    • 拦截通过POST上传JSP文件的请求
  5. 其他措施

    • 限制Tomcat日志目录的写入权限
    • 监控服务器上异常JSP文件的创建

技术细节

漏洞利用的关键在于通过SpringMVC的参数绑定机制修改Tomcat的AccessLogValve配置。攻击者通过精心构造的请求参数,可以:

  1. 将日志文件后缀改为.jsp
  2. 控制日志文件内容(写入恶意代码)
  3. 指定日志文件存放路径(如webapps/ROOT目录)
  4. 设置日志文件名(如shell.jsp)

当Tomcat处理后续请求时,会按照修改后的配置生成日志文件,实际上创建了一个可执行的JSP木马文件,从而实现远程代码执行。

Spring Framework 任意文件写入漏洞(CVE-2022-22965)深度分析 漏洞概述 CVE-2022-22965是Spring Framework中存在的一个高危任意文件写入漏洞,可导致远程代码执行(RCE)。该漏洞影响特定版本的Spring Framework,结合JDK 9+和Tomcat环境可被利用。 受影响版本 JDK版本 :JDK 9及以上版本 Spring Framework版本 : Spring Framework 5.3.X < 5.3.18 Spring Framework 5.2.X < 5.2.20 中间件 :Tomcat 前置知识 1. SpringMVC参数绑定 SpringMVC支持将HTTP请求中的参数或请求体内容自动转换为Controller方法的参数,避免了手动从HttpServletRequest获取数据。它支持多层嵌套的参数绑定。 2. Java Bean PropertyDescriptor PropertyDescriptor是java.beans包下的类,用于获取符合Java Bean规范的对象属性和get/set方法。 3. Spring BeanWrapperImpl BeanWrapper接口是对Bean的包装,提供便捷的Bean属性访问和设置方法。BeanWrapperImpl是其默认实现,通过PropertyDescriptor操作被包装的Bean对象。 4. Tomcat AccessLogValve Tomcat的Valve用于处理请求和响应,AccessLogValve专门用于记录访问日志(access_ log)。默认配置在server.xml中,所有部署在Tomcat中的Web应用都会执行。 漏洞原理 攻击者利用SpringMVC的多层嵌套参数绑定功能,通过HTTP请求修改Tomcat日志相关配置参数: class.module.classLoader.resources.context.parent.pipeline.first.pattern :日志文件内容 class.module.classLoader.resources.context.parent.pipeline.first.suffix :日志文件后缀 class.module.classLoader.resources.context.parent.pipeline.first.directory :日志文件存放路径 class.module.classLoader.resources.context.parent.pipeline.first.prefix :日志文件名 class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat :日志文件日期后缀 通过精心构造这些参数,攻击者可以在服务器上写入任意文件(如JSP木马),实现远程代码执行。 漏洞复现 环境搭建 下载Tomcat 9.0.60 : 下载地址:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.60/bin/ 解压即可使用 部署WAR包 : 下载测试WAR包(示例链接:https://pan.baidu.com/s/1MHQkPA0kvdhyTR0sXToPFQ?pwd=squ5) 删除Tomcat webapps目录下的ROOT文件夹 将下载的WAR包重命名为ROOT.war并放入webapps目录 启动Tomcat : 运行bin目录下的startup.bat 出现"Spring"字样表示部署成功 解决中文乱码 (如需要): 修改conf/logging.properties文件 将所有UTF-8改为GBK 漏洞利用 访问目标网站:http://IP:8080 运行EXP工具(示例:https://pan.baidu.com/s/1cLwdSmQKclc9xqRy6rTPlA?pwd=g6tt) 命令: python exploit.py --url http://IP:8080/ 成功利用后会生成木马文件(如xiaoyuan.jsp),可通过参数cmd执行命令 修复建议 升级Spring Framework : 升级到5.3.18或5.2.20及以上版本 降低JDK版本 : 降级到JDK 8(不受该漏洞影响) 升级Tomcat : 升级到最新版本 应用层防护 : 使用WAF、IPS等设备过滤包含"class"、"classloader"等关键字的请求 拦截通过POST上传JSP文件的请求 其他措施 : 限制Tomcat日志目录的写入权限 监控服务器上异常JSP文件的创建 技术细节 漏洞利用的关键在于通过SpringMVC的参数绑定机制修改Tomcat的AccessLogValve配置。攻击者通过精心构造的请求参数,可以: 将日志文件后缀改为.jsp 控制日志文件内容(写入恶意代码) 指定日志文件存放路径(如webapps/ROOT目录) 设置日志文件名(如shell.jsp) 当Tomcat处理后续请求时,会按照修改后的配置生成日志文件,实际上创建了一个可执行的JSP木马文件,从而实现远程代码执行。