LOAD DATA INFILE的工作原理
了解一下LOAD DATA INFILE的工作原理。使用wireshark抓包:
- 客户端(即攻击者)连接mysql服务器3306端口
- 服务器发送问候包,包括协议线程ID,版本,mysql认证类型等。
- 客户端的下一个数据包是带有用户名,密码,数据库的认证包,以及LOAD DATA LOCAL选项的标志位
- 之后有一些包含客户端指定查询的数据包,如:“'show databases”',“'select @@ version_comment limit 1”'等
- 然后是我们的查询语句
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读取文件的技术并不新鲜,以前就有了相关的帖子、工具和文章(见文末参考连接),所以介绍一下从客户端读取文件的攻击流程:
攻击流程大致如上图-flow
- 攻击者向受害者提供MySQL服务器地址、账户、密码
- 受害者向攻击者提供的服务器发起请求,并尝试进行身份认证
- 攻击者的MySQL接受到受害者的连接请求,攻击者发送正常的问候、身份验证正确,并且向受害者的MySQL客户端请求文件。
- 受害者的MySQL客户端认为身份验证正确,执行攻击者的发来的请求,通过LOAD DATA INLINE 功能将文件内容发送回攻击者的MySQL服务器。
- 攻击者收到受害者服务器上的信息,读取文件成功,攻击完成。
攻击已经被写成了工具(如Rogue-MySql-Server Tool),工具将模拟一个假的MySQL服务器发送payload读取文件。
攻击Demo:https://youtu.be/3HVW-toqfCM
参考连接
- https://w00tsec.blogspot.com/2018/04/abusing-mysql-local-infile-to-read.html - 利用MySQL LOCAL INFILE读取客户端文件
- https://xz.aliyun.com/t/3973 - 通过MySQL LOAD DATA特性来达到任意文件读取
- Database Honeypot by design - Yuri Goltsev的演示文档 (August 2013)
Rogue-MySql-Server Tool - 用于读取连接客户端文件的MySQL虚假服务器(September 2013)
MySQL connect file read - 来自俄罗斯的安全帖子(April 2016)
原文连接:利用MySQL LOAD DATA读取任意文件
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。