前言:
最近群里有同学问怎么模拟教务网登陆,想起我一开始做的时候的迷茫,故将此分析写下,供各位同学参考。(文章已同步到我的个人博客)
正文:
首先准备必要的工具:fiddler、firefox。
0x01:抓包
以南京林业大学为例:
请求参数如下:
txt_asmcdefsddsd
是学号,Sel_Type
应该是类型,主要是两个参数: dsdsdsdsdxcxdfgfg
,fgfggfdgtyuuyyuuckjg
,这两个应该都是加过密了。
这两个请求是请求验证码的。
下一步开始分析
0x02:找加密函数
重新打开到登陆页面
F12,定位到该form,我们发现:
密码框在失去焦点和按键弹起时都会触发
chkpwd()
函数。
验证码框在点击和获得焦点时会触发
showvc()
函数,在失去焦点和按键弹起时会触发chkyzm()
函数,showvc
仅仅是展示验证码不管。
在form标签下有一个onsubmit触发的函数ChkValue()
,但是发现这个函数并不涉及加密,不用管。
0x03:分析函数
将该form的对应的js函数复制出来。
function chkpwd(obj) { if(obj.value!='') { var s=md5(document.all.txt_asmcdefsddsd.value+md5(obj.value).substring(0,30).toUpperCase()+'10298').substring(0,30).toUpperCase(); document.all.dsdsdsdsdxcxdfgfg.value=s;} else { document.all.dsdsdsdsdxcxdfgfg.value=obj.value;} }
function chkyzm(obj) { if(obj.value!='') { var s=md5(md5(obj.value.toUpperCase()).substring(0,30).toUpperCase()+'10298').substring(0,30).toUpperCase(); document.all.fgfggfdgtyuuyyuuckjg.value=s;} else { document.all.fgfggfdgtyuuyyuuckjg.value=obj.value.toUpperCase();}}
略乱,美化一下:
function chkpwd(obj) {
if (obj.value != '') {
var s = md5(document.all.txt_asmcdefsddsd.value + md5(obj.value).substring(0, 30).toUpperCase() + '10298').substring(0, 30).toUpperCase();
document.all.dsdsdsdsdxcxdfgfg.value = s;
} else {
document.all.dsdsdsdsdxcxdfgfg.value = obj.value;
}
}
function chkyzm(obj) {
if (obj.value != '') {
var s = md5(md5(obj.value.toUpperCase()).substring(0, 30).toUpperCase() + '10298').substring(0, 30).toUpperCase();
document.all.fgfggfdgtyuuyyuuckjg.value = s;
} else {
document.all.fgfggfdgtyuuyyuuckjg.value = obj.value.toUpperCase();
}
}
先看chkpwd()
:
比较简单, 主要流程如下:
1.对于obj的值md5计算,然后取前30位,转换成大写。
2.txt_asmcdefsddsd的值(也就是学号)与计算的结果拼接字符串,尾部加上学校代码,作为新的字符串。
3.最后再计算md5,取前30位转大写
chkyzm()
也是类似的,不再赘述。
这里md5()
函数来源于引用的md5.js,看了一下,并没有什么坑。
0x04:python实现
知道加密流程之后就可以利用python重写。
计算md5可以使用 hashlib 库。
简单实现如下:
def md5sum(obj):
md5=hashlib.md5(obj.encode('gb2312')).hexdigest()
return md5
实现 chkpwd():
def chkpwd(pwd,stu):
s = md5sum(stu + md5sum(pwd)[:30].upper() + '10298')[:30].upper()
dsdsdsdsdxcxdfgfg = s
return dsdsdsdsdxcxdfgfg
实现 chkyzm():
def chkyzm(yzm):
s = md5sum(md5sum(yzm.upper())[:30].upper() + '10298')[:30].upper()
fgfggfdgtyuuyyuuckjg = s
return fgfggfdgtyuuyyuuckjg
最后构造一个相应的登陆请求即可。
具体实现可以参考我的GitHub上的代码青果教务系统选课助手
推荐一个小工具 将fiddler 和 firefox上的header转成json