Drzad 发表于 2023-4-18 12:48

某商场微信小程序有效token构造问题

小程序wxapkg包下载:https://musetransfer.com/s/12zvofsql
wxid是wx3484805679bf714f

我使用GitHub上的r3x5ur/unveilr工具对主包__APP__.wxapkg进行提取,但我只能提取其中的文件,无法反编译(问题已提交Issue)
提取出的文件下载:https://musetransfer.com/s/z2fvfqsts

提取出的“app-service.js”文件中,第20676行是我关注的点,其中包含token的构造命令

以下是一些valid的token:

[*]consumer=188880000002&timestamp=1681783203579&nonce=51036257a4504d6c91e1cb787974fad0&sign=77b078caf103a48244fa8f6b7c45b327&tenantId=13474&cid=ca975b725998428480600f1baf3bda18&openId=o5oC55QBHtF_862zWbo5F5JC-iiI&v=20211030
[*]consumer=188880000002&timestamp=1681785145822&nonce=b7ed4368654d46b1a5415aea6ebe52f3&sign=0b9561b9fdb666743f4ed6230b6af49e&tenantId=13474&cid=ca975b725998428480600f1baf3bda18&openId=o5oC55QBHtF_862zWbo5F5JC-iiI&v=20211030
[*]consumer=188880000002&timestamp=1681785146695&nonce=645f592121ad410c99f35fe0716ef263&sign=b6b14b9dad57867f0c2035c61f77e84b&tenantId=13474&cid=ca975b725998428480600f1baf3bda18&openId=o5oC55QBHtF_862zWbo5F5JC-iiI&v=20211030
[*]consumer=188880000002&timestamp=1681785131439&nonce=c66d5689a1a947108596e17b23f8621d&sign=1ea1c86eaf2b809546ff296827723559&tenantId=13474&cid=ca975b725998428480600f1baf3bda18&openId=o5oC55QBHtF_862zWbo5F5JC-iiI&v=20211030


token中的timestamp、nonce、sign为主要变量,其主要功能是防重放。且经过多次测试,每次提交toekn时,以上参数缺一不可。并且token的结构为"consumer=".concat("188880000002", "&timestamp=").concat(u, "&nonce=").concat(c, "&sign=").concat(a, "&tenantId=").concat(o, "&cid=").concat(e, "&openId=").concat(r, "&v=20211030")

搜索常用防重放攻击方法后,得知其timestamp为当前时间戳,nonce为随机生成的32位字符串,sign是计算出的校验。
审计其第20676行的代码后,sign应该是 "188880000002" + c + u + "bbd2b25e7a8b4d94a8cc167ba2f27edd" + o + e + r + t 的MD5值,其中c为随机生成的nonce,u为当前时间戳timestamp,o为tenantId固定值13474,e为cid固定值ca975b725998428480600f1baf3bda18,r为用户openid固定值o5oC55QBHtF_862zWbo5F5JC-iiI,t目前未知。

请问各位大佬能否看出t是什么参数?我尝试过简单的空值、1、0、20211030,都不对。
但我看到“app-service.js”文件中第20733行里有使用globalData定义t的,是一大长串的结构,我不确定是不是真的这么复杂。
或者有什么方法可以让我们修改小程序的某些地方让它在前台输出给我们看想看的变量,我可以用Fillder抓包抓到小程序的网络流,上面的token就是抓包抓到的。

linguo2625469 发表于 2023-4-18 15:35

本帖最后由 linguo2625469 于 2023-4-18 15:41 编辑

20676行的代码为sign.js   可以复制从20675行到20677行的代码 去网上格式化一下 拿到sign.js代码 得出结果是该jsexports.default了一个方法 传入值为t
然后搜索sign.js 看哪里调用它 找到c=a(require("./rtmap/coupons/utils/sign.js"))
该代码为app.js 同上 格式化app.js代码找到调用处为 getData 方法 找到赋值t的位置
可以看到下面设置了header 增加了token,值为c.default(t)
其中t就是我画圈那个 c.default 就是调用了sign.js

sanmylc 发表于 2023-4-18 16:33

本帖最后由 sanmylc 于 2023-4-18 16:41 编辑

linguo2625469 发表于 2023-4-18 15:35
20676行的代码为sign.js   可以复制从20675行到20677行的代码 去网上格式化一下 拿到sign.js代码 得出结果 ...
大佬分析的不错我个前端小白看懂一部分    一般用于全局 不知道我的想法正确不

Drzad 发表于 2023-4-18 16:37

linguo2625469 发表于 2023-4-18 15:35
20676行的代码为sign.js   可以复制从20675行到20677行的代码 去网上格式化一下 拿到sign.js代码 得出结果 ...

感谢大佬!经验证,变量t是POST出去的json文本

linguo2625469 发表于 2023-4-18 19:18

sanmylc 发表于 2023-4-18 16:33
大佬分析的不错我个前端小白看懂一部分    一般用于全局 不知道我的想法正确不

不懂你想说什么

Drzad 发表于 2023-4-18 20:34

本帖最后由 Drzad 于 2023-4-18 21:24 编辑

linguo2625469 发表于 2023-4-18 15:35
20676行的代码为sign.js   可以复制从20675行到20677行的代码 去网上格式化一下 拿到sign.js代码 得出结果 ...
抱歉,刚才发的疑问撤回。是我代码编写的问题,我们讨论的是正确的

sanmylc 发表于 2023-4-19 12:58

linguo2625469 发表于 2023-4-18 19:18
不懂你想说什么

我想说的是这个参数是作用与全局 和axios是一样的 都是公共参数

yanyan19781101 发表于 2023-4-27 19:28

我也刚破解了一个商场的sign值,大部分都是这个逻辑,时间戳、随机数、一组可以循环使用的密码(破解程序中有,一般为wap-key)、用户信息、 post出去的 body ,最后用md5,或者sha1 ,sha256 加密一下,就生成了 最后的sign。楼主破解是用来领取小礼品了吗?

Drzad 发表于 2023-6-23 14:22

yanyan19781101 发表于 2023-4-27 19:28
我也刚破解了一个商场的sign值,大部分都是这个逻辑,时间戳、随机数、一组可以循环使用的密码(破解程序中 ...

用来预约展会的票

xiaocai66 发表于 2023-6-29 14:12

楼主用的什么反编译工具,能分享一下吗
页: [1] 2
查看完整版本: 某商场微信小程序有效token构造问题