最近利用工作之余,把之前研究的东西又翻看了一遍,发现其中一个数据表格的导出,并没有对网站的登录进行模拟。本着打破砂锅问到底的精神,再一次打开该网站,研究了该网站的登录是怎么一回事的。
首先,打开抓包工具fiddler,设置过滤的网站参数。如下图,点击打开Filters分页,勾选Use Filters,在下方输入框中输入目标网站的地址。
接着打开浏览器,清除浏览数据,其目的是为了清除cookie和相关缓存信息,保证数据包为首次完整流程的抓取。如下图,输入账号密码,直接登录。
在登录成功后,便可以在fiddler中获取到登录全流程的数据包信息。如下图示。
对抓取到的数据包信息进行筛选,最后得到三个数据包,在Comments中标注猜测的内容,其中第二个数据请求中有带用户名和加密后的密码,故需要对整个请求的所有参赛获取进行分析,尽量完全模拟整个发送过程,这边我用尽量这个词是因为,有时候参赛并不一定需要全部都带上,这个取决于服务端的检验,或许服务端只关心账号和密码,其他字段可有可无,但如果我们能做到全真的模拟,那么所有参数都带上即为最佳。如下图所示,我们需要对请求中8个参数进行分析。初步猜测可变的字段有__VIEWSTATE,Username,Password,NdToken1,NdToken2。那么这五个参数的由来肯定是在这个请求发送之前获取到的。因此我们定位范围即为该请求发送之前的所有请求。
当我执行查看第一个数据请求时,我发现所有的参数都在该请求返回的数据信息内,即打开网页时,网页源码带有相关的参数。如下图所示。
至此,我们可以清楚的知道,_VIEWSTATE,NdToken1,NdToken2可以直接解析得出,而Username为用户输入的,且这边也为明文传输,故我们也不用关心。那么剩下的就Password需要稍微研究下。通过上图可以得知,Password进行了RSA加密,而模数n和指数e都能在上方直接解析得出,那么我们只需要模拟该过程即可。
但在随后的模拟过程发现一直无法成功登录,故利用了断点调试,发现Password在进行RSA加密时,并非登录时的密码,而是另一个字符串,详细查看了此处代码,发现原来进行RSA加密前,对密码进行了一次base64encode加密,如下图所示。
而此处的具体加密方式,我们可以在上方找到该方法,如下图所示。
因此,我们只要在RSA加密之前,只需对密码先进行一步base64encode加密即可。此处也可以通过断点调试获取到加密后的密码字符串,通过与我们代码模拟得到的字符串进行对比,可以做阶段性的校验。而RSA加密每次结果都是不一样的,故无法通过对比RSA结果判断代码的正确与否。
当我们以为一切都搞定的时候,发现还是无法正常登录成功。再次review整个流程,发现每次打开网页的时候,RSA加密的模数n都是不一样的。因此,我们需要每次解析获得模数,通过模数进而得到公钥,得到密文,从而模拟成功。此处需要注意的是,网站的RSA加密后长度为256位,我们模拟出来的密文长度也必须是256位。
再次修改代码后,即发现登录成功。至此,该网站的登录我们算是搞定了,开心!
以下为代码分享。
对爬虫有兴趣的小伙伴,可以给我留言或私聊我,我们可以互相讨论学习。
欢迎关注我个人的公众号