Spring-beans RCE漏洞分析
说明
- 要求条件:
- JDK9及其以上版本;
- 使⽤了Spring-beans包;
- 使⽤了Spring参数绑定;
- Spring参数绑定使⽤的是⾮基本参数类型,例如⼀般的POJO即可;
受影响范围:
Spring Framework < 5.3.18
Spring Framework < 5.2.20
JDK ≥ 9
不受影响版本:
Spring Framework = 5.3.18
Spring Framework = 5.2.20
JDK < 9
- 与Tomcat版本有关
Tomcat测试结果
作者已注销账号
基础知识
Spring参数自动绑定
http://localhost:8083/addUser?name=wuya&department.name=sec
原理:
User.getDepartment()
Department.setName()
多级参数绑定
参数名赋值:contry.province.city.district=yuelu
调用链路:
Contry.getProvince()
Province.getCity()
City.getDistrict()
District.setDistrictName()
BeanWrapperImpl
Spring自带:
BeanWrapperImpl
对Spring容器中管理的对象,自动调用get/set方法
思路
通过Controller的参数赋值(自动绑定),
可以修改任意对象的属性值
改什么?
…
access_log属性
- directory: access_log文件输出目录
- prefix: access_log文件名前缀
- suffix: access_log文件名后缀
- pattern: access_log文件内容格式
- fileDateFormat:access_log文件名日期后缀,默认为.yyyy-MM-dd
org.apache.catalina.valves.AccessLogValve 对象
漏洞复现
环境
- 操作系统:Windows
- JDK:11.0.11
- Tomcat:9.0.60
- SpringBoot:2.6.3(注意不使用内置Tomcat)
- 把ROOT.war包放在tomcat/webapps目录下
准备内容
部署到tomcat/webapps/ROOT
利用
python代码如下
原理分析
HTTP payload
调用链
class.module.classLoader.resources.context.parent.pipeline.first.pattern
User.getClass()
java.lang.Class.getModule()
java.lang.Module.getClassLoader()
org.apache.catalina.loader.ParallelWebappClassLoader.getResources()
org.apache.catalina.webresources.StandardRoot.getContext()
org.apache.catalina.core.StandardContext.getParent()
org.apache.catalina.core.StandardHost.getPipeline()
org.apache.catalina.core.StandardPipeline.getFirst()
org.apache.catalina.valves.AccessLogValve.setPattern()
评论区