利用MySQL LOAD DATA读取任意文件

LOAD DATA INFILE的工作原理

了解一下LOAD DATA INFILE的工作原理。使用wireshark抓包:

  1. 客户端(即攻击者)连接mysql服务器3306端口
  2. 服务器发送问候包,包括协议线程ID,版本,mysql认证类型等。
  3. 客户端的下一个数据包是带有用户名,密码,数据库的认证包,以及LOAD DATA LOCAL选项的标志位
  4. 之后有一些包含客户端指定查询的数据包,如:“'show databases”',“'select @@ version_comment limit 1”'等
  5. 然后是我们的查询语句load data local infile '/etc/passwd' into table test.test fields terminated by '\n';以及回包

这个数据包对连接的客户端说:“嘿!请阅读/etc/passwd 文件并发给我”

上述过程就是LOAD DATA INFILE 的整个过程。如果能执行LOAD DATA INFILE 导入服务器上的文件自然是最好的,但是有时候我们并不能执行LOAD DATA INFILE,我们只能执行LOAD DATA LOCAL INFILE,即导入我们本机上的文件,这是因为我们当前账户没有读取服务器本地文件的权限。所以我们转换思路,互换一下服务器和客户端的位置,让被攻击者作为客户端来连接我们的服务器,并使客户端执行LOAD DATA LOCAL INFILE语句,下面的利用方式就是如此。

从客户端读取文件

关于LOAD DATA INFILE读取文件的技术并不新鲜,以前就有了相关的帖子、工具和文章(见文末参考连接),所以介绍一下从客户端读取文件的攻击流程:

利用MySQL LOAD DATA读取任意文件

攻击流程大致如上图-flow

  1. 攻击者向受害者提供MySQL服务器地址、账户、密码
  2. 受害者向攻击者提供的服务器发起请求,并尝试进行身份认证
  3. 攻击者的MySQL接受到受害者的连接请求,攻击者发送正常的问候、身份验证正确,并且向受害者的MySQL客户端请求文件。
  4. 受害者的MySQL客户端认为身份验证正确,执行攻击者的发来的请求,通过LOAD DATA INLINE 功能将文件内容发送回攻击者的MySQL服务器。
  5. 攻击者收到受害者服务器上的信息,读取文件成功,攻击完成。

攻击已经被写成了工具(如Rogue-MySql-Server Tool),工具将模拟一个假的MySQL服务器发送payload读取文件。

利用MySQL LOAD DATA读取任意文件

攻击Demo:https://youtu.be/3HVW-toqfCM

参考连接