实战:对科文教务系统进行拦截

科文学院教务系统内网地址:http://10.110.240.221/jsxsd/

进入官网后再打开拦截。

1-2错误密码试探

输入一个错误的账号密码进行试探。

点击登陆按钮,进行拦截,可以拦截到如下信息:

POST /jsxsd/xk/LoginToXk HTTP/1.1
Host: 10.110.240.221
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 80
Origin: http://10.110.240.221
DNT: 1
Connection: close
Referer: http://10.110.240.221/jsxsd/
Cookie: bzb_jsxsd=253F34A9C34D3A2849F560D88B8EF476; SERVERID=121; bzb_njw=359C682BAE9C81FDC16D469CF9DFEAD5
Upgrade-Insecure-Requests: 1

loginMethod=LoginToXk&userAccount=123&userPassword=123&encoded=MTIz%25%25%25MTIz

从所获取的信息中可以得知,登录的接口是POST请求http://10.110.240.221/jsxsd/xk/LoginToXk,传输的数据有:

参数名参数值
loginMethodLoginToXk
userAccount123
userPassword123
encodedMTIz%25%25%25MTIz

通过重复实验,发现loginMethod的参数值是固定的,同时userAccountuserPassword的值就是账号密码的明文,而encoded参数随着账号密码的变化而变化,而相同的账号密码的encoded值是相同的,因此判断encoded参数值通过对账号密码依据某种规则进行加密得来的,在前端加密,只有通过js的方式,因此只要获取到响应的js函数,即可破解密码,从而实现模拟登录。

使用Burp工具无法获得异步请求的静态文件。打开浏览器的控制台网络模块,刷新页面,得到如下:

1-3科文教务官网

其中js文件有jquery.min.jsjquery-1.11.1.min.jsbootstrap.min.jsconwork.jslayui.all.js,其中jquerybootstraplayui都是非常出名的非加密用途的js库,从而怀疑conwork.js

获取此响应,得到:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('b 9="o+/=";p q(a){b e="";b 8,5,7="";b f,g,c,1="";b i=0;m{8=a.h(i++);5=a.h(i++);7=a.h(i++);f=8>>2;g=((8&3)<<4)|(5>>4);c=((5&s)<<2)|(7>>6);1=7&t;k(j(5)){c=1=l}v k(j(7)){1=l}e=e+9.d(f)+9.d(g)+9.d(c)+9.d(1);8=5=7="";f=g=c=1=""}u(i<a.n);r e}',32,32,'|enc4||||chr2||chr3|chr1|keyStr|input|var|enc3|charAt|output|enc1|enc2|charCodeAt||isNaN|if|64|do|length|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|function|encodeInp|return|15|63|while|else'.split('|'),0,{}))

这是一个加密后的js文件,使用工具对其进行解密:

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodeInp(input) {
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;
    do {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;
        if (isNaN(chr2)) {
            enc3 = enc4 = 64
        } else if (isNaN(chr3)) {
            enc4 = 64
        }
        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = ""
    } while ( i < input . length );
    return output
}

通过测试,确认该文件就是加密文件。

后通过python进行爬虫,成功使用requests模块实现模拟登录。

启示:

科文学院教务官网毫无安全性可言,很容易发生不可挽回的可怕后果,通过对bilibili网易两大互联网公司的网站进行类似的模拟操作,明显可以发现科文学院教务官网的不足之处。

在上述两大互联网公司的网站中,常见的安全手段有:

  1. 通过放置大量的没有用的静态文件,加大破解者的工作量。
  2. 通过设置大量静态文件,每次访问时随机加载一定数量的静态文件,达到每次访问都会收到不同的静态文件的目的,来干扰破解者。
  3. 通过放置多个加密函数,而不是只传输一个加密函数,让破解者在寻找对应函数的时候耗费大量精力。
  4. 通过对加密函数的函数名非正常化,例如科文教务的加密函数叫encodeInp,可以重命名为login,以迷惑破解者,甚至可以让破解者直接忽略此函数。
  5. 通过设置图形验证码。
  6. 使用非对称加密。