miboy 发表于 2020-9-23 11:44

04-咪咕视频登录RSA分析

省略登录url参数,得到精简版的login页面https://passport.XXXX.cn/login
https://pic.rmb.bdstatic.com/bjh/627dd92b7157e5304889c8bf7a0ef94f.png
输入测试账号密码,开启抓包,看看登录的请求。
https://pic.rmb.bdstatic.com/bjh/4082e16ce7b090ba10aaf707e7f61ebf.png
观察到页面共发起两个xhr请求。分别是publickey获取加密的参数,authn用于登录。

publickey请求返回:
https://pic.rmb.bdstatic.com/bjh/0a1eadf9767c6d469b8d426c141d145b.png
authn请求返回:
https://pic.rmb.bdstatic.com/bjh/456bc1a6d18bbe6d2f1d56f903865b1d.png

authn请求传参:

https://pic.rmb.bdstatic.com/bjh/8c5130f24990abe8345183a372e9c833.png

遇到这一堆字符串,新手已经alt+f4了,但其实不要把困难看太高,学会把很多困难拆分成一个一个,逐一攻破。完事回头再看,也就那么回事,都是吓唬人的。

找加密也讲究经验和方法,一般我都是从密码加密开始的。先全局搜索一下,看看有没有指定的参数名。
ctrl+shift+F 调出全局搜索:enpassword

https://pic.rmb.bdstatic.com/bjh/0512c947ca69025c5bd61edd82af361b.png

貌似结果不尽如人意,发现这个name还有个class名,顺便看看这个类名有没有。于是,在loginPage.js文件中发现两处,点进去看看。
https://pic.rmb.bdstatic.com/bjh/01ada005a97634e7eee08b3b25b9e1e8.png
惊喜的发现,这三段代码看起来是页面所有的参数加密都在这里。
红框(1):创建RSA对象,设置key,加密密码字段并设置值;
蓝框(2):创建RSA对象,设置key,加密账号字段并设置值;
绿框(3):将页面的modulus和publicExponent参数传入rsaFingerprint函数,取得结果并设置值。

https://pic.rmb.bdstatic.com/bjh/900accdc797a4aaa0d92a71a01b6cfb4.png
以上是目前观察得出的结论,还需断点调试,看看是不是真的这里。
再次点击登录,果然,进入这段代码了。
https://pic.rmb.bdstatic.com/bjh/f028ac1f078ba48bbd5c4bf828c2e318.png

找到目标了,那就进去看看怎么实现的。(部分代码)
https://pic.rmb.bdstatic.com/bjh/2f32adf6b137c21847ead534646d8c3e.png
显然,我们需要把关联到的加密函数都复制下来。导入到webstorm里,缺啥补啥。
https://pic.rmb.bdstatic.com/bjh/ee31379c7744c0013bf35b3429a7eb16.png

这边JS代码是将对象导出,我们不需要,直接赋值给全局变量就行。

ab.prototype.nextBytes = _,
db.prototype.doPublic = fb,
db.prototype.setPublic = eb,
db.prototype.encrypt = gb;//注意这里要改成分号,结束
var RSAKey = db;//直接把对象赋值给RSAKey
c = new r.RSAKey;
c.setPublic(a.result.modulus, a.result.publicExponent);
var d = c.encrypt(b.val());接下来,就可以把上面这三行加密代码,封装成自己的加密函数,以供外部调用。
var modulus = "00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817"
var publicExponent = "010001"
function encrypt(text){
var c = new RSAKey();
c.setPublic(modulus, publicExponent);
return c.encrypt(text)
}

console.log(encrypt('qq1234'))
//70778fb8df8fff56fd313399253335c96358e07083a07030c60eda4c89e3c63788633969a499d363e2efa12d50adaf5499c42bb3e74212c120773a5afe59578d4b34ea13816ada9b896af7c05c8d6d51e792123eeee8cbd9d7729c496e0fdfb018cb19a682571e5e3a1cb27082a0beddce90f9f806bd2cc106eac6a4c1ac139a


通过这个encrypt函数,就可以直接算出加密字段loginID和enpassword。紧接着,来看看fingerPrint和fingerPrintDetail。根据上文所述,这两个参数,在经过rsaFingerprint方法后得到。于是我们进入这个函数,也尝试构造加密方法。
var b = q.page.rsaFingerprint(a.result.modulus, a.result.publicExponent);

latvro 发表于 2020-9-23 14:55

谢谢你分享,向你学习

w92vv 发表于 2020-9-23 17:38

厉害 厉害 若然我没明白{:301_1003:}

aq78 发表于 2020-11-6 14:39

好厉害《但是这是干什么用的啊?
页: [1]
查看完整版本: 04-咪咕视频登录RSA分析