JAVA 使用HttpClient模拟完成VPN和教务系统的登录
-----------------前几天想要用java写一个自动登录教务系统的程序,方便随时可以拿到教务系统上的信息。花了几天时间分析登录的流程和加密的方法,最后成功实现。记录一下过程。
流程分析:
由于学校的教务系统只能通过校内网进入,如果是外网还需要先登录VPN,所以流程很明确 :登录VPN拿到cookie后,再从vpn登陆教务系统,然后用登录后的cookie访问相应的页面即可。
实现:
先将浏览器cookie清空,然后开始测试第一个 :VPN登录页面,记录响应头的set-cookie。然后登录VPN,查看post的地址和请求头以及响应头的set-cookie。再选择教务系统,记录get的地址和响应头set-cookie以及请求头cookie,最后登录再记录登录的post地址和请求头,响应头的cookie。
记录完后分析一下上一次的set-cookie和本次的请求头的cookie的关联性。除了开始几个没用的cookie外,其他基本都是上一次set下一次发送。另外看到登录vpn和教务系统的表单中都有token需要发送,并且教务系统的表单还进行了加密。
![](https://img2022.cnblogs.com/blog/2669573/202208/2669573-20220825160206742-1813916485.png)
![](https://img2022.cnblogs.com/blog/2669573/202208/2669573-20220825160451662-1148342306.png)
在网页请求里面搜索了一下,发现了两个token都是写死在网页里,只需要两次get请求就能拿到。那么接下来就是密码加密的问题。打开登录的请求表单,下断点调试,最后找到登录的js文件,并且定位到加密的位置。
在网页控制台不断编辑尝试,最后得到了网页登录的js代码。
那么逻辑很清晰了,从公钥接口传入当前时间戳作为参数获得加密公钥,再将密码用公钥加密后将表单填好提交就行。
加密密码我选择的是将js文件下载下来搭建一个加密的环境,再对密码加密。
![](https://img2022.cnblogs.com/blog/2669573/202208/2669573-20220825162845484-2092209398.png)
![](https://img2022.cnblogs.com/blog/2669573/202208/2669573-20220825162816367-1849010353.png)
在postman上尝试了一下确实能够成功。然后开始写java的代码,但是java在VPN登录这一步就登录不上去了。显示:
因为用的是直接post+cookie的方式,这样每一次的session都是新的,但是带上cookie理论上应该被识别成上一次的session。我在poostman将cookie保存后断开链接,然后用cookie发送post登录vpn也会得到这个页面。应该是cookie设置为session断开后失效了。
查看了一下本地的cookie到期时间 :
也就是说session不能断开,要一次性登录上去。
最后选择httpclient 不断地get post 然后从传回来的页面里面拿token,再提交表,最后成功登录,拿到页面。
2022年8月25日