本篇文章作者 ius,本文属 i 春秋原创奖励计划,未经许可禁止转载
原文链接:https://bbs.ichunqiu.com/thread-63833-1-1.html
某教务系统登录逆向分析
前言
这个系统相信很多高校都在用,有时候期末出成绩,我们经常会吃完饭看看,打完游戏看,刷完抖音看看,睡醒一觉也得看。这次带大家分析一下这个系统的登陆参数,还有验证码如何识别。
目标参数:
正文
我们全局搜索csrftoken
可以看出来这是后端生成的一个随机值,然后被隐藏了起来
在元素中找到这个值,然后右键复制->复制XPath
复制出来的是这样的//*[@id="csrftoken"]
我们在后面加上/@value
意思是取这个元素中的属性值,运行测试,没有问题
然后我们全局搜索encrypt
为什么搜这个呢,这是因为在前端加密中,经常会用到这个加密函数,如果是没有混淆的网站,搜这个一般都可以搜出来
然后我们找到了密码加密的位置
打上断点,重新提交测试
成功断点
我们可以看出来,这是一个RSA加密,先是将公钥中的模数和指数转为hex,然后进行设置
这里的公钥是网络请求出来的
流程有了,我们先把js代码模拟出来。
跟浏览器的对比一下,可以看出是一样的
然后测试一下modulus
可以发现也是没有一点点问题的
接着,我们来模拟一下RSA加密
先在终端安装node-rsa
npm install node-rsa
安装成功后我们导入
开始模拟
经过一番测试之后
我发现node中传递公钥需要传递Buffer流
所以不需要b64tohex...
现在加密模拟出来了,我们来模拟登录流程
首先,请求登录页面,获取csrftoken
然后,请求公钥接口,获取publickey
最后,使用公钥对密码进行RSA加密
加密参数都模拟好了,我们来请求测试一下
因为频繁的测试,导致出现了验证码
这里我们使用ddddocr
来识别验证码
写入到本地来查看是否相同
运行
可以看到,识别出来的是一样的
然后我们开始提交请求
提示我们密码不正确???
这里我们检查一遍流程
发现没有任何问题
密码也确定是对的
那只有一种可能
就是加密出来的密码不对
然后我们开始一一对照
我们查看对比浏览器的加密后16进制数
因为使用的是rsa加密。所以每次结果都会不相同,这里我们无法对比
我们测试加密后的结果,有何不同
可以发现,经过base64编码后的结果不相同
第一个是使用通用base64进行编码
第二个是使用此处的base64函数编码
可以发现这里的是魔改base64
我们选择直接复制此处的base64文件
再次编码发现结果相同了
导出函数
再次运行
还是报错?!
此处我再次怀疑是我加密方式不对
然后我选择将整个rsa加密文件扣下来
使用他使用的加密方式,我这还能错??
运行测试
???????
此处省略1万的问号
还说我密码不正确???
在这里,我浪费了大量的去反复检验
流程是否错误
加密是否错误
检验到最后发现,一样的不能再一样了
这是怎么回事?
其实这里使用了大名鼎鼎的TLS指纹校验
TLS指纹不同于ua,是比较底层的一种标识
那我们怎么解决呢?
使用curl-cffi
库,就能完美的解决这个问题
pip install curl-cffi
然后再次运行
成功!
后记
这次登陆分析其实没想到会花费这么久的时间
因为加密参数很清晰明了
只不过没仔细分析是否进行了魔改
最后放弃自己模拟,直接扣出魔改后的代码
结果还是无法登录
这又让我怀疑是不是流程出错了
然后又反复调试了半天
还是没办法
最后的最后,想尝试一下tls指纹
结果成功了
只能说不可小觑天下英雄
没想到这个教务系统还会做tls校验
没想到啊,是真没想到啊
终于有个比较详细的分析了
学到了