Tamper 简介
sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf
最小的例子
如下为一个最小的Tamper例子,作用是将payload中的单、双引号替换为\1
2
3
4
5
6
7
8
9
10
11# sqlmap/tamper/escapequotes.py
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
pass
def tamper(payload, **kwargs):
return payload.replace("'", "\\'").replace('"', '\\"')
不难发现编写一个Tamper需要如下要求:
- 脚本结构为priority变量定义和dependencies、tamper函数定义
- priority定义脚本的优先级,用于有多个tamper脚本的情况
- dependencies函数声明该脚本适用/不适用的范围,可以为空
- tamper是主要的函数,接受的参数为payload和**kwargs
返回值为替换后的payload
详细介绍
tamper 函数
tamper是整个脚本的主体。主要用于修改原本的payload,存到sqlmap/tamper/下,执行的时候带上–tamper参数,就可以使用该tamper来绕过该过滤规则
dependencies函数
dependencies函数,就tamper脚本支持/不支持使用的环境进行声明,一个简单的例子如下:1
2
3
4
5
6
7
8# sqlmap/tamper/echarunicodeencode.py
from lib.core.common import singleTimeWarnMessage
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])
# singleTimeWarnMessage() 用于在控制台中打印出警告信息
kwargs
在官方提供的47个tamper脚本中,kwargs参数只被使用了两次,两次都只是更改了http-header,这里以其中一个为例进行简单说明1
2
3
4
5
6# sqlmap/tamper/vanrish.py
def tamper(payload, **kwargs):
headers = kwargs.get("headers", {})
headers["X-originating-IP"] = "127.0.0.1"
return payload
这个脚本是为了更改X-originating-IP,以绕过WAF,另一个kwargs的使用出现于xforwardedfor.py,也是为了改header以绕过waf
部分常数值
1 | # sqlmap/lib/enums.py |
部分tamper作用
| Tamper文件名 | 作用 |
|---|---|
| apostrophemask.py | 用utf8代替引号 |
| equaltolike.py | like 代替等号 |
| space2dash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) |
| greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 |
| space2hash.py | 空格替换为#号 随机字符串 以及换行符 |
| apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 |
| halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论 |
| space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 |
| appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 |
| ifnull2ifisnull.py | 绕过对 IFNULL 过滤。 |
| space2mssqlblank.py(mssql) | 空格替换为其它空符号 |
| base64encode.py | 用base64编码替换 |
| space2mssqlhash.py | 替换空格 |
| modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 |
| space2mysqlblank.py | 空格替换其它空白符号(mysql) |
| between.py | 用between替换大于号(>) |
| modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 |
| space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) |
| multiplespaces.py | 围绕SQL关键字添加多个空格 |
| space2plus.py | 用+替换空格 |
| bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句。 |
| nonrecursivereplacement.py | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters |
| space2randomblank.py | 代替空格字符(“”)从一个随机的空白字符可选字符的有效集 |
| percentage.py | asp允许每个字符前面添加一个%号 |
| sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 |
| chardoubleencode.py | 双url编码(不处理以编码的) |
| unionalltounion.py | 替换UNION ALL SELECT UNION SELECT |
| charencode.py | url编码 |
| randomcase.py | 随机大小写 |
| unmagicquotes.py | 宽字符绕过 GPC addslashes |
| randomcomments.py | 用/**/分割sql关键字 |
| versionedkeywords.py | Encloses each non-function keyword with versioned MySQL comment |
| charunicodeencode.py | 字符串 unicode 编码 |
| securesphere.py | 追加特制的字符串 |
| versionedmorekeywords.py | 注释绕过 |
| space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ |
| halfversionedmorekeywords.py | 关键字前加注释 |