SQLMAP
- SQLMAP是什么
- SQLMAP可以对URL做什么?
- SQLMAP支持的注入技术
- SQLMAP检测注入漏洞流程:
- SQLMAP的误报检测机制
- SQLMAP基本使用
- 常见用法
- 常见参数
- tamper参数
- 操作系统权限参数
- 文件读写参数
SQLMAP是什么
SQLMAP是一个开源的自动化SQL注入工具,主要功能是扫描、发现并且利用给定的URL的SQL注入漏洞。
SQLMAP可以对URL做什么?
- 判断可以注入的参数
- 判断可以使用哪一种SQL注入技术进行注入
- 判断识别数据库的类型
- 根据用户的选择,从数据库中读取数据
SQLMAP支持的注入技术
- 基于布尔的盲注:根据返回页面判断条件真假注入
- 基于时间的盲注:不能根据页面返回内容判断任何信息,使用条件查询语句查看时间延迟语句是否执行来判断
- 基于报错的注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
- 基于联合查询的注入:使用union进行注入
- 堆查询注入:同时执行多条语句的注入
SQLMAP检测注入漏洞流程:
- 网站连通性检测:检测目标的连接状态。
- WAF探测:检测网站是否受WAF保护。
- 网页稳定性检测:检测网页是否稳定。
- 参数动态性检测:检测参数是否有动态性。
- 启发式注入检测:探测该参数点是否是动态的、是否为可能的注入点。
SQLMAP的误报检测机制
误报检测: SQLMAP的布尔盲注、时间盲注方式判断注入点时,存在误报的可能。为防止误报,SQLMap引入了误报检测机制。
两个基础检测算法:
- 页面相似度对比技术(在各种注入技术中大量使用)∶在SQLMap检测的整个过程中,会有一个原始响应的定义,指的是在网站连通性检测的过程中,如果网站成功响应,则把该响应定义为原始响应(包括状态码、HTTP响应头、HTTP响应体)。一个HTTP请求成功响应后,将与原始响应进行对比,得出对比结果,算法输出为True表示当前响应与原始响应相似,算法输出为False表示当前响应与原始响应不相似。
- 高斯分布识别响应机制:(在UNION注入和时间盲注过程中使用)︰网站的响应是基于逻辑的,如果一组请求,网站的处理逻辑相同,那么响应几乎也是相同的。如果某一个响应出现了变化,则可以认为网站处理逻辑变了,这种逻辑的变化,可能正是因为注入成功了。
SQLMAP基本使用
常见用法
-
-u参数(直接输入目标的URL)
语法:sqlmap -u “www.test.com/index.php?id=1”;
验证过程:判断可以注入的参数、判断可以使用哪种SQL注入技术来注入、识别出所有存在的注入类型、尝试判断数据库版本,开发语言,数据库系统。
sqlmap -u http://192.168.0.1/page.php?id=10 --current-db //爆当前库
sqlmap -u http://192.168.0.110/page.php?id=10 -D 数据库名 --tables//爆表名
sqlmap -u http://192.168.0.1/page.php?id=10 -D 数据库名 -T表名 --columns//爆字段
sqlmap -u http://192.168.0.1/page.php?id=10 -D 数据库名 -T 表名 -C 字段名1,字段名2,字段名3…(互相用逗号隔并) --dump//显示数据
现在以爆库名为例:
在第一次输入的时候,会出现这么一个选项:
直接勾选第一个Y第二个n即可。 -
-r参数 (从文本文件之中获得http请求)
语法:sqlmap -r /usr/1.txt
注意:在使用该命令时,必须指明1.txt文件所在的绝对路径
其余的与-u参数基本一致 -
-m参数(从文件中取出保存的url进行检测)
语法:sqlmap -m /usr/2.txt
注意:使用的时候,必须指明2.txt所在的绝对路径
常见参数
枚举参数:
参数:-b,–banner…列出版本号
参数: --dbs…列出所有数据库的库名
参数:–current-db…列出当前使用的数据库库名
参数:–tables…列出数据库中的表列
参数:–columns…出数据表中的字段
参数:–dump…转储数据库表项,查询字段值
参数: --users…列出所有管理用户
参数: --passwords…列出并破解数据库用户的hash
参数: --privileges…列出数据库管理员权限
请求参数:
参数:–method…指定使用的http方法
参数: --data…把数据以POST方式提交
参数:–param-del …GET或POST的数据用&以外的其他字符分割参数: --cookie,–load-cookies,–drop-set-cookie设置cookie
参数: --referer…伪造HTTP中的Referer头
参数: --user-agent…自定义HTTP中的User-Agent头
参数: --headers…增加额外的http头,不同的头使用“\n”分隔
参数:–timeout…设置超时时间
参数: --retries…设置重试次数
检测参数:
参数:-v…显示等级,共有7个等级,为0时只显示python错误以及严重的信息,为1时(默认)同时显示基本信息和警告信息,为2时同时显示debug信息,为3时同时显示注入的payload,为4时同时显示HTTP请求,为5时同时显示HTTP响应头,为6时同时显示HTTP响应页面。
参数: --risk…风险等级,共有4个等级
参数: -p,–skip…手动用-p参数设置想要测试的参数,–skip设置跳过的参数
参数: --flush-session…清空SQLMAP缓存的会话信息,因为SQLMAP在第一次检测完之后会产生缓存,在后续过程中就会变得比较快了。
注入技术参数:
参数: --technique…指定sqlmap使用的探测技术,B表示布尔盲注,T表示时间盲注(延迟注入),E表示报错注入,U表示联合查询注入,S表示堆查询注入参数: --time-sec设定延迟注入的时间(默认为5秒)
参数: --union-cols…设定UNION查询字段数
参数: --union-char…设定UNION查询时使用的字符
参数: --second-order…设置二次注入的URL
参数: --tamper…使用sqlmap自带的tamper或者自己写的tamper来混淆payload,通常用来绕过WAF和IPS。
tamper参数
tamper脚本是SQLMAP中用于绕过waf或应对网站过滤逻辑的脚本。SQLMAP自带了一些tamper脚本,可以在tamper目录(Kali系统下默认为/usr/share/sqlmap/tamper)下查看它们。用户也可以根据已有的tamper脚本来编写自己的tamper脚本(绕过逻辑)。
绕过逻辑又有以下几种方式:
- 过滤等号:将等号变为like
输入:select * from users where id=1
输出:select * from users where id like 1 - 替换字符、过滤单引号
输入: “1” and ‘1’=‘1’
输出: “1” and %00%271%00%27=%00%271" - url编码转换
输入:select field from table
输出:%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
转换规则就是:先把字符转换为ASCII码,再转变成十六进制。 - unicode编码绕过
输入:SELECT%20FIELD%20FROM TABLE
输出:%u0053%u0045%u004c%u0045%u0043%u0054%u0020%uO046%u0049%u0045%u004c%u0044%u0020%u0046…
unicode编码就是以%u开头,然后后面是唯一对应的一个数字,都转化为unicode编码。
操作系统权限参数
- –os-cmd执行操作系统命令
- –os-shell交互式的操作系统的shell
文件读写参数
- –file-read读取文件
- –file-write写入文件
- –file-dest指明写入文件的绝对路径