本帖最后由 libw 于 2024-4-1 20:25 编辑
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
听说最近好像更新了算法,来试试手
新人发帖,请多多指教,各位大佬手下留情
该请求头构建时还有其它参数和载荷数据涉及敏感信息甚至违规,所以已全做打码处理!
目标
- POST提交时请求标头中特定Sign参数值的分析与生成
- 接口地址:aHR0cHM6Ly95dW4uMTM5LmNvbS9vcmNoZXN0cmF0aW9uL3BlcnNvbmFsQ2xvdWQvY2F0YWxvZy92MS4wL2dldERpc2s=
启动!提交!
抓包
如图所示,三次请求时的荷载除了commonAccountInfo中的account值是跟着用户登录信息变化以外,其它的值全部写死了
再来看请求头,这个值由三段内容组合,大致为:
分析
鉴于代码没有混淆,直接全局搜索对应参数名,也是中奖了
它由i、o、s三个值组成,用逗号分隔,然后直接拼接到一起
往上找var得知:
o:通过往c.a的getRandomSring方法传入一个16整数,获得了一段随机的16位字符串文本
r:通过新建出来的Date对象中getTime方法获得当前时间戳
i:通过往l对象中的t方法传入r和2个空文本参数获得当前时间(应该就是一个时间戳转换方法)
s:通过往c.a的getNewSign方法传入4个参数来获得关键信息;t.params在当前接口请求是undefined,t.data是载荷,i和o我们已知
那就进去看看吧:
先对getNewSign方法进行一个解析
[JavaScript] 纯文本查看 复制代码 A = {
getNewSign: function (t, e, a, n) {
var sign = ""; // 初始化 sign 字符串
var encodedData = ""; // 初始化编码后的数据字符串
// 如果存在额外参数(也就是载荷)
if (e) {
// 克隆参数对象,避免修改原对象
var clonedParams = Object.assign({}, e);
// 将参数对象转换为 JSON 字符串,并进行 URL 编码
encodedData = JSON.stringify(clonedParams);
encodedData = encodeURIComponent(encodedData);
// 将编码后的字符串转换为数组,然后排序
var encodedArray = encodedData.split("");
var sortedArray = encodedArray.sort();
// 将排序后的数组转换为字符串
encodedData = sortedArray.join("");
}
// 使用 Base64 编码处理编码后的数据
var base64EncodedData = btoa(encodedData);
// 拼接a和n(也就是现在时间和随机字符串),并使用 Base64 编码处理
var base64EncodedCredentials = btoa(a + ":" + n);
// 将编码后的数据和编码后的凭据连接在一起,并将结果转换为大写形式
sign = Md5(base64EncodedData + base64EncodedCredentials).toUpperCase();
return sign;
}
}
此方法的目的是生成一个签名,用于验证POST提交的数据是否合法,以及时间校验等
方法接受四个参数:t、e、a、n
其中 t 是一个占位符,似乎没有被使用,不知道以后再更新算法会不会加进去(再拼接一次doge)
e 是一个对象,包含额外的参数,也就是载荷
a 和 n 是现在时间和随机字符串
方法的主要逻辑是将参数进行一系列处理,然后使用标准的 MD5 加密算法生成一个签名
实战
至此,我已完全参透了算法,是时候掏出器灵(Python)来实战了
成功,开香槟~
后话
不是很建议像我这样去用器灵请求服务器或者干别的事情,据说有风控,次数多了会喜提禁令,请各位自重!
如有错误请指出,同时也感谢您的阅读,您的指点就是我进步的动力
今天是美好的一天,也祝您拥有美好的心情
|