python3 学习笔记—《优雅的从教务系统中查成绩2.0》

优雅的从教务系统中查成绩2.0(进阶版)

上次写完Python 3 学习笔记—《优雅的从教务系统中查成绩》发现学校的教务系统升级了。同属于正方软件股份有限公司
这次的登陆密码使用了(RSA加密方式)非对称加密算法
扩展阅读RSA详解

0x00 写在前面

这次主要讲登陆
教务系统

0x01 正式工作

老规矩,想要知道登陆的过程就先进行抓包。
这里我还是使用 Chrome内核浏览器 按下F12打开调试工具
这里的登陆条件很简单 就只需要账号和密码,没有验证码了。之后对接到你的公众号上就可以进行很多骚操作了。

  • 第一步操作 输入账号:userid密码:pwd 点击登陆 并抓取数据

结果提示 用户名或密码不正确,请重新输入!

表单内容

表名内容备注
csrftokena7d2be1f-b589-4bec-86a3-857829b6c4c7,a7d2be1fb5894bec86a3857829b6c4c7这个是由服务器生成的,用于认证 右键 查看网页源代码 >Ctrl+F >搜索csrftoken
yhmuserid我们的用户名没有进行编码/加密
mmDHTxrOM4hqA3UAFT6D4wNerLfi/7worgHamukNZstsqnKED9,…这个是我们的密码明显进行了编码

密码是使用了base64编码。编码前肯定还有加密算法,那怎么知道是使用了什么算法呢,那就必须找js文件!

  • 第二步操作 找到登陆函数

搜索找到 login 函数 Chrome 一个人性化的功能就是可以查找 所有抓取到的数据包信息
在network>Ctrl+F>login
查找login函数
找到一个login.js文件 下面就是核心代码块

if($("#mmsfjm").val() == '0'){
			$("#hidMm").val($("#mm").val());
		}else{
			var rsaKey = new RSAKey();
			rsaKey.setPublic(b64tohex(modulus), b64tohex(exponent));//设置公钥
			var enPassword = hex2b64(rsaKey.encrypt($("#mm").val()));//将密码加密并进行base64编码
			$("#mm").val(enPassword); //将编码后的内容给mm
			$("#hidMm").val(enPassword);   //页面上放了一个隐藏的password类型输入框,name也是mm,防止密码自动填充,在提交的时候把内容设置成跟输入的密码一致
		}

很人性化的有备注,可以看出 使用了 RSA加密 接下来就只需要找出变量所在的内容

变量名称来源
modulushttp://教务系统域名/jwglxt/xtgl/login_getPublicKey.html
exponenthttp://教务系统域名/jwglxt/xtgl/login_getPublicKey.html
{"modulus":"AKO+a2Fyn93t\/7uw4V69loRhZMeTJBmeZJaAH5\/fUD5U1v2zvzjVoBhIIW9PJMMeCv4cLINOg9EC9CfbAkGieKeKM9IRpKOvdUgzkg\/DFCWzM2o+USXJy77j6tHYoSzvjeNnqhpqbcdM9Wj66a25jii\/j3GNd\/Fqv2DieMWaYuXV","exponent":"AQAB"}

进过加密后就成了我们刚刚抓包后的内容
那登陆过程明白了,接下来就可以进行最后一步了

  • 最后一步,封装成python3 代码

首先我们需要引用 RSA、Base64库 当然还有少不了requests、bs4
第一次可能需要pip一下

pip install rsa
pip install base64

首先解决密码部分,只要密码加密方式搞定了,接下来就好说了。
获取公钥并转为byte

yhm='你的账号'
mm = b'你的密码'#前面这个b 不能丢,是将格式转换为byte[]类型
session = requests.Session()
# 获取公钥需要的参数
publickey = session.get(
    'http://教务系统域名/jwglxt/xtgl/login_getPublicKey.html').json()
b_modulus = base64.b64decode(publickey['modulus'])  # 将base64解码转为bytes
b_exponent = base64.b64decode(publickey['exponent'])  # 将base64解码转为bytes
# 公钥生成,python3从bytes中获取int:int.from_bytes(bstring,'big')
mm_key = rsa.PublicKey(int.from_bytes(b_modulus, 'big'),
                       int.from_bytes(b_exponent, 'big'))

# 利用公钥加密,bytes转为base64编码
rsa_mm = base64.b64encode(rsa.encrypt(mm, mm_key))#这个就是密码加密后的内容

搞定密码后就把表单封装好。

url='http://教务系统地址/jwglxt/xtgl/login_slogin.html'#登陆界面的地址
page = session.get(url)#获取页面源代码
soup = bs(page.text, "html.parser")#将页面格式化

# 目的:获取认证口令csrftoken
csrftoken = soup.find(id="csrftoken").get("value")
postdata = {'csrftoken': csrftoken, 'yhm': yhm, 'mm': rsa_mm}#封装表单
rq = session.post(url, data=postdata)#表单提交
#将登陆后的内容源文件保存到本地
f = open('logintest.html', 'wb') 
f.write(rq.content)
f.close()

0x02 python源代码

完整代码

import requests
import base64
import rsa
from bs4 import BeautifulSoup as bs

yhm='你的账号'
mm = b'你的密码'#前面这个b 不能丢,是将格式转换为byte[]类型
session = requests.Session()
# 获取公钥需要的参数
publickey = session.get(
    'http://教务系统域名/jwglxt/xtgl/login_getPublicKey.html').json()
b_modulus = base64.b64decode(publickey['modulus'])  # 将base64解码转为bytes
b_exponent = base64.b64decode(publickey['exponent'])  # 将base64解码转为bytes
# 公钥生成,python3从bytes中获取int:int.from_bytes(bstring,'big')
mm_key = rsa.PublicKey(int.from_bytes(b_modulus, 'big'),
                       int.from_bytes(b_exponent, 'big'))

# 利用公钥加密,bytes转为base64编码
rsa_mm = base64.b64encode(rsa.encrypt(mm, mm_key))#这个就是密码加密后的内容
url='http://教务系统地址/jwglxt/xtgl/login_slogin.html'#登陆界面的地址

page = session.get(url)#获取页面源代码
soup = bs(page.text, "html.parser")#将页面格式化

# 目的:获取认证口令csrftoken
csrftoken = soup.find(id="csrftoken").get("value")
postdata = {'csrftoken': csrftoken, 'yhm': yhm, 'mm': rsa_mm}#封装表单
rq = session.post(url, data=postdata)#表单提交
#将登陆后的内容源文件保存到本地
f = open('logintest.html', 'wb') 
f.write(rq.content)
f.close()

登陆完了以后,其他的扩展功能就轻而易举了。

扩展阅读

1-RSA详解
2-一篇文章彻底弄懂Base64编码原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值