现在的网站业务越来越不好测了,不是加密就是签名,所以咱们的技术水平也要慢慢提升,本文主要分享几个自己签名绕过的真实案例,并配合autodecoder插件进行绕过测试

第一个案例

一个通用的系统框架,在绕过签名后测试找到了通杀的越权漏洞,目前漏洞也已修复

首先改数据包会提示签名错误

​

通过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打印的日志,也就是我们改过的内容

第二个案例

这个系统跟第一个案例的逻辑差不多,签名也是在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编码

ln是时间戳

​

分析出所有的值后,就可以去编写脚本进行绕过了

改包发送,提示不允许,说明签名已经绕过了(之前这个接口是有越权的,目前也已经修复了)

py输出的日志窗口

第三个案例

这个系统是一个get型的签名,我们直接改数据也是会报签名错误

继续分析js代码找签名生成的逻辑,这个就比较简单了,字符串拼接时间戳在拼接字符串,然后进行一个md5加密

然后去写py脚本进行处理

再次改包发送会提示水印错误,这个接口之前有短信轰炸,目前也已经修复了

py的日志输出记录

​

第四个案例

是一个小程序的,改数据重新发包提示签名错误

我们先反编译出来代码,现粗略的找一下签名函数生成的地方,然后再去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脚本进行处理

继续改包重放即可成功,这个站也有漏洞,但是重复了- .-

控制台的日志输出记录

​

最后,希望师傅们多多进步,天天出货