LittleC
技术学习记录
技术交流学习
如何光明正大找到授权问题

受到疫情影响,开学时间延长,在家里闲得慌。最近看到一个网站(保密,可能有些人知道),有类似网盘的文件存储功能,虽然限制比较多,但是还是能用的水准。

打开F12,能看到直接有请求获取access token,然后上传文件

但是,直接请求,发现405,观察请求头部,看到有身份验证相关头部 authorizationx-content-security ,接下来目的就是要怎么搞到这些数据

首先,先尝试伪装登录包,退出账户,登录一个不存在的账户尝试

看到encryptedPassword,判断密码是加密了,用base64解一解发现不行,根据call stack溯源

其中的this.$encrypt.encryptPassword(a)非常可疑,在此打下断点

根据基础JS知识,阅读代码,变量t是从上面三个public key中随机选择一个,加密密码,理论上,后端拿到加密的密码后使用private key解密,我猜这里的作用大概是网站开发者防止中间者抓包https,获得密码

深入a.a,在chunk-vendors中发现这是RSA library for Node.js,那么要模拟很简单,直接nodejs中安装这个包使用就可以了,在这里,使用一个key就可以

function encryptPwd(pwd) {
    const rsa = new NodeRSA(key)
    rsa.setOptions({ encryptionScheme: "pkcs1" })
    let enc = rsa.encrypt(pwd, 'base64');
    return enc;
}

之后,阅读相关代码,即可破解出登陆的结构信息,使用axios在nodejs进行模拟

成功登录并获取相关信息
注:我在写这篇文章的时候,才发现登录的response已经提供了assumerole中的access token,但是我已经把 authorizationx-content-security 怎么获取的方法研究过了,在这里也提一下吧

assumerole 请求进行溯源,下断点,很明显可以看出这是axios

那么,猜测前端开发者一定会使用到axios的interceptors或create instance功能,不信?来找一找

如图所示,继续探索,o["default"].encrypt.httpSign的代码如下

稍微分析一下每个变量的作用

e 请求地址 t GET参数 n 请求方式 s 应该是POST的data

c 调用UUID库,生成uuid
s 把data给stringify
f 和上面套路一样 三个key选一个
h 当前十位数timestamp
d 把body的数据求SHA256
p 一个组合
m 也是一个组合
v CryptoJS的HmacSHA256算法, p为加密内容,uuid为key
g pkcs1算法初始化
b 将m用分号连接,然后base64
y 将v的结果表示为base64
return 拼接字符串,函数结束

emm,我写文章写到这,用nodejs试了一下,发现没有X-Content-Security也能请求 assumerole ,我迷惑了,我搞了那么久有锤子用 ze

不过目的达到,注:NodeJS中使用crypto.createHash('sha256').update(u).digest('hex'); 获取sha256
使用 Buffer.from(c).toString('base64') 获取Base64

最后,虽然file和image的oss没有Access-Control-Allow-Origin,但是可以当作文件临时分享站,岂不美哉

上传方法

经过我测试,使用web上传大文件会时不时卡住,所以用nodejs上传会更舒服一些

在网页端上传时,会提示 文件大小不能超过50M 或者 xxx格式不支持上传

通过Ctrl+F搜索js文件,找到提示的内容

通过启用Chrome Devtools的Overrides功能,达到使用本地替换js的效果


在Overrides标签页中启用此功能,然后保存某个js

在这里可以直接把512e5修改掉,或者把条件改为true,同理,对文件格式的限制、以及另一处文件大小检测进行操作

技术交流学习

如何光明正大找到授权问题
受到疫情影响,开学时间延长,在家里闲得慌。最近看到一个网站(保密,可能有些人知道),有类似网盘的文件存储功能,虽然限制比较多,但是还是能用的水准。 打开F12,能看到直接有请…
扫描二维码继续阅读
2020-02-23