mysql数据库读写文件

环境:

centos7
mysql 5.6.47
用户:root@localhost

条件

mysql中涉及到读写操作,必然离不开secure_file_priv参数,它的值限制load data,select … outfile,load_file()函数可作用的文件位置。

secure_file_priv:
值为NULL表示禁止限制操作
值为某一目录,则只能操作该目录下的文件
没有值则表示不对读写文件进行限制
查询语句:
mysql:show global variables like "secure%";

读文件需满足条件:

 1. secure_file_priv值允许对该路径下的文件进行操作
 2. 当前数据库用户对文件有读权限
 3. 当前数据库用户拥有file权限
    查看方法举例:mysql> show grants for root@localhost;
 4. 知道文件的完整路径
 5. 文件大小小于max_allowed_packet。load_file()函数受到这个值的限制。
    查看方法:mysql> show global variables like 'max_allowed%'; 
    修改方法:mysql> set global max_allowed_packet = 5*1024*1024;

写文件需满足条件:


 1. secure_file_priv值允许对该路径下的文件进行操作
 2. 当前数据库用户对文件有写权限
 3. 当前数据库用户拥有file权限
    查看方法举例:mysql> show grants for root@localhost;
 4. 知道文件的完整路径
 5. 目标文件不存在

测试

secure_file_priv为固定值

使用system执行系统命令和load data infile语句加local选项绕过限制

注:
system执行系统命令适用版本为5.x。此方法只能在本地读取,远程连接mysql时无法使用system。无法越权读取。
--local选项使load data infile语句从客户主机读取文件

在这里插入图片描述

system读写文件:(强调一下system执行系统命令!)
在这里插入图片描述

load data local infile需要读取文件存储在数据表中:

当前数据库创建数据表:
create table mytable(file varchar(100));

在这里插入图片描述
在这里插入图片描述mysql数据库读写文件_第1张图片

secure_file_priv为空

修改/etc/my.cnf文件
[mysql]标志下面添加:secure_file_priv=’’
保存退出
重启mysql数据库:systemctl restart mysql
mysql数据库读写文件_第2张图片

查看结果:
mysql数据库读写文件_第3张图片

load data infile读文件
在这里插入图片描述

load_file()读文件:
mysql数据库读写文件_第4张图片
outfile写文件:
在这里插入图片描述
dumpfile写文件:
在这里插入图片描述

限制用户使用读写函数

通过general_log和general_log_file实现文件的读写
mysql所有查询数据都会记录在general_log_file指定的文件中,有该文件的读权限。
默认general_log关闭。
mysql数据库读写文件_第5张图片

因为涉及到文件的读写操作,所以还是受到secure_file_priv的限制。
mysql数据库读写文件_第6张图片

打开general_log开关:
Set global general_log=’on’;
设置general_log_file储存路径:
Set global general_log_file=’/tmp/shell.php’;

在这里插入图片描述

写一句话:
mysql> select ‘’;
在这里插入图片描述

因为是一个php文件,所以其中的php一句话会被解析执行。

注意

当root用户对某些文件进行操作时会报permission denied错误
在这里插入图片描述
网上查询资料说是red hat系列的linux中selinux对哪些daemon可以进行怎么样的操作是有限制的,因此MySQL 负责读写的daemon同样受到selinux限制。
解决办法就是把selinux关闭。
操作办法:
修改/etc/selinux/config文件中的selinux的值为disabled。
mysql数据库读写文件_第7张图片

保存后重启系统。
这种方法有人成功了,但是我没成功,因为我的config文件中selinux的值原本就是disabled(流汗)。

你可能感兴趣的:(数据库,web渗透测试)