本篇文章作者 ius,本文属 i 春秋原创奖励计划,未经许可禁止转载
原文链接:https://bbs.ichunqiu.com/thread-63833-1-1.html

某教务系统登录逆向分析

前言

image-20240123081743636
image-20240123081743636

这个系统相信很多高校都在用,有时候期末出成绩,我们经常会吃完饭看看,打完游戏看,刷完抖音看看,睡醒一觉也得看。这次带大家分析一下这个系统的登陆参数,还有验证码如何识别。

目标参数:

image-20240123082014787
image-20240123082014787

正文

我们全局搜索csrftoken

可以看出来这是后端生成的一个随机值,然后被隐藏了起来

image-20240123082254962
image-20240123082254962

在元素中找到这个值,然后右键复制->复制XPath

image-20240123082603914
image-20240123082603914

复制出来的是这样的//*[@id="csrftoken"]我们在后面加上/@value意思是取这个元素中的属性值,运行测试,没有问题

image-20240123082818929
image-20240123082818929

然后我们全局搜索encrypt

为什么搜这个呢,这是因为在前端加密中,经常会用到这个加密函数,如果是没有混淆的网站,搜这个一般都可以搜出来

然后我们找到了密码加密的位置

打上断点,重新提交测试

image-20240123083236707
image-20240123083236707

成功断点

image-20240123083753922
image-20240123083753922

我们可以看出来,这是一个RSA加密,先是将公钥中的模数和指数转为hex,然后进行设置

这里的公钥是网络请求出来的

image-20240123084130278
image-20240123084130278

流程有了,我们先把js代码模拟出来。

image-20240123084400816
image-20240123084400816

image-20240123084437474
image-20240123084437474

跟浏览器的对比一下,可以看出是一样的

image-20240123084453940
image-20240123084453940

然后测试一下modulus

image-20240123084718775
image-20240123084718775

image-20240123084727489
image-20240123084727489

可以发现也是没有一点点问题的

接着,我们来模拟一下RSA加密

先在终端安装node-rsa

npm install node-rsa

image-20240123085408092
image-20240123085408092

安装成功后我们导入

开始模拟

经过一番测试之后

我发现node中传递公钥需要传递Buffer流

所以不需要b64tohex...

image-20240123090541865
image-20240123090541865

现在加密模拟出来了,我们来模拟登录流程

首先,请求登录页面,获取csrftoken

然后,请求公钥接口,获取publickey

最后,使用公钥对密码进行RSA加密

image-20240123091600929
image-20240123091600929

加密参数都模拟好了,我们来请求测试一下

因为频繁的测试,导致出现了验证码

image-20240123092056627
image-20240123092056627

这里我们使用ddddocr来识别验证码

写入到本地来查看是否相同

image-20240123092939976
image-20240123092939976

运行

可以看到,识别出来的是一样的

image-20240123093003010
image-20240123093003010

image-20240123093009424
image-20240123093009424

然后我们开始提交请求

提示我们密码不正确???

image-20240123100335241
image-20240123100335241

这里我们检查一遍流程

发现没有任何问题

密码也确定是对的

那只有一种可能

就是加密出来的密码不对

然后我们开始一一对照

image-20240123100526490
image-20240123100526490

我们查看对比浏览器的加密后16进制数

因为使用的是rsa加密。所以每次结果都会不相同,这里我们无法对比

我们测试加密后的结果,有何不同

image-20240123100613288
image-20240123100613288

可以发现,经过base64编码后的结果不相同

第一个是使用通用base64进行编码

第二个是使用此处的base64函数编码

可以发现这里的是魔改base64

我们选择直接复制此处的base64文件

image-20240123100730630
image-20240123100730630

image-20240123100949211
image-20240123100949211

image-20240123100957709
image-20240123100957709

再次编码发现结果相同了

image-20240123100924620
image-20240123100924620

导出函数

image-20240123101505973
image-20240123101505973

image-20240123101520502
image-20240123101520502

再次运行

还是报错?!

image-20240123100335241
image-20240123100335241

此处我再次怀疑是我加密方式不对

然后我选择将整个rsa加密文件扣下来

使用他使用的加密方式,我这还能错??

运行测试

image-20240123121427998
image-20240123121427998

???????

此处省略1万的问号

还说我密码不正确???

在这里,我浪费了大量的去反复检验

流程是否错误

加密是否错误

检验到最后发现,一样的不能再一样了

这是怎么回事?

image-20240123100335241
image-20240123100335241

其实这里使用了大名鼎鼎的TLS指纹校验

TLS指纹不同于ua,是比较底层的一种标识

那我们怎么解决呢?

使用curl-cffi库,就能完美的解决这个问题

pip install curl-cffi

image-20240123122037191
image-20240123122037191

image-20240123122051890
image-20240123122051890

然后再次运行

成功!

image-20240123122126297
image-20240123122126297

后记

这次登陆分析其实没想到会花费这么久的时间

因为加密参数很清晰明了

只不过没仔细分析是否进行了魔改

最后放弃自己模拟,直接扣出魔改后的代码

结果还是无法登录

这又让我怀疑是不是流程出错了

然后又反复调试了半天

还是没办法

最后的最后,想尝试一下tls指纹

结果成功了

只能说不可小觑天下英雄

没想到这个教务系统还会做tls校验

没想到啊,是真没想到啊