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 服务端
  • 1
  • 2

根据文章中,先使用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 ','";
  • 1

执行完之后发现,/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',
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

当我们尝试读取一个不存在的文件时,连接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%也没有…

推荐开通永久SVIP,享受极致用户体验!官方QQ交流群:859602620
您若发现我们未注明版权信息或侵权请您立即联系我们,我们将以最快的速度删除资源!
黑盟安全门户 » mysql的任意文件读取漏洞