0x00 前言
去某学校比赛,入校需要提前预约,预约时测了一下,以下内容纯属虚构如有雷同纯属巧合
0x02 过程
是一个公众号系统,我这里是审核预约通过了
点击卡片查看得到链接 https://xxxxxx/guest_XXXX_XXXX/3xxxx
url里面带了id,先试了一下修改成其他id,返回了401
查看数据包头发现认证的方式
MTY5OTA4MTEzMDoyZDFjYWUzMjI4MWE5NGQyY2ZlMTMyMjM1NWU2NThhOTozXzQwNTdGM0FBQkRCQzQ3MDJBNTI5MTBGN0QwNENCQkM3
解码一下
1699081130:2d1cae32281a94d2cfe1322355e658a9:3_4057F3AABDBC4702A52910F7D04CBBC7
是三段值,第一段很明显是时间戳如果id正确时间戳不对会显示
然后重新抓包访问,第二段在请求包里面没找到,猜测在js里面,然后去翻js,这里能看到很明显的拼接三段的内容
核心代码如下,这里主要得到n的值,可以看到n是 e+t 这里e是由外部传入的
function l(e) {
var t = i()(Date.now()).format("X"),
n = f["Md5"].hashStr("XXXXXXX" + e + t),
a = btoa(t + ":" + n + ":" + (d["a"].state.token ? d["a"].state.token : ""));
return a
}
在往下走可以看到传入了e.baseURL + e.url ,这里可以得到baseURL是https://xxxxxxx.com/ e.url也就是后面的部分 假如请求 https://xxxxxxx.com/guest_XXXXX_xxxxx/3xxxx 就是把整个url进行加密
e.headers["Authorization"] = l(e.baseURL + e.url), e
然后第三段是通过微信的openid拿到的的token,但是这里通过open_id拿token的接口也是需要请求头认证的,当然请全体加密方法跟上面一样,这个toekn也就是我们的登入凭证
简化一下认证的值的加密方法如下
base64编码->时间戳:md5("固定值"+请求的url(不带参数)+时间戳):微信用户的token
得到三段toekn的生成流程后这里可以来写poc,运行效果,这里测了一下存在,38W条预约数据
最后也是提交修复了
0x03 其他
修复后我还是去看了一下,多加了一段参数,把md5变为随机值了然后把js加密了一下,虽然还是可以解密,但是是把微信用户的token跟请求的id进行了校验,无法进行越权了判断是id是否是此微信用户的。
2 comments
tql
nb