MySQL客户端任意文件读取漏洞

原理

1、通信机制
由于MySQL服务端和客户端通信过程是通过对话形式完成的。客户端发送一个操作请求,服务端会根据客户端发送的请求进行响应。在这个通信过程中,如果一个操作需要两步才能完成,当客户端发完第一个请求后,它会直接丢弃第一个请求,并不会做存储;然后客户端会根据服务端的响应,进行第二个请求,此时服务端就可以欺骗客户端。
2、语法说明
MySQL服务端反向读取客户端的任意文件是利用了LOAD DATA INFILE语法,该语法主要用于读取文件内容并插入到表中。

-- 读取服务端本地文件,并插入到表中
load data infile "/data/data.csv" into table test_table;
-- 读取客户端本地文件,并插入到表中
load data local infile "/data/data.csv" into table test_table;

针对该语法,MySQL官方文档原文:
In theory, a patched server could be built that would tell the client program to transfer a file of the server’s choosing rather than the file named by the client in the LOAD DATA statement.” 从理论上讲,可以构建一个经过修补的服务器,该服务器会指示客户端程序传输由服务器选择的文件,而不是客户端在 LOAD DATA 语句中指定的文件.
即客户端读取的文件内容,并不是由客户端决定的,而是根据服务端的响应决定的,于是就可以伪造MySQL服务器,实现通信示例3的效果。
举例说明:

  1. 一般流程:
客户端:请把表test的数据给我看看
服务端:请查收表test的数据
通信结束...
  1. LOAD DATA INFILE正常流程
客户端:我将把我本地的data.csv文件发给你插入到表test
服务端:好的,请读取你本地的data.csv文件内容并发给我
客户端: 这是文件里的数据:1234567
通信结束...
  1. LOAD DATA INFILE欺骗流程
客户端:我将把我本地的data.csv文件发给你插入到表test
服务端:好的,请读取你本地的/etc/passwd文件内容并发给我
客户端: 这是文件里的数据:xxxxxx(/etc/passwd文件中内容)
通信结束...

漏洞复现

1、在服务端服务器获取https://github.com/allyshka/Rogue-MySql-Server的脚本
2、修改rogue_mysql_server.py设置要读取的文件名
rogue_mysql_server.py中的filelist 为要读取的文件地址,例如可改为:

filelist = (
    '/etc/passwd',
)

3、在服务端服务器python2运行rogue_mysql_server.py,服务器开放端口和防火墙即可
说明: 使用python3会报错。
4、客户端连接:在目标服务器使用mysql指令连接
说明: mysql客户端需为8.0以下,否则可能无法获取到想要的数据。
在这里插入图片描述
5、在服务端服务器的rogue_mysql_server.py路径下,会生成一个mysql.log文件,其中就记录了客户端服务器的文件内容.
在这里插入图片描述

使用场景

1、利用该漏洞,读取目标服务器上的任意文件
2、利用目标网站能连接外部数据库的功能点,读取目标服务器上的任意文件

防范措施

1.使用--ssl-mode=VERIFY_IDENTITY来建立可信的连接
2.mysql客户端设置local_infile为0

### 任意文件读取漏洞概述 #### 原理 任意文件读取漏洞的核心在于应用程序未能正确校验用户输入的文件路径或名称,导致攻击者能够访问到预期范围外的文件。这种漏洞通常发生在文件操作函数未对传入参数进行严格过滤的情况下,使得攻击者可以通过构造恶意路径来获取目标系统的敏感数据[^1]。 在Web应用中,该漏洞可能源于开发人员错误地信任用户的输入,在处理诸如文件下载链接、动态加载模板等功能时缺乏必要的安全性验证机制。例如,如果允许用户指定要下载的文件名而没有实施白名单策略,则可能导致未经授权的数据暴露[^2]。 #### 利用方式 攻击者利用此类漏洞的主要手段包括但不限于以下几种: - **路径遍历**:通过向服务器发送带有特殊字符序列(如`../`)的请求,尝试突破当前工作目录限制并访问其他位置上的资源。比如,在Linux环境下常用测试字符串为`../../../../../../etc/passwd`;而在Windows平台则可能是类似`..\..\..\..\..\windows\win.ini`这样的结构[^3]。 - **MySQL 文件读取**:某些情况下,数据库交互也可能成为突破口之一。假设存在可被操控的 MySQL 连接过程,并且客户端库支持远程执行 `LOAD_FILE()` 函数调用的话,那么一旦连接至由黑客控制的服务端实例之后便能轻易达成目的[^4]。 以下是基于 PHP 的简单演示代码片段用于说明如何潜在触发这一类型的缺陷: ```php <?php // 不安全的做法 - 缺少适当的安全措施 $file = $_GET['file']; readfile($file); ?> ``` 上述脚本直接将未经审查过的查询变量 `$file` 提供给内置方法 `readfile()`, 如果外部访客提交形如 `/flag.txt%00.jpg` (其中 `%00` 表示 NULL 字节注入技术) 或者更复杂的组合形式作为 GET 参数值, 就极有可能成功绕过初步筛选进而完成非法行为. #### 防御方法 为了有效防范这类风险的发生,可以从以下几个方面着手改进: - 实施严格的输入验证流程,仅接受已知合法选项列表内的项目; - 对所有涉及本地磁盘存取的操作均需附加额外权限检查逻辑; - 移除不必要的危险功能模块及其关联接口; - 定期更新依赖组件版本号以修复已公开报告的相关隐患问题。 下面给出一段改良后的PHP示范代码样本供参考学习之用: ```php <?php $whitelist = ['report.pdf', 'summary.csv']; // 白名单定义区域 if(isset($_GET["file"]) && in_array(basename($_GET["file"]), $whitelist)){ readfile('protected/' . basename($_GET["file"])); }else{ echo "Invalid request."; } ?> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值