-
前言
感觉学校教务处比较简单,拿来练练手
-
分析网页
登陆界面如下:
可以看到我们学校教务处的登陆界面还是比较简单的,没有验证码之类的东西,这就减少了很多工作量。
浏览器抓包:
第一个Login.html就是登陆页面,下面是几个css文件,可以忽略。主要是 md5.js这个js文件,可以知道教务处的加密方式八成是md5加密
。
【md5加密:MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆】
输入账号密码点击登陆之后,抓包登陆成功之后的界面
可以看到,抓包到的第一个就是接收登陆界面账号密码表单的页面【http://202.115.133.173:805/Common/Handler/UserLogin.ashx】 ,因为他的方法为post。 虽然我们在浏览器里登陆时只填了用户名和密码,但表单里包含的数据可不只这些。可以看到在抓包到的表单数据如下(保护个人隐私,所以图片中一些信息打码了,下面列出来的数据是我虚构的,没有任何影响,只是作为演示)
Action: Login
userName: 123456789789
pwd: 723d505516e0c197e42a6be3c0af910e
sign: 1598267074584
这里的 userName
是你的学号,pwd
是加密过后一段32位的字符串。
多登陆抓包几次可以看到sign
、pwd
是一直在变的。
初步猜测sign
可能是时间戳。然后再百度搜一下时间戳,可以获得当前的时间戳,看到当前的时间戳前几位是跟sign
相吻合的,后几位不吻合,再观察分析一波可以看出来sign
是毫秒级的时间戳。
下面就剩下pwd
不知道了。
这时再回到我们的登陆界面
找到 LogUserManage.js?xxx=20191107 双击打开,可以看到下面的代码
//for students
function UserLogin(userName, pwd) {
var sign = new Date().getTime();
var user = userName.trim();
var signedpwd = hex_md5(user + sign + hex_md5(pwd.trim()));
var data = { Action: "Login", userName: user, pwd: signedpwd, sign: sign };
var url = "/Common/Handler/UserLogin.ashx";
$.post(url, data, function (rs) {
if (rs == "0") {
window.location.href = "/Default.aspx";
} else {
$(".loading").hide();
if (rs == "4" || rs == "2" || rs == "1") {
alert("密码或者用户名错误");
}
else if (rs == "3") {
alert(" 账户已经被锁定, 请登陆学生缴费平台核对缴费信息,完成缴费后24小时候解锁系统, 已经办理缓交手续的同学,请联系学生资助管理中心核实,电话84078912\r\n");
window.location.href="http://wsjf.cdut.edu.cn/";
}
}
});
}
//用户退出登录
function UserLoginOut() {
var data = { Action: "LoginOut" };
var url = "/Common/Handler/UserLogin.ashx";
$(".loading").show();
$.post(url, data, function (rs) {
if (rs == "0") {
window.location.href = "/login.html";
} else {
//mini.alert("退出登录失败,请再试");
window.location.href = "/login.html";
//$(".loading").hide();
}
});
}
//菜单操作
$(document).ready(function () {
/*
setTimeout(
function () {
$('*[target = "main"]').click(function () {
var name = $(this).html();
var memo = $(this).attr("memo");
$("#FnName").html(name);
$("#FnNotice").html(memo);
});
}, 500);
*/
});
这里面对我们有用的代码也就是第1——9行的代码,代码里很清楚的写着。
var sign = new Date().getTime();
可以看到sign就是登陆时的时间戳;
var signedpwd = hex_md5(user + sign + hex_md5(pwd.trim()));
这里signedpwd就是pwd,而hex_md5()这个函数在我们前面看到的md5.js中有,也就是标准的md5加密,将输入的字符加密成32位字符串。
可以看到pwd是由【user(学号)+sign(时间戳)+由md5加密之后的密码】再经过md5加密之后得到的。