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

 更新时间:2025年02月22日 08:41:08   作者:不会画画的画师  
本文介绍了MySQL服务端反向读取客户端任意文件的漏洞原理,利用LOADDATAINFILE语法实现,通过伪造MySQL服务器,客户端读取的文件内容由服务端决定,漏洞复现步骤包括获取脚本、修改配置、运行服务器、客户端连接并查看日志,防范措施包括使用SSL模式和设置local_infile为0

原理

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL获取二维数组字符串的最后一个值的实现代码

    MySQL获取二维数组字符串的最后一个值的实现代码

    这篇文章主要介绍了MySQL获取二维数组字符串的最后一个值的实现,文中有详细的代码示例供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-04-04
  • MySql中的longtext字段的返回问题及解决

    MySql中的longtext字段的返回问题及解决

    这篇文章主要介绍了MySql中的longtext字段的返回问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • mysql数据库如何求时间差

    mysql数据库如何求时间差

    这篇文章主要给大家介绍了关于mysql数据库如何求时间差的相关资料,MySQL提供了许多用于计算时间差的函数,可以方便地计算两个时间之间的时间差、取出时间段中的时间间隔等,需要的朋友可以参考下
    2023-08-08
  • 达梦数据库兼容mysql GROUP BY查询的设置方式

    达梦数据库兼容mysql GROUP BY查询的设置方式

    作为一名数据库管理员或开发者,当项目需要从MySQL迁移到达梦数据库时,最关心的莫过于兼容性问题,这篇文章主要介绍了达梦数据库兼容mysql GROUP BY查询的设置方式,需要的朋友可以参考下
    2025-11-11
  • Mac Homebrew安装的MySQL无法远程登录的解决

    Mac Homebrew安装的MySQL无法远程登录的解决

    这篇文章主要介绍了Mac Homebrew安装的MySQL无法远程登录的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL表分区的几种实现

    MySQL表分区的几种实现

    本文主要介绍了MySQL表分区的几种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • PostgreSQL与MySQL区别全面对比详析

    PostgreSQL与MySQL区别全面对比详析

    MySQL和PostgreSQL都是强大的关系型数据库管理系统,但它们适用于不同的用例和需求,下面这篇文章主要介绍了PostgreSQL与MySQL区别全面对比的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • 教你3个步骤为Mysql添加只读账号

    教你3个步骤为Mysql添加只读账号

    只要公司有数据团队的那免不了让这帮家伙把全公司的数据库数据都摸一遍,但是要是直接把root用户给了他们有点危险,于是只能给设权限,这篇文章主要给大家介绍了关于如何通过3个步骤为Mysql添加只读账号的相关资料,需要的朋友可以参考下
    2023-12-12
  • MySQL配置文件my.ini全过程

    MySQL配置文件my.ini全过程

    这篇文章主要介绍了MySQL配置文件my.ini全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • sqlmap注入图文详解

    sqlmap注入图文详解

    sqlmap 是一个自动SQL 射入工具。本文收集了一些利用Sqlmap做注入测试的TIPS,其中也包含一点绕WAF的技巧,便于大家集中查阅,希望能给你带来帮助
    2021-08-08

最新评论