MySQL LOAD DATA 任意读取客户端文件

原理看着模模糊糊的···详见:https://xz.aliyun.com/t/3973#toc-0

利用场景:题目存在远程连接MySQL功能

相关题目:国赛全宇宙最简单的SQL,ddctfmysql弱口令

模拟服务器端脚本:https://github.com/allyshka/Rogue-MySql-Server


读取服务器端文件

测试环境:windows10,phpstudy

想要使用LOAD DATA INFILE,服务器配置必须启用该功能。默认是启动的,也可以在连接时使用–enable-local-infile来开启该功能

开始测试失败,报错:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

原因是secure-file-priv参数做了限制

secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

  • secure_file_priv的值为null ,表示限制mysqld 不允许导入/导出

  • secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入/导出只能发生在/tmp/目录下,此时如果读写发生在其他文件夹,就会报出以上错误

  • 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入/导出做限制

打开 phpstudy的其他选项菜单-打开配置文件-mysql-ini,找到secure_file_priv,则把文件放到对应的目录下就能进行LOAD DATA INFILE操作;在C:/datas/pass.txt中写入123456

mysql> load data infile 'C:/datas/pass.txt' into table test1.users1 fields terminated by ',';
Query OK, 1 row affected, 2 warnings (0.06 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 2

可以看到文件的数据被成功读取到表中的id字段下:

mysql> select * from test1.users1;
+--------+----------+----------+
| id     | username | password |
+--------+----------+----------+
|      1 | fff      | asdf     |
|      2 | ddd      | dfasdf   |
| 123456 |          |          |
+--------+----------+----------+
3 rows in set (0.00 sec)

读取客户端文件

流程:

  • 攻击者向受害者提供MySQL服务器地址、账户、密码
  • 受害者向攻击者提供的服务器发起请求,并尝试进行身份认证
  • 攻击者的MySQL接受到受害者的连接请求,攻击者发送正常的问候、身份验证正确,并且向受害者的MySQL客户端请求文件。
  • 受害者的MySQL客户端认为身份验证正确,执行攻击者的发来的请求,通过LOAD DATA INLINE 功能将文件内容发送回攻击者的MySQL服务器。
  • 攻击者收到受害者服务器上的信息,读取文件成功,攻击完成。

测试环境:windows10,phpstudy,阿里云ubuntu16.04服务器

1.在windows10新建文件C:/datas/pass.txt,在里面写入:

之后修改脚本,将读取路径改为:

filelist = (
    C:/datas/pass.txt
)

2.登录云服务器,然后运行:

python rogue_mysql_server.py

查看当前开放端口(如果已存在3306端口,则需要编辑脚本,更改端口号后再运行):

netstat -antp

根据端口配置阿里云安全组配置

3.运行phpstudy,打开WWW\phpMyAdmin\librariesconfig.default.php,修改

$cfg['AllowArbitraryServer'] = true; //false改为true

之后在浏览器打开phpMyAdmin登录页面,输入ip和端口,账号密码随便填,连接到模拟的MySQL服务器端:

4.此时,在服务器端cat mysql.log,即可看到读取的客户端的文件内容了:


相关扩展

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库
要使用phpMyAdmin,首先需要在服务器(ubuntu16.04)上安装MySQL,并设置远程访问:

1.首先需要在服务器上安装MySQL(安装过程中需要设置密码):

apt-get install mysql-server
apt install mysql-client
apt install libmysqlclient-dev

2.找到MySQL配置文件:

vi /etc/mysql/mysql.conf.d/mysqld.cnf

注释掉bind-address = 127.0.0.1

3.用设置的密码(xxxxxx)登录MySQL:

mysql -uroot -pxxxxxx

输入:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxxxx' WITH GRANT OPTION;

继续输入:

flush privileges;

4.重启MySQL服务:

systemctl restart mysql

即可用phpMyAdmin进行远程连接,管理MySQL数据库

DDCTF mysql弱口令

题目说明:

部署agent.py再进行扫描哦~

本题不需要使用扫描器

限制了每秒2-3次访问

点开链接后,发现是一个扫描页面:

没有部署agent.py时,输入服务器ip和3306端口会提示连接超时;查看agent.py文件,发现其运行时会开放8123端口,扫描器会连接这个端口并会通过netstat -tlnp来检查端口开放情况

打开agent.py,将下面这句注释掉

self.wfile.write(json.dumps(result))

在下方添加:

print json.dumps(result)

运行可以看到输出了服务器的所有内网端口和进程名称

部署agent.py后,输入服务器的ip和3306端口,发现提示服务器未开启mysql,但此时服务器是开启MySQL的服务还有3306端口的

则可以推测扫描器会检测agent.py的self.wfile是否含有进程mysqld

则将下面这句注释掉

self.wfile.write(json.dumps(result))

在下面添加:

self.wfile.write('mysqld')

这样即可绕过检测;之后,再编辑rogue_mysql_server.py,将端口设为3306,运行后,在扫描器扫描,发现扫描到了服务器存在弱口令

之后改变rogue_mysql_server.py读取的文件路径;最后一步考察的是对linux系统目录的掌握,有以下方法:

方法一

root用户的mysql操作一般记录在:~/.mysql_history中,读取一下就可以拿到flag

方法二

查看bash历史操作:

cat ~/.bash_history

得到了程序的入口文件:

那么查看/home/dc2-user/ctf_web_2/app/main/views.py内容,得到提示:

# flag in mysql  curl@localhost database:security  table:flag

那么查看securiy数据库的flag表的内容:

/var/lib/mysql/security/flag.ibd

即可得到flag


参考链接:

http://aq.mk/index.php/archives/23/

https://xz.aliyun.com/t/3973#toc-0

https://blog.csdn.net/itxiaolong3/article/details/77905923

https://blog.csdn.net/dillanzhou/article/details/82876575

http://blog.chinaunix.net/uid-22666248-id-3040364.html

https://xz.aliyun.com/t/4887#toc-7