伪造MySQL服务端实现任意文件读取

  1. 0x00 前言
  2. 0x01 漏洞简介
  3. 0x02 漏洞复现
    1. 1、复现环境及工具
    2. 2、开始复现
      1. 1.使用Rogue-MySql-Server
      2. 2.使用Mysqlist
  4. 0x03 CTF题目实战
  5. 0x04 后记

0x00 前言

最近做了一道题,考察的是攻击者通过伪造MySQL服务器,对受害者主机进行任意文件读取的漏洞。以前没见过,本地搭建环境复现一下。

0x01 漏洞简介

什么是mysql任意文件读取漏洞
攻击者搭建一个伪造的mysql服务器,当有用户连接这个伪造的服务器时。攻击者可任意读取受害者的文件内容。
为什么会产生mysql任意文件读取漏洞?
主要是因为LOAD DATA INFILE的使用
作用:读取一个文件的内容并且放到一个表中。
LOAD DATA INFILE的两种用法

load data infile "/etc/passwd" into table users fields terminated by '分隔符';
load data local infile "/etc/passwd" into table users fields terminated by '分隔符';

第一句是读取服务器上的/etc/passwd文件并存入users表中;
第二句是读取客户端本地的/etc/passwd文件并存入users表中。
漏洞核心原理
MySQL服务端可以利用LOAD DATA LOCAL INFILE命令来读取MYSQL客户端的任意文件。
常见场景
可控MYSQL,遇到弱口令的phpmyadmin、adminer、数据库备份等可以管控mysql的地方

0x02 漏洞复现

1、复现环境及工具

攻击机:Kali(真实环境中,攻击机一般使用公网服务器)
攻击机ip:192.168.201.136
靶机:Ubuntu
靶机ip:192.168.201.128
攻击机环境:
利用工具:Rogue-MySql-ServerMysqlist (伪造的mysql服务器)
靶机环境:
MySQL(用于连接攻击机伪造的mysql服务器)

2、开始复现

1.使用Rogue-MySql-Server

攻击机上
打开rogue_mysql_server.py脚本文件,默认伪造的mysql服务器端口是3306、读取受害者主机(靶机)的文件是/etc/passwd
在这里插入图片描述
然后运行rogue_mysql_server.py

python rogue_mysql_server.py

在这里插入图片描述
执行完脚本后会发现多了个mysql.log空文件(这个文件主要是接收受害者主机(靶机)的相应文件内容)
在这里插入图片描述
靶机上
在Ubuntu靶机上连接Kali伪造的mysql服务器,用户和密码都默认root。发现Ubuntu成功连接到伪造的mysql服务器:
在这里插入图片描述

在攻击机Kali上打开mysql.log,会发现受害者(靶机)的ip和/etc/passwd文件成功被读取到mysql.log文件里。
在这里插入图片描述

2.使用Mysqlist

使用Rogue-MySql-Server的脚本有点麻烦,想换个文件读要进脚本文件里手动改,而且端口用了一次以后端口就被系统占用,必须等释放以后才能继续用。
于是经过查找,发现了另一个脚本利用工具:Mysqlist

它提供了两个文件,dicc和input, 一个采用字典的方式进行任意文件读取 一个采用交互式界面进行任意文件读取 不需要进入vim! 用字典直接读!命令行直接输! 结合burp intruder,直接fuzz出flag!
采用了socket的端口复用技术,防止端口被系统占用。

简单使用

exp_input.py脚本是输入文件,单独读取
exp_dicc.py脚本用字典直接读取

启动伪造的mysql服务器:
python2 exp_input.py port  (port为端口号,3306都可)

#读取的文件最后保存在log文件夹下

攻击机上(这里以input方式演示)
首先输入命令,开启伪造的mysql服务器,测试读取/etc/passwd

python2 exp_input.py 3306

在这里插入图片描述
靶机上
在Ubuntu上连接Kali伪造的mysql服务器,用户和密码任意。发现Ubuntu成功连接到伪造的mysql服务器:
在这里插入图片描述

攻击机上:
由于受害者主机成功连接伪造的mysql服务器,攻击机上会显示Read Sucess!和所读取的文件名
在这里插入图片描述
然后打开log文件夹,会发现有个以受害者主机ip命名的文件夹,打开192.168.201.128文件夹,发现文件_etc_passwd,里边的内容即是受害者主机的/etc/passwd文件内容。
在这里插入图片描述
直接在可视化窗口打开发现打开失败,于是使用vim或vi编辑器打开:

vi _etc_passwd

在这里插入图片描述

0x03 CTF题目实战

之前说了,我是由于遇到一道mysql任意文件读取的题,才了解到这个漏洞的。
现在再把题目复现一遍(由于这道是某入群题,所以大致复现一下):
首先题目是个登录框,需要用户名、密码和安全问题验证才能登录。
先fuzz一波,发现过滤了很多,并且圆括号()也被过滤了。
然后抓包,进行SQL注入测试后发现可以进行单引号逃逸
在这里插入图片描述
1=1处可控,并且发现安全问题就是token,猜测后台查询语句为:

select token from user where username='' and password=''

于是考虑怎样绕过token验证。查询大师傅博客发现,sql里可以用with group来构造返回结果,于是构造payload:

username=\&password=|| 1 group by token with rollup having token is NULL--+&question=1

进入后台。有写马的功能,(这个没多大用)有查看马的功能,有个数据备份。
数据备份,看了大师傅博客了解到是mysql任意文件读取。于是就有了上面mysql任意文件读取的学习。
一般情况下,可读取以下文件:

/etc/passwd
/home/mysql/.bash_history
/etc/nginx.conf
/usr/share/nginx/html/login.php
/etc/hosts

由于题目提示flag在根目录下,所以这里还需要进行一次目录遍历。
得到的关键部分:

{"name":"I_am_flag2ijwy2w7892yw2uowh2"},//还有个入群密码文件,就不写了

接下来,就是通过mysql任意文件读取,读取I_am_flag2ijwy2w7892yw2uowh2
在题目网站上开一个Linux服务器,使用Rogue-MySql-Server,将rogue_mysql_server.py文件伪造的mysql服务器端口设为3306(不行的话,就设其他端口),将读取文件改成/I_am_flag2ijwy2w7892yw2uowh2
运行rogue_mysql_server.py脚本启动伪造的mysql服务器。然后在数据备份那里进行连接,
在这里插入图片描述
“连接错误”,但文件内容已经被读取到Rogue-MySql-Server里的mysql.log文件里,打开即可看到flag。

0x04 后记

通过本次学习和复现,我了解了伪造MySQL服务端实现任意文件读取具体实现过程。但并没有对其相应数据包进行分析,数据包分析的话,可参考Smi1e大师傅的博客:
MySQL LOAD DATA 读取客户端任意文件


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏