Sqlmapphp
开源,python编写python
支持5种sql注入检测技术:mysql
1、基于布尔的注入检测linux
2、基于时间的注入检测web
3、基于错误的注入检测正则表达式
4、基于UNION联合查询的检测sql
5、基于堆叠查询的检测mongodb
支持的数据库管理系统(可能不支持mongodb):shell
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集成结合使用,基于数据库服务进程提权和上传执行后门
参数说明:
--batch 全局使用默认选项,不与人进行交互,适合全自动工做
target类:
-d 数据库直接链接(至关于数据库的一个client),举例:sqlmap -d "mysql://user:password@127.0.0.1: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
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 进行向导模式