环境搭建
怎么设置Mysql支持外联?
MAC上设置Mysql环境允许外联
这个只是暂时作为备忘,权当一个知识点,哈哈
漏洞复现
LOAD DATA INFILE
第一种是读取服务器上的文件内容存入表中,第二个是读取客户端中的文件内容存入表中(显然我们应该利用的是第二种)
漏洞分析
服务端向客户端发送greeting包和服务器的一些banner信息

以及一些设置

显然LOAD DATA LOCAL被设置了

客户端发送登录请求,包含用户名与LOAD DATA LOCAL有关信息

接着发送了一系列的查询请求

接着客户端发送一个查询包后,我们返回的是一个Response TABULAR包

内容是要读取文件的绝对路径

之后再下一个客户端的包中,我们真的可以得到内容

思路整理
由分析可知,客户端在连接Mysql服务端的时候,若是在发送查询包后(Mysql连接都时候就会有初始化查询,换句话说只要连接到我们,我们就可以发送Paylaod),我们返回客户端文件的绝对路径,客户端就会把文件内容发送过来(只要我们发送的包是标准的Mysql协议,这些在Mysql的官方文件都是有的).
我本地MAC的Mysql就不行(版本是8.0.17,因为不会发送查询语句)
用了windows的Phpstudy试了一下,还是可以的

POC分析(伪造Mysql服务端)
第一步
看一看关于脚本是怎么构造的

可以看见服务器这边是直接写死的东西(伪造的是Ubuntu主机).
另外这个greeting的包是有一定格式的,这里面直接粘贴的是大佬们的格式
第二步
这个是脚本中的认证成功后发送的包
之后就等待用户发送query包,我们返回请求客户端文件的paylaod语句
值得一提这个包是有一定格式的
我们在wireshark中可以看到

至于为什么是12个字节(/etc/passwd是11个字节),猜测是后面有\x00的存在
第四步获取到信息
没啥好说的直接输出就行了
利用的exp