• 前言

    感觉学校教务处比较简单,拿来练练手

  • 分析网页

    登陆界面如下:

教务处登陆界面

可以看到我们学校教务处的登陆界面还是比较简单的,没有验证码之类的东西,这就减少了很多工作量。


浏览器抓包:

第一个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位的字符串。
多登陆抓包几次可以看到signpwd是一直在变的。
初步猜测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加密之后得到的。