枯燥的寒假生活(二) 武汉大学老教务系统提交表单时的密码加密方式

探索教务系统中提交表单的密码加密方式

一、写在前面
承接上一篇文章python模拟登录教务系统

之前实现登录时只是知道提交表单时密码是经过加密的,但是并不知道具体的加密方式,所以是采用抓包的方式直接得到加密以后的密码。但是这样通用性就很差,不能直接输入账号密码进行登录。还需要抓包,所以想要尝试一下找到加密的方法。(其实本来只是想试试,结果谁知道这个加密这么明显,这么草率)
在这里插入图片描述

二、处理密码的时间
根据经验来看的话,既然是发送表单才能登录,那么这个表单的处理应该是在前端完成的吧。
用burpsuite来抓包,发现确实是在前端就已经处理了密码(意料之中),所以就是我们在点击了登录以后进行的密码处理。
在这里插入图片描述
三、找到处理密码的代码的位置并分析
因为是点击了登录以后进行的表单修改和表单提交,那么直接在源代码里搜索onclick(javascript中的鼠标点击事件)应该就能找到些线索
在这里插入图片描述
总共找到三个有onclick的语句。

第一处<td rowspan="2"><input type="submit" value="" id="loginBtn" tabindex="4" onclick="beforsubmit()"></td>
第二处<a class="i18n change-captcha "  onclick="change()" style="line-height:30px;margin-top:10px;font-size:13px;font:宋体;" href="javascript:void(0);" name="verifyingCode"></a>
第三处<a href="javascript:void(0);" class="i18n" name="forgetPassword" onclick="forget()"></a>

第二处有个change-captcha,肯定与验证码有关,经后来观察发现是当你看不清验证码点击换一张的时候触发.
第三处的有个forgetPassword,凭借超凡的英语能力,肯定是忘记密码的操作.
所以排除法,我们要的肯定是第一条语句,(其实也写了submit, loginbtn)
我们看到他跳转到执行beforsubmit函数。那我们就去看这个函数。(他的before竟然还拼错了)
在这里插入图片描述

也就得到了下面这个好长但是杂乱无章的代码。

function beforsubmit(){            
if (window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"] !=""){               
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"] = hex_md5(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"]);}            
var vBGOiwPqc1 = new window["\x44\x61\x74\x65"]();            
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x74\x69\x6d\x65\x73\x74\x61\x6d\x70"]["\x76\x61\x6c\x75\x65"] = vBGOiwPqc1["\x67\x65\x74\x54\x69\x6d\x65"]();            
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x78\x64\x76\x66\x62"]["\x76\x61\x6c\x75\x65"] = encodeURI(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x78\x64\x76\x66\x62"]["\x76\x61\x6c\x75\x65"]);            
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"] = "\u6b66\u5927\u672c\u79d1"+ 
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"]+"\u7cfb\u7edf";            
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"] = encodeURI(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"]);        }

凭借着一点点js的知识和编码的知识,这个window表示调用js中的全局变量,那么这个\x64啥的肯定是ascii码了,用python稍加处理和整理。
得到下面的代码

function beforsubmit(){            
		if (window["document"]["form1"]["pwd"]["value"] !=""){                
			window["document"]["form1"]["pwd"]["value"] = hex_md5(window["document"]["form1"]["pwd"]["value"]);}            
			var vBGOiwPqc1 = new window["Date"]();            
			window["document"]["form1"]["timestamp"]["value"] = vBGOiwPqc1["getTime"]();            
			window["document"]["form1"]["xdvfb"]["value"] = encodeURI(window["document"]["form1"]["xdvfb"]["value"]);            
			window["document"]["form1"]["jwb"]["value"] = "武大本科"+ window["document"]["form1"]["jwb"]["value"]+"系统";            
			window["document"]["form1"]["jwb"]["value"] = encodeURI(window["document"]["form1"]["jwb"]["value"]);        }

稍加分析, 就是一个判断条件,如果密码不为空,就把表单中的时间戳怎么样,把密码怎么样,之类的,所以折腾了半天其实密码就是个简单的md5加密

那么我们就只需要在原来的爬虫代码中添加对密码的md5操作就行了
详情可以看下面的博客
python3中的md5操作

当然我也帮你复制过来了。来自大佬 “曾记否?”(侵删)

# 由于MD5模块在python3中被移除
# 在python3中使用hashlib模块进行md5操作

import hashlib

# 待加密信息
str = 'this is a md5 test.'

# 创建md5对象
m = hashlib.md5()

# Tips
# 此处必须encode
# 若写法为m.update(str)  报错为: Unicode-objects must be encoded before hashing
# 因为python3里默认的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()

print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)

# 另一种写法:b‘’前缀代表的就是bytes
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest()
print('MD5加密后为 :' + str_md5)

再懒一点就是直接下面的代码

import hashlib
pwd = '123456'
pwd_md5 = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()

四、代码分享
修改过后的代码还是在原来的那个repo里

https://github.com/blue-vegetable/whu_score_spider

五、写在后面

以上就是本次的全部内容啦,不过不得不说,这个老教务系统的反爬做的比较普通,不过因为不用在老教务系统抢课了,而且新教务系统也比较丝滑,平时也没有人没事去爬一个没啥软用的教务系统,所以没有设太多防吧。
不过最后知道加密方式就是一个md5的时候,内心还是忍不住就这了一下。
后面或许会去了解一下新教务系统的登录,相信有了这次经验,应该会轻车熟路,不过据说新教务系统用的是rsa加密,好家伙,上流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值