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木马文件,从而实现远程代码执行。