mysql任意文件读取复现

  1. 前言
  2. 参考链接
  3. 实验步骤
  4. 漏洞原理
  5. 可利用的地方
  6. 从流量角度去看
  7. 防御手段

前言

早上在在群内看见几条链接,一打开骚瞎了眼睛。利用mysql的任意文件读取+黑名单文件上传硬生生草出一个webshell
timg?image&quality=80&size=b9999_10000&sec=1572546676675&di=7115be36c38130f2ccb0227bab864196&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F0753cfc4a64c7530fc7f6aff85fbd95c8406f7c9.jpg

参考链接

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表里
006LG7Nygy1g8htq0ktc0j30it0nuabg.jpg

会存储到服务端的原因是
mysql客户端并不会将数据存储,而是响应在服务端里
1620

然后使用给出的exp,创建一个流氓mysql服务端,在kali执行。然后使用windows 7链接,来读取桌面上的test.txt
006LG7Nygy1g8htrb04ctj31400gv0ul.jpg

006LG7Nygy1g8htrspqwnj30th0a10sw.jpg

然后使用Navicat来连接恶意的mysql
006LG7Nygy1g8htsk9ugyj318g0p076j.jpg

当连接成功后,查看生成的mysql.og可以看到读取的内容
006LG7Nygy1g8htt7dyn6j30sb0lqwgs.jpg

如果在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)可以看到。有读取的请求操作
006LG7Nygy1g8htz8irafj318g0p076z.jpg

读取到的hosts文件
006LG7Nygy1g8hu11rcjwj318z0pidjv.jpg

漏洞原理

由于mysql客户端对服务端有着绝对信任的理由。导致攻击机可以构造一个恶意服务端,在连接的时候发送读取文件的请求,然后返回的结果会被记录到mysql.log

可利用的地方

当web上有类似于phpmyadmin或其他mysql连接的功能。可以利用这个漏洞做个突破点

从流量角度去看

第一个包,显示mysql的数据库版本
006LG7Nygy1g8hu7wnvsoj30vm0fs41f.jpg

验证数据库用户
006LG7Nygy1g8hu97o5qrj311j0ha0w8.jpg

代表用户成功认证
006LG7Nygy1g8huacdhbbj30yf0g7acw.jpg

设置编码
006LG7Nygy1g8huclqqmej30yw0fygoe.jpg

重点来了,读取文件的请求(可以看出这里是,效验成功后,设置完编码,mysql服务端发出的一个文件读取请求)
006LG7Nygy1g8hudsa2pbj31110lc42n.jpg

返回读取文件的内容给服务端
006LG7Nygy1g8hufbl4fzj310t0ontdz.jpg

脚本的思路是:
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://422926799.github.io/posts/5bed3da8.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录