龙空技术网

Mysql溯源-任意文件读取

大数据架构师 414

前言:

现时各位老铁们对“mysql读取本地文件”可能比较讲究,朋友们都想要学习一些“mysql读取本地文件”的相关资讯。那么小编同时在网上网罗了一些对于“mysql读取本地文件””的相关文章,希望姐妹们能喜欢,各位老铁们一起来了解一下吧!

读了《MySQL蜜罐获取攻击者微信ID》的文章,文中说明了通过mysql蜜罐读取攻击者微信ID的过程,抱着学习的态度尝试了一下

1|2原理

mysql中有一个load data local infile函数能够读取本地文件到mysql数据库中。当攻击者用爆破mysql密码的扫描器扫描到我们的mysql并连接上的时候,客户端(攻击者)会自动发起一个查询,我们(服务端)会给与一个回应,我们在回应的数据包中加入load data local infile读取攻击者的本地文件到我们数据库中,达到反制的目的。

1|3具体过程LOAD DATA INFILE

LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并写入一个表中。文件名称必须为一个文字字符串。

LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相对语句。把表的数据备份到文件使用SELECT ... INTO OUTFILE,从备份文件恢复表数据,使用 LOAD DATA INFILE。基本语法如下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'    [REPLACE | IGNORE]    INTO TABLE tbl_name    [FIELDS        [TERMINATED BY 'string']        [[OPTIONALLY] ENCLOSED BY 'char']        [ESCAPED BY 'char' ]    ]    [LINES        [STARTING BY 'string']        [TERMINATED BY 'string']    ]    [IGNORE number LINES]    [(col_name_or_user_var,...)]    [SET col_name = expr,...)]

这个功能默认是关闭的,当我们本地mysql服务器没有开启这个功能执行时会报错:

我们可以通过如下命令查看功能状态

show global variables like 'local_infile';

我们通过如下命令开启这个功能:

set global local_infile=1;

然后我们通过如下命令尝试读取本地的C盘目录下的1.txt文件

load data local infile 'C:/1.txt' into table test fields terminated by '\n';

1|4通信过程

我们模拟一下攻击者通过扫描器连接MySQL数据库的通信过程

工具:Wireshark

首先我们通过Wireshark抓取通信流量查看一下通信过程

注意:当自己电脑既是客户端又是服务器时,互相访问时流量并没有经过网卡,windows系统又没有提供本地回环网络的接口,wireshark在windows系统上默认使用的是WinPcap来抓包的,用它监控网络的话只能看到经过网卡的流量,看不到访问localhost的流量,所以才会出现第一次连接始终没有数据包的状况。解决这个问题的两种办法是:要么服务器和客户端不要在同一台机器上,要么用Npcap来替换掉WinPcap,Npcap提供环回接口
1. 首先是Greeting包,返回了服务端的版本信息2. 接着是客户端发起连接请求3. 然后经过TCP的三次握手之后,客户端会自动发起一次查询,服务端会给予一个回应

我们就是在上面的最后一步回应中插入读取客户端本地文件的语句,从而读取客户端的本地文件到数据库表中。

1|5漏洞复现

下载地址:

1. 解压压缩包

然后编辑rogue_mysql_server.py这个文件,修改里面的读取文件的路径(windows或者linux的路径都行)

2. 用python启动rogue_mysql_server.py3. 查看数据库端口是否开启nmap -sS -p- 192.168.33.2224. 我们用自己的数据库连接软件(例如Navicat)去连接我们刚刚创建的恶意mysql服务器IP:192.168.33.222PORT:3306USERNAME:rootPASSWORD:(空的就行)5. 然后我们会看到当前目录下面多了一个mysql.log文件,我们发现本地的C:/1.txt文件被读取到了mysql.log文件中6. 我们通过Wireshark看看这个实验过程通信的数据包首先Greeting包,服务器返回版本信息然后就是客户端请求连接的登录包接着就是服务器回应的一个数据包(ok)接下来我们重点分析后面分析后面三个数据包

这个数据包是像形如Navicat这种数据库连接软件在连接之前都会自动发送的一个请求查询的。从查阅资料来看,大多数MySQL客户端以及程序库都会在握手之后至少发送一次请求,以探测目标平台的指纹信息

SET NAMES utf8mb4

接下来就是服务器端给出的回应包,但是这个数据包里面大有文章,包含了读取本地C:/1.txt文件的命令

然后我们就发现接下来客户端就把服务器请求的1.txt文件传输到了服务器。

2|0实验结束3|0参考文章

__EOF__

原文链接:

标签: #mysql读取本地文件 #mysqlinfilelocal