今天的目标是 中大网校 的模拟登录,看图可知passwordLogin是登录请求,这里是对password进行了某种加密,想要模拟登录成功就需要知道密码的加密逻辑。
首先点开Initiator,查看该请求发送过程中执行了哪些js代码,执行顺序为从下到上,jquery开头的js文件pass,剩下的挨个去点击,找相关加密逻辑。
点开utils文件,在相关位置打下断点再次发送请求,可以看到此处执行的是url后缀为getTime的请求,返回文章最上方看到,此请求为最先发出的请求,跟密码加密无关,但响应返回了貌似时间戳的数据。我们先往下执行
passwordLogin请求了,到这一步password已经完成了加密。所以需要往前去找加密逻辑,找到右边的call stack,往下一步点击
取消前面的断点,在此处打上新断点,继续发送请求
看断点之前执行的代码,拿到加密逻辑password:encryptFn(pwd+’’+ress.data)
此处pwd还是未加密状态,很明显encryptFn就是加密函数,此处传值pwd+ress.data,data就是时间戳,也就是说在登录过程中,首先getTime请求获取时间戳,把我们的明文密码+返回的时间戳做了拼接加密。接下来,进入encryptFn函数,看看该函数做了什么操作。
进入该函数之后再次打断点,重新发送登录请求,可以看到一个publicKey,有点经验的小伙伴就该猜到了,这是公钥,该处js函数的含义就是new了一个名为‘o’的加密对象,传入publicKey,然后加密字符串‘e’,这里e就是前面说到的密码明文+时间戳。很明显就是一个RSA加密。接下来就是python还原RSA加密过程。
message = '1231231644397774701'publicKey = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA5Zq6ZdH/RMSvC8WKhp5gj6Ue4Lqjo0Q2PnyGbSkTlYku0HtVzbh3S9F9oHbxeO55E8tEEQ5wj/+52VMLavcuwkDypG66N6c1z0Fo2HgxV3e0tqt1wyNtmbwg7ruIYmFM+dErIpTiLRDvOy+0vgPcBVDfSUHwUSgUtIkyC47UNQIDAQAB\n-----END PUBLIC KEY-----"rsa_key = RSA.import_key(publicKey)rsa_obj = PKCS1_v1_5.new(rsa_key)rsa_message = rsa_obj.encrypt(message.encode('utf-8'))print(base64.b64encode(rsa_message).decode('utf-8'))
message是要加密的明文+时间戳,这里的时间戳是请求getTime获取的时间戳,也就是说在发送模拟登录请求之前要先通过session请求该接口获取时间戳,保持好会话,然后再模拟登录才能得到服务器响应登录成功。至于验证码大家自行解决。本文仅提供解决思路,不提供完整代码。
感谢各位大佬浏览,有不足之处请指教!!!