Mysql任意读取客户端文件

作者: secflag 分类: 渗透测试,漏洞分析 发布时间: 2019-09-01 16:34

转载自:https://www.t00ls.net/articles-52445.html

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 参考引用