这么多年一直都在用Chrome,但是Chrome的有各种各样的问题,准备以后逐渐向Firefox转移,这次抓包用的是Firefox。

网址:

https://zjuam.zju.edu.cn/cas/login

猜测zjuam中的am可能是authentication mainpage的意思。

FAQ

登录有什么用

因为浙大的大部分网站(教务网、计财处、就业信息网、学在浙大等等)都可以通过浙大通行证进行授权登录,所以只要登录了浙大通行证,就可以方便地完成一些机械化的操作。简单点可以用来自动进行「每日健康打卡」(https://github.com/Tishacy/ZJU-nCov-Hitcarder),复杂一些可以导出课表、成绩单、每个专业的就业情况、批量下载课件等等。之后如果有时间的话,可能会补充一些真正有用的应用。

既然这么简单,有风险吗?

没有。只要你的密码不外泄,没人可以登录你的浙大通行证。印象里今年上半年朋友圈里有一个疯转的「生成你的浙大记忆」小程序,输入浙大通行证的账号密码以后会给出你的很多数据,比如体测成绩、图书馆借阅情况、成绩单、CC98有几个账号、发了几个帖。这个是相当危险的,你不知道他有没有把你的账号密码保存在他的服务器上,而且就算他说他没有主动保存,这些数据也很可能会自动保存在某些地方。所以建议浙大通行证的密码设的复杂一点,也要对这些社会工程学的攻击保持警惕。

PC端登录

抓包

账号密码都输入123456,找到登录对应的请求:

【JS逆向】模拟登录浙大通行证_python

提交的表单数据如下:

【JS逆向】模拟登录浙大通行证_java_02

可以看出,密码是经过加密的,而且还有一个来源未知的execution参数。

在调试器中打开全局搜索(Mac:cmd+shift+F,Win:ctrl+shift+F),搜索execution,可以在登录页面的HTML源码中找到它的值,类似之前写抽卡机时候碰到的RequestVerificationToken参数。

【JS逆向】模拟登录浙大通行证_java_03

定位加密

全局搜索password,在login.js文件中找到加密的流程如下

【JS逆向】模拟登录浙大通行证_java_04

这里RSA加密所需的两个参数exponentmodulus是从登录前的一个请求的响应中得到的:

【JS逆向】模拟登录浙大通行证_java_05【JS逆向】模拟登录浙大通行证_python_06

我们知道,每次对getPubKey这个API发送请求得到的响应是不同的,那么在模拟登录时如何保证我们获取得到的公钥就是这次登录需要的呢?事实上获取公钥的响应中还包含了一个名为_pv0的cookie,发送登录的POST请求时需要包含这个cookie。

【JS逆向】模拟登录浙大通行证_python_07【JS逆向】模拟登录浙大通行证_python_08

复现加密的流程

用PyExecJS

把login.js中的checkform函数和用到的RSAUtils保存下来,然后用PyExecJS调用这段JS代码,可以得到控制台中相同的结果。

【JS逆向】模拟登录浙大通行证_python_09

用Python复现

如果用Python的rsa库或者pycryptodome库来实现,即使公钥的固定的,每次加密的结果也是不一样的。这是因为这几个库会按一定规则对原文随机填充后再加密。我在GitHub上找到了别人实现的没有填充的RSA加密,向他敬礼