现在的网站业务越来越不好测了,不是加密就是签名,所以咱们的技术水平也要慢慢提升,本文主要分享几个自己签名绕过的真实案例,并配合autodecoder插件进行绕过测试
0x01 第一个案例
一个通用的系统框架,在绕过签名后测试找到了通杀的越权漏洞,目前漏洞也已修复
首先改数据包会提示签名错误
通过js代码中搜索X-Scf-Sign找到签名生成的逻辑,可以看到Sign调用了g()函数
继续跟进调试跟踪g()函数
可以看到最终他是由a+c+d+w然后进行了md5的加密
从调试的结果分析
a是接口地址
c是X-SCF-NONCE=随机数&X-SCF-TV=毫秒级时间戳
d是传递的数据data
w是认证的token,在header中
之后写个py脚本进行签名绕过,把时间戳timestamp和sign的header替换掉
之后我们就可以愉快的改包测试了
这里是py打印的日志,也就是我们改过的内容
0x02 第二个案例
这个系统跟第一个案例的逻辑差不多,签名也是在header中,该数据也会提示签名错误
通过搜索X-Ves-Signture定位带签名逻辑处,分析签名逻辑
wn是签名后的值,使用的是hmac对Cn进行签名,pn是salt,然后又进行了一次base64编码
继续分析Cn怎么来的
Cn=fn+gn+yn+dn+ln,调试的时候打断点分析值的来源
fn是header中的appid的值
gn是请求的方法get
yn是去掉特殊字符后进行url编码,然后进行base64编码
分析出所有的值后,就可以去编写脚本进行绕过了
改包发送,提示不允许,说明签名已经绕过了(之前这个接口是有越权的,目前也已经修复了)
py输出的日志窗口
0x03 第三个案例
这个系统是一个get型的签名,我们直接改数据也是会报签名错误
继续分析js代码找签名生成的逻辑,这个就比较简单了,字符串拼接时间戳在拼接字符串,然后进行一个md5加密
然后去写py脚本进行处理
再次改包发送会提示水印错误,这个接口之前有短信轰炸,目前也已经修复了
py的日志输出记录
0x04 第四个案例
是一个小程序的,改数据重新发包提示签名错误
我们先反编译出来代码,现粗略的找一下签名函数生成的地方,然后再去hook小程序进行打断点调试

小程序调试会有点卡,确认函数是vscode的之后就没再继续调试了,直接分析代码
这个断点没继续跟下去确认是md5还是hmac的,当时找到o的值后进行md5验证了下sign是否和md5后的o一样
分析代码
o=base64(时间戳)+token+salt+做过处理的data
主要分享做过处理的data
我们传递的是一个json数据,处理之后为custmerid98261387241318这样的形式
笔者代码不好直接丢给ai帮我分析,转换成一个py函数
Object.keys(e).sort().forEach((function(t) {
"object" == r(e[t]) && (e[t] = ""),
"undefined" != e[t] && (s += t + e[t])
})),
(s = s.toString()) && (s = s.replace(new RegExp("\\[", "g"), "").replace(new RegExp("]", "g"), "").replace(new RegExp('"', "g"), ""));
最后生成了这个么一个函数,也就是处理data的,因为数据包到burp是str需要先做一次转换
def process_e_object(e_str):
"""
处理 e 对象生成签名参数 s
参数:
e_str (str): JSON 格式的 e 对象字符串
返回:
str: 处理后的拼接字符串 s
"""
# 解析 JSON 字符串为字典
e = json.loads(e_str)
e_copy = e.copy() if e else {}
s = ""
# 按键名排序并遍历处理
for key in sorted(e_copy.keys()):
value = e_copy[key]
# 对象类型(字典或列表)替换为空字符串
if isinstance(value, (dict, list)):
value = ""
# 拼接非空值
if value is not None:
s += f"{key}{value}"
# 替换特殊字符 [ ] "
s = s.replace("[", "").replace("]", "").replace('"', "")
return s
写成py脚本进行处理
继续改包重放即可成功,这个站也有漏洞,但是重复了- .-
控制台的日志输出记录
最后,希望师傅们多多进步,天天出货
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论