测试教务部学生系统是否存在sql注入漏洞(一)
教务部地址如下(在后面会发现其实占有4个ip地址)
对用户名与密码先都输入1观察post行为是怎么样的
http://202.114.234.160/jsxsd/xk/LoginToXk
发现对这个地址post一个包
(看来不是随随便便直接提交上去啊)
直接分析页面源码发现
一部分js代码在页面中
function ReShowCode(){
var SafeCodeImg = document.getElementById('SafeCodeImg');
var url="/jsxsd/verifycode.servlet?t="+Math.random();
SafeCodeImg.src = url;
}
function submitForm1(){
try{
var xh = document.getElementById("userAccount").value;
var pwd = document.getElementById("userPassword").value;
if(xh==""){
alert("用户名不能为空!");
return false;
}
if(pwd==""){
alert("密码不能为空!");
return false;
}
var account = encodeInp(xh);
var passwd = encodeInp(pwd);
var encoded = account+"%%%"+passwd;
document.getElementById("encoded").value = encoded;
var jzmmid = document.getElementById("Form1").jzmmid;
return true;
}catch(e){
alert(e.Message);
return false;
}
}
//根据用户帐号选择登录服务器
function selectServer(uName){
var enableServers = true;//是否启用多服务器 true/false
var serversArray = new Array();//服务器列表
serversArray[0] = "http://202.114.234.160:8080/jsxsd/";
serversArray[1] = "http://202.114.234.162:80/jsxsd/";
serversArray[2] = "http://202.114.234.163:80/jsxsd/";
serversArray[3] = "http://202.114.234.161:80/jsxsd/";
var loginUrl = "xk/LoginToXk";
if(enableServers == true){
if(!/[^\d]/.test(uName)){//必须为数字
var modVal = eval(uName % serversArray.length);
loginUrl = serversArray[modVal] + loginUrl;
}else{
loginUrl = serversArray[0] + loginUrl;
}
}else{
loginUrl = "/jsxsd"+ loginUrl;
}
return loginUrl;
}
从这里可以看到,对账户密码进行encodeInp()加密,然后将两个加密编码进行‘account+%%%+pwd’的拼接,再以encoded:value对值传输上去
另一部分js代码是
http://202.114.234.160/jsxsd/js/conwork.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
}
(实际上这部分应该只是为了避免明文传输,与sql注入防止无关)
根据猜测有可能数据库中用户验证一部分是采用直接储存对比这串加密的形式进行验证。
使用postman对
http://202.114.234.160/jsxsd/xk/LoginToXk
发送post包,然而出现404
而直接用chrome登陆时并不会出现这种状况
测试了好久发现原因了,需要对http://202.114.234.160/jsxsd/xk/LoginToXk:80地址进行post,其实之前的函数里也写了是对带端口的地址直接post的,chrome不会用,年轻啊。。。。。
这个时候我们尝试修改encoded的键值为 and 1=1
好吧 估计是没机会了