【复现】Mysql任意读取客户端文件

admin 2021年7月29日00:29:51评论156 views字数 1793阅读5分58秒阅读模式

【复现】Mysql任意读取客户端文件

0x01 漏洞成因

该漏洞的核心原理在于MySQL服务端可以利用LOAD DATA LOCAL命令来读取MYSQL客户端的任意文件

根据MySQL的官方文档,连接握手阶段中会执行如下操作:

  • 客户端和服务端交换各自功能

  • 如果需要则创建SSL通信通道

  • 服务端认证客户端身份

身份认证通过后,客户端会在实际操作之前发送请求,等待服务器的响应。“Client Capabilities”报文中包括名为Can Use LOAD DATA LOCAL的一个条目:


【复现】Mysql任意读取客户端文件


一旦客户端启用了这个功能(比如通过--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;


【复现】Mysql任意读取客户端文件


可以看到客户端 Win10 中的 hosts 文件成功被写入到服务端 Centos7 Mysql 数据库中。

0x02 漏洞利用

正常的请求逻辑如下


【复现】Mysql任意读取客户端文件


示例:客户端 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;


【复现】Mysql任意读取客户端文件


【客户端发送load data infile 请求】


【复现】Mysql任意读取客户端文件


【服务器回复Response TABULAR

这是正常的情况,即客户端发送一个load data infile 请求,服务器回复一个Response TABULAR,不会出现什么问题。

但是Mysql允许服务端在任何时候发送Response TABULAR数据包, 此时就跳过了第一步,实现了任意文件读取的目的。


【复现】Mysql任意读取客户端文件


恶意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

登录成功后,无需操作即可被攻击


【复现】Mysql任意读取客户端文件


分析数据包:可以看到,当客户端连接恶意服务端后,会直接发送一个

 select @@version_comment limit 1

请求,用于探测服务端的指纹信息,(大多数MySQL客户端以及程序库都会在握手之后至少发送一次该请求)


【复现】Mysql任意读取客户端文件


此时恶意服务端会回复一个Response TABULAR请求,该请求中包含一个 LOCAL INFILE 地址,


【复现】Mysql任意读取客户端文件


接着客户端就回复给服务端本地C:WindowsSystem32driversetchosts中的内容。


【复现】Mysql任意读取客户端文件


同时,可以在恶意服务端查看log日志,看是否成功获取到客户端信息,


【复现】Mysql任意读取客户端文件


可以看到,客户端文件数据已被写到恶意服务端,至此,一个完整的攻击流程已展示完成。

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


【复现】Mysql任意读取客户端文件

本文始发于微信公众号(T00ls):【复现】Mysql任意读取客户端文件

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年7月29日00:29:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【复现】Mysql任意读取客户端文件http://cn-sec.com/archives/348865.html

发表评论

匿名网友 填写信息