博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql客户端反向映射entity_Mysql服务端反向读取客户端的任意文件
阅读量:5322 次
发布时间:2019-06-14

本文共 2394 字,大约阅读时间需要 7 分钟。

1 原理

Mysql服务端反向读取客户端的任意文件

利用LOAD DATA INFILE这个语法,这个语法主要用于读取一个文件的内容并且放到一个表中。

load data infile "/data/data.csv" into table TestTable;

load data local infile "/home/lightless/data.csv" into table TestTable;

第一行是读取服务端本地的文件,第二行是读取客户端本地的文件

而反向读取就是利用了第二行用法。

正常流程:

s1 客户端:hi~ 我将把我的 data.csv 文件给你插入到 test 表中!

s2 服务端:OK,读取你本地 data.csv 文件并发给我!

s3 客户端:这是文件内容:balabal!

当s2时,服务端返回给客户端的不是data.csv,而是其他文件时,就会发生如下事情

s1 客户端:hi~ 我将把我的 data.csv 文件给你插入到 test 表中!

s2 服务端:OK,读取你本地的 / etc/passwd 文件并发给我!

s3 客户端:这是文件内容:balabal(/etc/passwd 文件的内容)!

为什么会这样?

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.”

9830f6333118c110fcd469e5d08cde3a.png

客户端读取哪个文件其实不是自己说了算,是服务端说了算,也就是以s2时服务端返回的文件目标为准!

到了这里有个问题,如果客户端不主动使用LOAD DATA INFILE,是不是就没事了呢?

还是官方文档:

"A patched server could in fact reply with a file-transfer request to any statement, not just LOAD DATA LOCAL"

7be7d0a058fdf70f277947460e5e4725.png

意思就是,伪造的服务端可以在任何时候回复一个 file-transfer 请求,不一定非要是在LOAD DATA LOCAL的时候。

一些Mysql客户端,比如python的MySQLdb和mysqlclient,php的mysqli和PDO,java的JDBC Driver以及原生mysql客户端等等,在连接MySQL的时候,基本上在连接成功之后都会发出一些SELECT语句来查询一些版本号、编码之类的数据,这时就可以回复一个 file-transfer 请求,读取客户端上的文件。

这里有一点要说明的是,如果想要利用此特性,客户端必须具有 CLIENT_LOCAL_FILES 属性,所以可能要添加--enable-local-infile。

总结一下漏洞的成因:

LOAD DATA INFILE读哪个文件是由服务端返回包的file-transfer 请求决定,而不是客户端

不管客户端发出什么请求,只要服务端回复一个 file-transfer 请求,客户端就会按照LOAD DATA INFILE的流程读取文件内容发给服务端

总结一下整个攻击流程:

受害者向攻击者提供的服务器发起请求,并尝试进行身份认证

攻击者的MySQL接受到受害者的连接请求,攻击者发送正常的问候、身份验证正确,并且向受害者的MySQL客户端请求文件。

受害者的MySQL客户端认为身份验证正确,执行攻击者的发来的请求,通过LOAD DATA INLINE 功能将文件内容发送回攻击者的MySQL服务器。

攻击者收到受害者服务器上的信息,读取文件成功,攻击完成。

做个补充:

甚至不需要真的搞个Mysql服务,在mysql客户端连接时,模仿服务端返回Server Greeting

等待 Client 端发送一个Query Package后

回复一个file transfer请求

即可读取到文件

复现用的脚本既是这样实现

2 条件

受害者的Mysql客户端有权限读文件

受害者的Mysql客户端设置中,local_infile非0或连接时有用--enable-local-infile,默认是能够读取的

3 利用场景

利用重装漏洞,读取目标服务器上的任意文件

利用目标的数据迁移等,能连接外部数据库的功能点,读取目标服务器上的任意文件

搭建在蜜罐上读取攻击者的信息,蓝队溯源/反制

4 复现

大佬写好的脚本

https://github.com/allyshka/Rogue-MySql-Server

roguemysqlserver.py的filelist为读取受害者的文件地址,读Win注意路径

python2运行roguemysqlserver.py,服务器开放端口和防火墙即可

4.1 mysql原生client

ubuntu18/Win10

服务端运行roguemysqlserver.py

3149a7dd041e5feec6c5f4d72b57be48.png

客户端连接

其实无需密码即可连接上,即mysql -h即可连接上

c91f29f756d920cde8549673a82fbdf2.png

读取文件

eda456e0dd5cd58394e6af1608bdf617.png

64e2b7ecdb828e51180c46d0148b76b7.png

4.2 navicat premium12

ubuntu18/Win10

客户端

d0ca790e03b8d44f8452627e17b20f4e.png

读取文件

eff7c4b597792b83f31eda84bdb78f10.png

cd02d48586a6b2503d2a8af9caaad0dc.png

4.3 公网测试

尝试读取多个文件时,发现原脚本所读文件不存在时,并不是继续读下一个文件,而是停了下来。。。。

能力有限,不会修改,希望有大佬赐教

一晚上只有几台机器连上来,还读不到文件就很难受

4a98486e8a9ba111c968473cff10e640.png

几天了,很多IP连进来,但是没一个读到的,有一上海的IP,好像不信邪,试了好几次。。。

397cd3bb3ec6d09f60a77c0e53b31232.png

4.4 其他大佬写的利用工具

5 防御/修复

6 参考

转载地址:http://hihhv.baihongyu.com/

你可能感兴趣的文章
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>
面向对象的优点
查看>>
套接口和I/O通信
查看>>