实战:对科文教务系统进行拦截
科文学院教务系统内网地址:http://10.110.240.221/jsxsd/
进入官网后再打开拦截。
输入一个错误的账号密码进行试探。
点击登陆按钮,进行拦截,可以拦截到如下信息:
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
,传输的数据有:
参数名 | 参数值 |
---|---|
loginMethod | LoginToXk |
userAccount | 123 |
userPassword | 123 |
encoded | MTIz%25%25%25MTIz |
通过重复实验,发现loginMethod
的参数值是固定的,同时userAccount
和userPassword
的值就是账号密码的明文,而encoded
参数随着账号密码的变化而变化,而相同的账号密码的encoded
值是相同的,因此判断encoded
参数值通过对账号密码依据某种规则进行加密得来的,在前端加密,只有通过js
的方式,因此只要获取到响应的js
函数,即可破解密码,从而实现模拟登录。
使用Burp
工具无法获得异步请求的静态文件。打开浏览器的控制台网络模块,刷新页面,得到如下:
其中js
文件有jquery.min.js
、jquery-1.11.1.min.js
、bootstrap.min.js
、conwork.js
、layui.all.js
,其中jquery
、bootstrap
、layui
都是非常出名的非加密用途的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
、网易
两大互联网公司的网站进行类似的模拟操作,明显可以发现科文学院教务官网的不足之处。
在上述两大互联网公司的网站中,常见的安全手段有:
- 通过放置大量的没有用的静态文件,加大破解者的工作量。
- 通过设置大量静态文件,每次访问时随机加载一定数量的静态文件,达到每次访问都会收到不同的静态文件的目的,来干扰破解者。
- 通过放置多个加密函数,而不是只传输一个加密函数,让破解者在寻找对应函数的时候耗费大量精力。
- 通过对加密函数的函数名非正常化,例如科文教务的加密函数叫
encodeInp
,可以重命名为login
,以迷惑破解者,甚至可以让破解者直接忽略此函数。 - 通过设置图形验证码。
- 使用非对称加密。