mysql 5.7新特性:secure_file_priv
作用:用于限制文件的import/export操作。
参考:
- https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv
- https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file
- 关于MySQL注入读写文件的限制
mysql 5.7.16引入。
默认值与平台相关。
- Windows上, NULL (>= MySQL 5.7.16), ‘’ (< MySQL 5.7.16)
- Linux(DEB, RPM)上的是:/var/lib/mysql-files
可选值:
- 1: ‘’,即空字符串,表示没有对文件import/export进行限制;
- 2: 路径名,表示只能import/export这个目录下的文件;
- 3: NULL,表示禁用文件import/export操作。
1、由于默认情况下secure_file_priv为"/var/lib/mysql-files",不为"“或者”/",所以不能写入到任意目录;
解决方法:修改mysql配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,将secure_file_priv="/“或者”"添加到最后一行,然后重启。
2、普通用户尝试写文件,碰到错误:
RROR 1045 (28000): Access denied for user 'cqq'@'localhost' (using password: YES)
解决方法:给某用户ALL的权限,或者至少FILE的权限。然后重启mysql客户端(否则不生效)。
查看权限方法:
select file_priv,user,host from mysql.user where user='cqq';
或者
show grants for cqq@'localhost';
无FILE权限:
有FILE权限(或者ALL权限):
总结mysql写webshell的限制
- 1、从可解析webshell的容器角度,知道web绝对路径,且容器可解析上传的文件(php或jsp);
- 2、mysql应用层面,拿到的用户具有file权限(root用户本身就有);
- 3、mysql应用层面,mysql没有secure_file_priv权限限制(5.7.16之后默认会限制),或者web目录为secure_file_priv设置的目录范围内;
- 4、操作系统层面,启动mysqld的用户具有向web目录写文件的权限(如果启动mysqld的用户为root当然可以,不过如果是mysql,而web目录的权限为apache之类的用户则不行);