mysql任意文件读取复现
前言
早上在在群内看见几条链接,一打开骚瞎了眼睛。利用mysql的任意文件读取+黑名单文件上传硬生生草出一个webshell
参考链接
https://cloud.tencent.com/developer/article/1426503
https://xz.aliyun.com/t/6587
https://github.com/allyshka/Rogue-MySql-Server/
实验步骤
Kali:192.168.1.106 客户端
Windows 7:192.168.1.105 服务端
根据文章中,先使用kali里的mysql连接windows 7上的mysql。执行以下命令
mysql -h 192.168.1.105 -u root -p -D gss -e"load data local infile '/etc/passwd' into table demo fields terminated by ','";
执行完之后发现,/etc/passwd里的内容被保存在gss数据库里的demo表里
会存储到服务端的原因是
mysql客户端并不会将数据存储,而是响应在服务端里
然后使用给出的exp,创建一个流氓mysql服务端,在kali执行。然后使用windows 7链接,来读取桌面上的test.txt
然后使用Navicat来连接恶意的mysql
当连接成功后,查看生成的mysql.og可以看到读取的内容
如果在rogue_mysql_server.py设置了读取多个文件,那么得执行几条查询语句。才会引动服务端那边的查询请求
import logging.handlers
PORT = 3306
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
tmp_format = logging.handlers.WatchedFileHandler('mysql.log', 'ab')
tmp_format.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(message)s"))
log.addHandler(
tmp_format
)
filelist = (
'C:\\Users\\jiushi\\Desktop\\test.txt',
)
当我们尝试读取一个不存在的文件时,连接mysql的客户端(Navicat)可以看到。有读取的请求操作
读取到的hosts文件
漏洞原理
由于mysql客户端对服务端有着绝对信任的理由。导致攻击机可以构造一个恶意服务端,在连接的时候发送读取文件的请求,然后返回的结果会被记录到mysql.log
可利用的地方
当web上有类似于phpmyadmin或其他mysql连接的功能。可以利用这个漏洞做个突破点
从流量角度去看
第一个包,显示mysql的数据库版本
验证数据库用户
代表用户成功认证
设置编码
重点来了,读取文件的请求(可以看出这里是,效验成功后,设置完编码,mysql服务端发出的一个文件读取请求)
返回读取文件的内容给服务端
脚本的思路是:
1.伪造是自己mysql服务端
2.当client连接上后
3.发送一个读取文件的请求
4.返回读取文件的内容
防御手段
避免使用 local读取本地文件
使用 –ssl-mode=VERIFY_IDENTITY来建立可信的连接(参考链接https://blog.csdn.net/weixin_39845407/article/details/81708230 )
现实中做SSL认证连接的,可能也就20%吧。说不定连20%也没有…
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:mysql任意文件读取复现
本文作者:九世
发布时间:2019-10-31, 23:39:03
最后更新:2019-11-01, 00:29:42
原始链接:http://jiushill.github.io/posts/5bed3da8.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。