直接输入账号密码登入,找到web/login这个包,大家自行操作.
相关的加密字段如下,圈起来的password是我们本次需要逆向的参数,看到结尾有个等号,应该大致知道是啥加密了。
其余的参数如challenge、token等,来自b站上的极验验证码,直接开始跟栈分析我们的password。最终会跟到这,不想跟的小伙伴也可以全局搜索subForm.password,找到和我相似的地方可以了,这里是加密的入口。
进到it这个函数里头看,在函数的末尾处可以看到几个关键词,setPublicKey和encrypt,在此次下段点,果不其然,是一个典型的rsa加密,先new了一个a,然后通过设置publickey,最后调用encrypt对一个hash和密码明文的拼接值进行加密,然后返回加密后的password。
我们直接跟到a里头看看,发现他所有函数都在一个大方法里头,翻到最顶上还能看到webpackjson,遇到这样的先看总体代码长不长,不长直接全部扣下来再进行改写。这里使用两千行,我选择全部copy至本地改写。
扣下来后,头部画圈的这部分其实不需要,直接删掉,然后将function(t)改成一个自执行的方法。
然后跟到encrypt的位置,会发现他自动跳到这,我们可以直接用window或者重新定义一个全局变量进行导出,这里我选择window。直接在t这个函数下写上window.JSEncrypt = t;
有一点需要注意,rt方法的最后几行中也使用window对加密部分的代码进行导出,直接删掉即可,这部分都是可以删掉的。
最后我们仿写加密的方法,先new一个a 然后巴拉巴拉就可以了。整体代码如下
var window = global;
var navigator = {
appCodeName: 'Mozilla',
appName: "Netscape"
}
'''
代码过长,中间的部分省略,只展示关键部分,
省略的这部分代码直接扣就好了
'''
PublicKey = '-----BEGIN PUBLIC KEY-----\n' +
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n' +
'6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n' +
'/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\n' +
'Xl69GV6klzgxW6d2xQIDAQAB\n' +
'-----END PUBLIC KEY-----'
var hash = 'de4e2f7ed44dd7b6'
function password_encrypt(publickey, hash) {
RSAEncrypt = new window.JSEncrypt;
RSAEncrypt.setPublicKey(PublicKey);
after_encrypt_password = RSAEncrypt.encrypt(hash + '123123123');
return after_encrypt_password;
}
console.log(password_encrypt(PublicKey, hash))
加密结果如下:
注意publickey和hash值都是通过passport-login/web/key?这个接口返回的,而且hash的有效使用期在1分钟内,超过1分钟后无法使用。