免责声明:
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
前言
去某学校比赛,入校需要提前预约,预约时测了一下,以下内容纯属虚构如有雷同纯属巧合
过程
是一个公众号系统,我这里是审核预约通过了
点击卡片查看得到链接 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条预约数据
最后也是提交修复了
其他
修复后我还是去看了一下,多加了一段参数,把md5变为随机值了然后把js加密了一下,虽然还是可以解密,但是是把微信用户的token跟请求的id进行了校验,无法进行越权了判断是id是否是此微信用户的。
原文始发于微信公众号(WIN哥学安全):【渗透实战】某访客系统越权测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论