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不推荐使用uuid或者雪花id作为主键的原因分析

    MySQL不推荐使用uuid或者雪花id作为主键的原因分析

    在数据库设计中,选择适当的主键类型对于数据的存储和查询效率至关重要,在MySQL中,有些开发者倾向于使用UUID或者雪花ID作为主键,以确保数据的唯一性,本文将探讨在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并与其他主键类型进行差异化对比
    2023-11-11
  • Oracle10个分区和Mysql分区区别详解

    Oracle10个分区和Mysql分区区别详解

    MySQL分区常用的是:range、list、hash、key,Oracle10g分区常用的是:range(范围分区)、list(列表分区)、hash(哈希分区)、range-hash(范围—哈希分区)、range-list(列表—复合分区)。下面通过本文详细给大家介绍Oracle10个分区和Mysql分区区别,一起看看
    2017-02-02
  • mysql 8.0.22 安装配置图文教程

    mysql 8.0.22 安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.22 安装配置图文教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • MySQL中关于null值的一个小问题

    MySQL中关于null值的一个小问题

    这篇文章主要介绍了MySQL中关于null值的一个小问题,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • MySQL数据库备份过程的注意事项

    MySQL数据库备份过程的注意事项

    这篇文章主要介绍了MySQL数据库备份过程的注意事项,帮助大家更好的理解和维护MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL插入不了中文数据问题的原因及解决

    MySQL插入不了中文数据问题的原因及解决

    最近发现新安装的MySQL数据库不能插入中文字段,所以下面这篇文章主要给大家介绍了关于MySQL插入不了中文数据问题的原因及解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • win10下mysql 8.0.18 安装配置方法图文教程(windows版)

    win10下mysql 8.0.18 安装配置方法图文教程(windows版)

    这篇文章主要介绍了windows版的mysql 8.0.18 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 详解MySQL 8.0 之不可见索引

    详解MySQL 8.0 之不可见索引

    这篇文章主要介绍了MySQL 8.0 之不可见索引的相关资料,帮助大家更好的理解和学习新版本的MySQL,感兴趣的朋友可以了解下
    2020-10-10
  • mysql binlog二进制日志详解

    mysql binlog二进制日志详解

    二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句
    2011-10-10
  • 连接mysql报错——没有设置“usessl=false”的问题

    连接mysql报错——没有设置“usessl=false”的问题

    这篇文章主要介绍了连接mysql报错——没有设置“usessl=false”的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论