初探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中存在两种文件读取语句:

  1. 读取服务端本地文件:
LOAD DATA INFILE "C:/Windows/win.ini" INTO TABLE test FIELDS TERMINATED BY '\n';
  1. 读取客户端本地文件(关键语句):
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. 漏洞原理

正常流程:

  1. 客户端执行LOAD DATA LOCAL INFILE语句
  2. 服务端返回需要读取的文件路径
  3. 客户端发送指定文件内容到服务端

攻击流程:

  1. 攻击者伪造恶意MySQL服务器
  2. 客户端连接恶意服务器
  3. 无论客户端发送什么查询,恶意服务器都返回文件读取请求
  4. 客户端将本地文件内容发送给恶意服务器

4. 环境搭建

4.1 实验环境

  • 客户端:Windows 11 (192.168.134.1)
  • 服务端:Kali Linux (192.168.134.132)

4.2 服务端配置

  1. 启动MySQL服务:
service mysql start
  1. 允许远程连接:
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抓包可观察到:

  1. Sever Greeting包:服务端协议号、版本号和salt值
  2. 客户端登录包:用户名和密码哈希
  3. 查询包:客户端发送查询
  4. 文件请求包:服务端返回需要读取的文件路径
  5. 文件内容包:客户端发送文件内容

6. 漏洞利用

6.1 恶意服务器构造

恶意MySQL服务器需要实现以下功能:

  1. 构造Greeting包发送给客户端
  2. 允许任意密码登录
  3. 构造TABULAR包(包含要读取的文件名)
  4. 接收文件内容并返回响应

6.2 利用工具

可使用现成脚本如Rogue-MySql-Server

  1. 修改脚本中的目标文件路径(如Windows系统):
filelist = ['c:\\windows\\system32\\drivers\\etc\\hosts']
  1. 启动恶意服务器:
python rogue_mysql_server.py
  1. 检查端口是否开启:
nmap -sS -p- 192.168.134.132

6.3 客户端连接

使用任意MySQL客户端(如Navicat或命令行)连接恶意服务器:

  • 任意用户名
  • 空密码或任意密码

连接成功后,恶意服务器会获取指定文件内容并保存到本地(如mysql.log)。

7. 防御措施

  1. 客户端防护:

    • 禁用LOCAL功能:在my.cnf中添加local-infile=0
    • 使用--local-infile=0参数启动客户端
    • 更新MySQL客户端到最新版本
  2. 服务端防护:

    • 限制LOAD DATA LOCAL权限
    • 监控异常MySQL连接请求
  3. 网络防护:

    • 限制出站MySQL连接
    • 使用网络防火墙规则过滤可疑流量

8. 参考资源

  1. Rogue-MySql-Server项目
  2. MySQL协议分析文章
  3. MySQL官方文档
MySQL反向读取文件漏洞分析与利用 1. 漏洞概述 MySQL反向读取文件漏洞是一种利用MySQL客户端特性实现从客户端读取任意文件的安全问题。该漏洞的核心在于滥用MySQL的 LOAD DATA LOCAL INFILE 语句,通过伪造恶意MySQL服务器诱骗客户端发送本地文件内容。 2. 前置知识 2.1 LOAD DATA INFILE语句 MySQL中存在两种文件读取语句: 读取服务端本地文件: 读取客户端本地文件(关键语句): 2.2 服务端配置要求 服务端需要开启 LOAD DATA INFILE 功能 可以通过以下SQL查询是否开启: 3. 漏洞原理 正常流程: 客户端执行 LOAD DATA LOCAL INFILE 语句 服务端返回需要读取的文件路径 客户端发送指定文件内容到服务端 攻击流程: 攻击者伪造恶意MySQL服务器 客户端连接恶意服务器 无论客户端发送什么查询,恶意服务器都返回文件读取请求 客户端将本地文件内容发送给恶意服务器 4. 环境搭建 4.1 实验环境 客户端:Windows 11 (192.168.134.1) 服务端:Kali Linux (192.168.134.132) 4.2 服务端配置 启动MySQL服务: 允许远程连接: 5. 漏洞验证 5.1 正常文件读取 客户端执行: 5.2 流量分析 使用Wireshark抓包可观察到: Sever Greeting包:服务端协议号、版本号和salt值 客户端登录包:用户名和密码哈希 查询包:客户端发送查询 文件请求包:服务端返回需要读取的文件路径 文件内容包:客户端发送文件内容 6. 漏洞利用 6.1 恶意服务器构造 恶意MySQL服务器需要实现以下功能: 构造Greeting包发送给客户端 允许任意密码登录 构造TABULAR包(包含要读取的文件名) 接收文件内容并返回响应 6.2 利用工具 可使用现成脚本如 Rogue-MySql-Server : 修改脚本中的目标文件路径(如Windows系统): 启动恶意服务器: 检查端口是否开启: 6.3 客户端连接 使用任意MySQL客户端(如Navicat或命令行)连接恶意服务器: 任意用户名 空密码或任意密码 连接成功后,恶意服务器会获取指定文件内容并保存到本地(如mysql.log)。 7. 防御措施 客户端防护: 禁用 LOCAL 功能:在my.cnf中添加 local-infile=0 使用 --local-infile=0 参数启动客户端 更新MySQL客户端到最新版本 服务端防护: 限制 LOAD DATA LOCAL 权限 监控异常MySQL连接请求 网络防护: 限制出站MySQL连接 使用网络防火墙规则过滤可疑流量 8. 参考资源 Rogue-MySql-Server项目 MySQL协议分析文章 MySQL官方文档