从MySQL出发的反击之路
字数 1292 2025-08-18 11:37:42

MySQL客户端文件读取漏洞分析与利用

漏洞概述

MySQL客户端文件读取漏洞是一种利用MySQL协议特性实现从客户端读取任意文件的安全问题。该漏洞源于MySQL的LOAD DATA INFILE功能,攻击者可以伪造MySQL服务器,诱导客户端发送本地文件内容。

漏洞原理

正常流程

  1. 客户端发起连接请求
  2. 服务端响应认证信息
  3. 客户端发送查询请求
  4. 服务端返回查询结果

恶意流程

  1. 客户端发起连接请求
  2. 攻击者伪造的MySQL服务器响应认证信息
  3. 客户端发送查询请求
  4. 攻击者返回LOAD DATA INFILE请求而非正常查询结果
  5. 客户端根据响应上传指定文件内容

关键点

  • MySQL协议中客户端不存储自身请求,而是通过服务端响应执行操作
  • 大多数MySQL客户端在建立连接后会发送查询请求(如查询版本信息)
  • LOAD DATA INFILE功能设计用于读取客户端文件并导入表中
  • 攻击者可利用这一特性诱导客户端发送任意文件

漏洞利用工具

Bettercap实现

Bettercap已集成恶意MySQL服务器模块,使用简单:

$ sudo bettercap -eval "set mysql.server.infile /etc/hosts; mysql.server on"

关键代码逻辑:

  1. 监听3306端口
  2. 发送伪造的MySQL欢迎包
  3. 响应客户端查询请求
  4. 发送LOAD DATA INFILE请求
  5. 接收并记录客户端发送的文件内容

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}')

利用场景

  1. 被动监听:在3306端口运行恶意服务器,等待扫描器或误连接客户端

  2. 主动诱导

    • 在GitHub上传包含伪造MySQL配置的代码
    • 等待企业代码监控系统发现并连接测试
    • 获取企业内部文件
  3. 结合其他漏洞:如AWVS 8和10的命令执行漏洞,增强攻击效果

防御措施

  1. 客户端配置

    • MySQL客户端默认禁用LOCAL INFILE功能
    • 连接时需显式指定--enable-local-infile参数
  2. 网络层面

    • 限制出站连接到可信MySQL服务器
    • 监控异常MySQL连接行为
  3. 代码审查

    • 检查配置文件中的数据库连接信息
    • 避免在代码中硬编码测试环境配置

技术细节

MySQL协议关键点

  1. 能力协商:连接建立时客户端和服务端交换支持的功能
  2. 认证流程:服务端先发送欢迎包,客户端响应认证信息
  3. 查询流程:客户端发送查询,服务端返回结果或指令

漏洞利用必要条件

  1. 客户端支持LOCAL INFILE功能
  2. 客户端在连接后自动发送查询请求
  3. 攻击者能拦截或诱导客户端连接到恶意服务器

扩展利用

  1. 读取特定文件

    • /etc/passwd:获取用户信息
    • ~/.ssh/id_rsa:获取SSH私钥
    • 应用配置文件:获取数据库凭证等敏感信息
  2. 结合其他协议

    • 利用UNC路径读取Windows共享文件
    • 结合SMB协议实现NTLM中继攻击
  3. 高级利用

    • 读取内存内容(需特定条件)
    • 结合文件上传实现有限制的RCE

总结

MySQL客户端文件读取漏洞展示了协议设计特性可能被滥用的典型案例。虽然现代MySQL客户端默认禁用相关功能,但在特定配置下仍可能被利用。防御需要客户端和服务端的共同配合,包括禁用不必要功能、监控异常连接等。

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