利用vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose (github.com)搭建完环境后,使用搭建环境的虚拟机ip:端口访问页面
需要用到4ra1n/mysql-fake-server: MySQL Fake Server (纯Java实现,支持GUI版和命令行版,提供Dockerfile,支持多种常见JDBC利用) (github.com)这个工具,我直接下载的gui的jar版本。复制到虚拟机内,命令行启动。
反正最后再点击Start Server就是了。
输入/etc/passwd,点击Generate Normal,复制后面的fileread_/etc/passwd填入页面点击连接。
可以看到文件被保存了,我测试多运行了几次,所以有好几个。
复现成功了,脚本也运行了。开始没想通,查了很久找到了算是一篇原理讲解的文章,稍微理解了这个漏洞的原理。
这个漏洞是利用MySQL LOAD DATA LOCAL导致的文件读取漏洞。但是上面的复现过程中甚至没有看见这个函数,这是怎么回事捏?
1.为了应用此漏洞,攻击者需求拜访 Adminer 的登录页面并操控的 MySQL 数据库:就是说攻击者已经得到了这个数据的账号和密码,能够用Adminer远程连接。
2.攻击者进入Adminer上的“SQL Command”页面:连接后使用SQL 命令在下一步对本地文件进行操控和读取。
3.运用以下 SQL 命令,攻击者可以读取 Adminer 效力器行上的本地文件并将其加载到他的长途数据库中:LOAD DATA local INFILE '/etc/passwd' INTO TABLE lfr_sink_table fields TERMINATED BY "n";
LOAD DATA INFILE作用是可以把文件读入到数据库的某个表里,如果在远程连接状态下使用了LOCAL关键字,即LOAD DATE LOCAL INFILE,那么就会快速读取本地文件到数据库,又因为攻击者已经操控了这个数据库,所以先读取本地文件到数据库,再在第四步中对数据库文件进行查看。
4.完成此操作后,攻击者可以运用以下命令检查读取文件的内容SELECT * FROM lfr_sink_table;这样就实现了Adminer远程文件读取。
结合这些,来理解上面的操作,应该就是虚假的MySQL Fake Server被服务器端连接后,MySQL Fake Server使用LOAD DATE LOCAL INFILE命令来读取本地内容,并且下载到攻击者本地。