Spring常见漏洞和简要利用条件
spring
Spring Whitelabel SPEL RCE
Spring处理参数值出错时会将参数中${}
中的内容当作SPEL
解析实现,造成RCE
漏洞
Spring Data REST SPEL RCE
当使用JSON PATCH
对数据修改时,传入的PATH
参数会解析SPEL
Spring Web Flow SPEL RCE
在Model
的数据绑定上存在漏洞,但漏洞出发条件比较苛刻
由于没有明确指定相关Model
的具体属性,导致从表单可以提交恶意的表达式SPEL
被执行
Spring Messaging SPEL RCE
其中的STOMP
模块发送订阅命令时,支持选择器标头,该选择器充当基于内容路由的筛选器
这个筛选器selector
属性的值会解析SPEL
导致RCE
Spring Data Commons SPEL RCE
请求参数中如何包含SPEL
会被解析,参考下方Payload
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("calc.exe")]
SpringCloud SnameYAML RCE
该漏洞的利用条件是可出网,可以POST
访问/env
接口设置属性,且可以访问/refresh
刷新配置
在VPS
上开启HTTP Server
并放入基于ScriptEngineManager
和URLClassLoader
的yml
,制作特殊的JAR并指定
通过/env
设置spring.cloud.bootstrap.location
属性再刷新配置即可利用SnakeYAML
的反序列化漏洞实现RCE
SpringCloud Eureka RCE
该漏洞的利用条件同样是可出网,可以POST
访问/env
接口设置属性,且可以访问/refresh
刷新配置
首先搭建恶意的XStream Server
其中包含了Payload
通过/env
设置eureka.client.serviceUrl.defaultZone
属性再刷新配置即可访问远程XStream Payload
触发反序列化达到RCE
SpringBoot Jolokia Logback JNDI RCE
如果目标可出网且存在/jolokia
或/actuator/jolokia
接口
通过/jolokia/list
查看是否存在ch.qos.logback.classic.jmx.JMXConfigurator
和reloadByURL
关键词
搭建一个HTTP Server
保存XML
配置文件,再启动恶意的JNDI Server
,请求指定的URL
即可触发JNDI
注入漏洞达到RCE
SpringBoot Jolokia Realm JNDI RCE
如果目标可出网且存在/jolokia
或/actuator/jolokia
接口
启动恶意的JNDI Server
后调用createJNDIRealm
创建JNDIRealm
,然后写入JNDI
相关的配置文件,重启后触发JNDI
注入漏洞达到RCE
SpringBoot Restart H2 Database Query RCE
漏洞利用条件是可以访问/env
设置属性,可以访问/restart
重启应用
设置spring.datasource.hikari.connection-test-query
属性为创建自定义函数的SQL
语句,再数据库连接之前会执行该SQL
语句
通过重启应用,建立新的数据库连接,触发包含命令执行的自定义函数,达到RCE
SpringBoot H2 Database Console JNDI RCE
目标可出网且存在spring.h2.console.enabled=true
属性时可以利用
首先通过/h2-console
中记录下JSESSIONID
值,然后启动恶意的JNDI Server
,构造对应域名和JSESSIONID
的特殊POST
请求触发JNDI
注入漏洞达到RCE
SpringBoot Mysql JDBC RCE
该漏洞的利用条件同样是可出网,可以POST
访问/env
接口设置属性,且可以访问/refresh
刷新配置,不同的是需要存在mysql-connector-java
依赖
通过/env
得到mysql
版本等信息,测试是否存在常见的Gadget
依赖,访问spring.datasource.url
设置指定的MySQL JDBC URL
地址。刷新配置后当网站进行数据库操作时,会使用恶意的MySQL JDBC URL
建立连接
恶意的MySQL Server
会返回序列化Payload
数据,利用本地的Gadget
反序列化造成RCE
SpringBoot Restart logging.config Logback JNDI RCE
该漏洞的利用条件同样是可出网,可以POST
访问/env
接口设置属性,且可以访问/restart
重启
搭建一个HTTP Server
保存XML
配置文件,再启动恶意的JNDI Server
通过/env
接口设置logging.config
属性为恶意的XML
配置文件,重启触发JNDI
注入漏洞达到RCE
SpringBoot Restart logging.config Groovy RCE
该漏洞的利用条件同样是可出网,可以POST
访问/env
接口设置属性,且可以访问/restart
重启
启动恶意的JNDI Server
并通过/env
接口设置logging.config
属性为恶意的Groovy
文件在重启后生效
在logback-classic
组件的ch.qos.logback.classic.util.ContextInitializer
中会判断url
是否以groovy
结尾,如果是则最终会执行文件内容中的groovy
代码达到RCE
SpringBoot Restart spring.main.sources Groovy RCE
类似SpringBoot Restart logging.config Groovy RCE
组件中的org.springframework.boot.BeanDefinitionLoader
判断url
是否以groovy
结尾,如果是则最终会执行文件内容中的groovy
代码,造成RCE
漏洞
SpringBoot Restart spring.datasource.data H2 Database RCE
该漏洞的利用条件同样是可出网,可以POST
访问/env
接口设置属性,且可以访问/restart
重启
开一个HTTP Server
保存恶意SQL语句,这是一个执行命令的函数,设置属性spring.datasource.data
为该地址,重启后设置生效
组件中的org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer
使用runScripts
方法执行请求URL
内容中的SQL
代码,造成RCE
漏洞
最新的Spring Cloud Gateway SPEL的RCE漏洞
本质还是SPEL
表达式,本来这是一个需要修改配置文件导致的鸡肋RCE
漏洞
但因为Gateway
提供了Actuator
相关的API
可以动态地注册Filter
,而在注册的过程中可以设置SPEL
表达式
实战利用程度可能不高,目标未必开着Actuator
接口,就算开放也不一定可以正常访问注册Filter
的接口
最新的Spring Cloud Gateway SPEL的RCE漏洞可以回显吗
{
"name": "AddResponseHeader",
"args": {
"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",
"name": "cmd123"
}
}
最新的Spring Cloud Gateway SPEL的RCE修复
参考很多SPEL
漏洞的修复手段,默认情况使用StandardContext
可以执行Runtime.getRuntime().exec()
这样的危险方法
修复是重写一个GatewayContext
用来执行SPEL
,这个context
的效果是只能执行有限的操作
有任何意见请评价。