【复现】Mysql任意读取客户端文件
0x01 漏洞成因
该漏洞的核心原理在于MySQL服务端可以利用LOAD DATA LOCAL
命令来读取MYSQL客户端的任意文件
根据MySQL的官方文档,连接握手阶段中会执行如下操作:
- 客户端和服务端交换各自功能
- 如果需要则创建SSL通信通道
- 服务端认证客户端身份
身份认证通过后,客户端会在实际操作之前发送请求,等待服务器的响应。“Client Capabilities”报文中包括名为Can Use LOAD DATA LOCAL
的一个条目:
一旦客户端启用了这个功能(比如通过--enable-local-infile
标志),文件就可以从运行MySQL客户端的那台主机中读取并传输到远程服务器上。
正常示例:
客户端 Win10 / 10.112.32.136
服务端 Centos7 / 10.112.32.138
mysql -h10.112.32.138 -ufast -p --enable-local-infile
登录成功后输入
LOAD DATA LOCAL INFILE 'C:\\Windows\\System32\\drivers\\etc\\hosts' into table fast.test FIELDS TERMINATED BY "\n";
select * from fast.test;
可以看到客户端 Win10 中的 hosts 文件成功被写入到服务端 Centos7 Mysql 数据库中。
0x02 漏洞利用
正常的请求逻辑如下
示例:客户端 Win10 服务端 Centos7
mysql -h10.112.32.138 -ufast -p --enable-local-infile
登录成功后输入
LOAD DATA LOCAL INFILE 'C:\\Windows\\System32\\drivers\\etc\\hosts' into table fast.test FIELDS TERMINATED BY "\n";
select * from fast.test;
【客户端发送load data infile
请求】
【服务器回复Response TABULAR
】
这是正常的情况,即客户端发送一个load data infile
请求,服务器回复一个Response TABULAR
,不会出现什么问题。
但是Mysql允许服务端在任何时候发送Response TABULAR
数据包, 此时就跳过了第一步,实现了任意文件读取的目的。
恶意Mysql服务器只需要完成Mysql连接的握手包,然后发送出这个Response TABULAR
包,即可收到客户端传来的文件。
恶意示例:
客户端 Win10 / 10.112.32.136
恶意服务端 Ubuntu16 / 10.112.32.45
恶意服务端POC https://github.com/allyshka/Rogue-MySql-Server/blob/master/rogue_mysql_server.py
mysql -h10.112.32.45 -ufast -p --enable-local-infile
登录成功后,无需操作即可被攻击
分析数据包:可以看到,当客户端连接恶意服务端后,会直接发送一个
select @@version_comment limit 1
请求,用于探测服务端的指纹信息,(大多数MySQL客户端以及程序库都会在握手之后至少发送一次该请求)
此时恶意服务端会回复一个Response TABULAR
请求,该请求中包含一个 LOCAL INFILE 地址,
接着客户端就回复给服务端本地C:\Windows\System32\drivers\etc\hosts
中的内容。
同时,可以在恶意服务端查看log日志,看是否成功获取到客户端信息,
可以看到,客户端文件数据已被写到恶意服务端,至此,一个完整的攻击流程已展示完成。
0x03 漏洞思考
由于部分 cms 提供通过后台绑定数据库地址,那么可以考虑通过构造恶意服务端利用上述方式获取到一些敏感信息。
0x04 参考引用
- https://www.anquanke.com/post/id/106488
- https://www.anquanke.com/post/id/173039
- https://paper.seebug.org/998/
- https://github.com/allyshka/Rogue-MySql-Server/blob/master/rogue_mysql_server.py
评论27次
楼主的解释很详细了
楼主的解释很详细了
最近经常被用在各大CTF玩这套路
这个可以用来社工?比如在论坛发一个《测试XX钓鱼网站》,然后在文章发一个钓鱼网站的数据库地址和账号密码,肯定有很多萌新看到文章会去测试,然后就中招。
老哥,你的这个思路是真的骚
这个可以用来社工?比如在论坛发一个《测试XX钓鱼网站》,然后在文章发一个钓鱼网站的数据库地址和账号密码,肯定有很多萌新看到文章会去测试,然后就中招。
可以拿来做蜜罐钓鱼啦
这个用作后门,或者定位后面的操作人员比较合适。
这个可以用来社工?比如在论坛发一个《测试XX钓鱼网站》,然后在文章发一个钓鱼网站的数据库地址和账号密码,肯定有很多萌新看到文章会去测试,然后就中招。
感觉可以用来后期维权
LOAD DATA 这个不是低权限也能用的读文件的吗
第一反应是用来做密罐倒打一耙
我记得LOAD DATA LOCAL这个如果你权限不够也是读不到的。
这个挺老的呀,论坛利用工具都有好几拨吧
嗯嗯,本文是复现下相关过程
https://www.t00ls.com/viewthread.php?tid=51246&highlight=mysqlhttps://lightless.me/archives/read-mysql-client-file.htmlhttp://russiansecurity.expert/2016/04/20/mysql-connect-file-read/
赞
记得phpmyadmin开启登录远程服务器后会产生这个任意文件读的漏洞
正常的web权限也可以操作吗?
https://www.t00ls.com/viewthread.php?tid=51246&highlight=mysql https://lightless.me/archives/read-mysql-client-file.html http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/
有点6呀,这个很强势
这个挺老的呀,论坛利用工具都有好几拨吧
如果客户端是用navicat连接,能读取到文件不
可以的,仔细看三篇链接的ppt
后面的没看懂,但是貌似权限没有讲明白,以前有见过分析 魔法传送门=>https://www.t00ls.com/articles-26813.html