初探Mysql反向读取文件
字数 1207 2025-08-11 23:26:43
MySQL反向读取文件漏洞分析与利用
1. 漏洞概述
MySQL反向读取文件漏洞是一种利用MySQL客户端特性实现从客户端读取任意文件的安全问题。该漏洞的核心在于滥用MySQL的LOAD DATA LOCAL INFILE语句,通过伪造恶意MySQL服务器诱骗客户端发送本地文件内容。
2. 前置知识
2.1 LOAD DATA INFILE语句
MySQL中存在两种文件读取语句:
- 读取服务端本地文件:
LOAD DATA INFILE "C:/Windows/win.ini" INTO TABLE test FIELDS TERMINATED BY '\n';
- 读取客户端本地文件(关键语句):
LOAD DATA LOCAL INFILE "C:/Windows/win.ini" INTO TABLE test FIELDS TERMINATED BY '\n';
2.2 服务端配置要求
- 服务端需要开启
LOAD DATA INFILE功能 - 可以通过以下SQL查询是否开启:
SHOW VARIABLES LIKE 'local_infile';
3. 漏洞原理
正常流程:
- 客户端执行
LOAD DATA LOCAL INFILE语句 - 服务端返回需要读取的文件路径
- 客户端发送指定文件内容到服务端
攻击流程:
- 攻击者伪造恶意MySQL服务器
- 客户端连接恶意服务器
- 无论客户端发送什么查询,恶意服务器都返回文件读取请求
- 客户端将本地文件内容发送给恶意服务器
4. 环境搭建
4.1 实验环境
- 客户端:Windows 11 (192.168.134.1)
- 服务端:Kali Linux (192.168.134.132)
4.2 服务端配置
- 启动MySQL服务:
service mysql start
- 允许远程连接:
USE mysql;
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
5. 漏洞验证
5.1 正常文件读取
客户端执行:
LOAD DATA LOCAL INFILE "C:/Windows/win.ini" INTO TABLE test FIELDS TERMINATED BY '\n';
5.2 流量分析
使用Wireshark抓包可观察到:
- Sever Greeting包:服务端协议号、版本号和salt值
- 客户端登录包:用户名和密码哈希
- 查询包:客户端发送查询
- 文件请求包:服务端返回需要读取的文件路径
- 文件内容包:客户端发送文件内容
6. 漏洞利用
6.1 恶意服务器构造
恶意MySQL服务器需要实现以下功能:
- 构造Greeting包发送给客户端
- 允许任意密码登录
- 构造TABULAR包(包含要读取的文件名)
- 接收文件内容并返回响应
6.2 利用工具
可使用现成脚本如Rogue-MySql-Server:
- 修改脚本中的目标文件路径(如Windows系统):
filelist = ['c:\\windows\\system32\\drivers\\etc\\hosts']
- 启动恶意服务器:
python rogue_mysql_server.py
- 检查端口是否开启:
nmap -sS -p- 192.168.134.132
6.3 客户端连接
使用任意MySQL客户端(如Navicat或命令行)连接恶意服务器:
- 任意用户名
- 空密码或任意密码
连接成功后,恶意服务器会获取指定文件内容并保存到本地(如mysql.log)。
7. 防御措施
-
客户端防护:
- 禁用
LOCAL功能:在my.cnf中添加local-infile=0 - 使用
--local-infile=0参数启动客户端 - 更新MySQL客户端到最新版本
- 禁用
-
服务端防护:
- 限制
LOAD DATA LOCAL权限 - 监控异常MySQL连接请求
- 限制
-
网络防护:
- 限制出站MySQL连接
- 使用网络防火墙规则过滤可疑流量