0x00 前言

去某学校比赛,入校需要提前预约,预约时测了一下,以下内容纯属虚构如有雷同纯属巧合

0x02 过程

是一个公众号系统,我这里是审核预约通过了

50639-stwf6ba421.png

点击卡片查看得到链接 https://xxxxxx/guest_XXXX_XXXX/3xxxx

33799-2orsm377j6r.png

url里面带了id,先试了一下修改成其他id,返回了401

15715-r7i3h9jbpc.png

查看数据包头发现认证的方式

40947-jdtrvcubniq.png

MTY5OTA4MTEzMDoyZDFjYWUzMjI4MWE5NGQyY2ZlMTMyMjM1NWU2NThhOTozXzQwNTdGM0FBQkRCQzQ3MDJBNTI5MTBGN0QwNENCQkM3

解码一下

1699081130:2d1cae32281a94d2cfe1322355e658a9:3_4057F3AABDBC4702A52910F7D04CBBC7

是三段值,第一段很明显是时间戳如果id正确时间戳不对会显示

45323-dhei12twuce.png

然后重新抓包访问,第二段在请求包里面没找到,猜测在js里面,然后去翻js,这里能看到很明显的拼接三段的内容

84021-byz4dc3vslr.png

核心代码如下,这里主要得到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也就是我们的登入凭证

95953-saftww9ye.png

简化一下认证的值的加密方法如下

base64编码->时间戳:md5("固定值"+请求的url(不带参数)+时间戳):微信用户的token

得到三段toekn的生成流程后这里可以来写poc,运行效果,这里测了一下存在,38W条预约数据

75641-spa5vyfz0v.png

最后也是提交修复了

40147-meeymsz6xi.png

0x03 其他

修复后我还是去看了一下,多加了一段参数,把md5变为随机值了然后把js加密了一下,虽然还是可以解密,但是是把微信用户的token跟请求的id进行了校验,无法进行越权了判断是id是否是此微信用户的。

Last modification:November 27, 2023
  • 本文作者:Juneha
  • 本文链接:https://blog.mo60.cn/index.php/archives/1338.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
  • 法律说明:
  • 文章声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任,本人坚决反对利用文章内容进行恶意攻击行为,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全,本文内容未隐讳任何个人、群体、公司。非文学作品,请勿过度理解,根据《计算机软件保护条例》第十七条,本站所有软件请仅用于学习研究用途。
如果觉得我的文章对你有用,请随意赞赏,可备注留下ID方便感谢