吵吵   2011-10-24  阅读:3,262

话说学校一成不变的认证方式终于要有所改变了,好像是从上周起本部的原来蓝色的网关认证界面已经变成了新的网关认证界面了。在图书馆用手机上wifi会经常断了,挺郁闷的。昨天去师兄研究生蓝楼去修了一下电脑,就顺便的分析了一下新的网关认证程序,这里做做笔记,用来以后开发路由器和登陆器(ps:新的认证方式可是显示不能用路由器,难道这是学校换认证方式的初衷?)。

事实上,学校说的东西都比较脑残的。新版的认证上写着为了限制高峰时段上网的人数故推出该新的南方医科大学的网关认证方式。可是我们却完全没有办法理解新的认证方式怎么就可以避开高峰时段上网了,而且从新的认证方式上看更不稳定和兼容,其复杂程度需要多次和服务器交换信息,拖慢服务器才说的通。综合来看,其实802.1x的底层协议会更好更高效的,学校瞎折腾。

总体上来说,这种认证方式使用的是ajax来实现和服务器通讯的,也就是post和get来发送数据,有的js文件有jquery库,这个不用说,制作一些特效什么的很给力,而且有了它post和get也方便多了,然后就是md5的js文件,用来加密密码,最后是auth.js这个是用来认证的了。先来看看这里面的代码:

//页面加载完毕
//页面加载完毕
$(document).ready(function(){
//当点击提交按钮触发事件
$("#btnlogin").click(function(){
//检查输放完整性以及特殊字符过滤
var userN=ReplaceStr($("#tbUser").val());
var userP=ReplaceStr($("#tbPassword").val());
if(userN=="")
{
$("#error_div").html("请输入用户名与密码");
$("#error_div").show();
$("#tbUser").focus();
return false;
}
if(userP=="")
{
$("#error_div").html("请输入用户名与密码");
$("#error_div").show();
$("#tbPassword").focus();
return false;
}

//获取加密信息
$.ajax({
type:"GET",
url:"sharekey.cgi?randnum=" + Math.random(),
data:{username:$("#tbUser").val(),passwd:""},
beforeSend:function(){
//获取加密信息的时候,使提交按钮不可用,以访不停按提交按钮。
$("#btnlogin").attr("disabled",true);
$("#error_div").html("正在获取加密信息...");
$("#error_div").show();
},
success:function(data){
$("#error_div").hide();
$("#rnd").val(data);
$("#btnlogin").attr("disabled",false);

//获取加密信息成功,开始登陆-------------------
//保存登陆信息
var ePwd=SetCookie($("#tbPassword").val(),$("#rnd").val());
//提交验证
$.ajax({
type:"POST",
url:"authen.cgi?randnum=" + Math.random(),
data:{account:userN,passwd:ePwd,rnd:$("#rnd").val(),method:"0"},
beforeSend:function(){
$("#error_div").html("正在验证,请稍候...");
$("#error_div").show();
},
success:function(data){
var tmpS=data;
if(data.length>=2)
{
//如果认证成功
if(data.substring(0,2)=="ok")
{
location.href="reauth.htm?"+data.substring(2,data.length);
//var fm = document.form;
//fm.action = "reauth.htm?"+data.substring(2,data.length);
//return true;
}
else//如果认证失败
{
//返回值:
//101:用户名中有非法字符!
//102:认证信息不全,无法认证!
//103:用户名或密码错误!
//104:帐户被锁定,无法登陆!
//105:认证超时
//106:密码错误
switch(data){
case "101" :
tmpS="用户名中有非法字符!";
break;
case "102" :
tmpS="认证信息不全,无法认证!";
break;
case "103" :
tmpS="用户名或密码错误!";
break;
case "104" :
tmpS="帐户被锁定,无法登陆!";
break;
case "105" :
tmpS="认证超时!";
break;
case "106" :
tmpS="密码错误!";
break;
default :
tmpS=data;
}
$("#error_div").html(tmpS);
$("#error_div").show();
return false;
}
}

}
});
//登陆结束------------------
}
});
//获取加密信息结束---------------------
});
});
//保存cookie,返回pwd
function SetCookie(pwd_value,rnd_value) { /* zhanjojo */
var pro_pwd ;
var pro_rnd;
pro_rnd = rnd_value - 1 ;
pro_pwd = calcMD5(pwd_value + pro_rnd);
var expires = new Date();
expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);
document.cookie = "name="+pro_pwd+";expires=" + expires.toGMTString();
pwd_value = calcMD5(pwd_value + rnd_value);
return pwd_value;
}

//过滤危险字符
function ReplaceStr(str)
{
var tmpStr=str;
tmpStr=tmpStr.replace("'","");
tmpStr=tmpStr.replace("\"","");
tmpStr=tmpStr.replace("<",""); tmpStr=tmpStr.replace(">","");
tmpStr=tmpStr.replace(";","");
tmpStr=tmpStr.replace(",","");
return tmpStr;
}

嘿,简单分析一下就是需要两次和服务器通信,第一次是一个get将用户面传递过去,然后服务器返回了一个key(姑且这么叫,就是几个数字),然后将这个key和我们的密码连接起来组成一个新的字符串,对这个新的字符创进行加密,作为第二次post中passwd的值给传递过去。当然,第二次的post还包括了用户名啊,第一次的key等数据,之后就等着服务器回信息了。

至于什么密码不对啊什么的就分别对应上述的返回的错误代码了,如101:用户名中有非法字符。

如果成功的话就将返回的一些数据,如ip地址啊,用户分类等数据又形成一个url,然后跳转到reauth.htm这个页面去了,至于这个页面是干什么的,你懂的,就是保持在线的了,这个下次再分析了。

有趣的是发送过去的页面是cgi编写的,而且ip地址是10开头的服务器了。这样子其实也是迫不得已的,普通的php或者jsp无法对操作服务器来完成其它程序或者功能,而cgi这个用c语言写的东西就恰恰能够调用到服务器来完成一些任务。这又让人想起openwrt路由器的luci界面来,事实上那里面也有cgi模块的,只不错luci已经提供了一整套的调用接口了,如luci.system.reboot来实现路由的重启等。而学校的这个估计是对802.1x做出一些改变,如对某个账号开始计费等,只是不太明白流量走的是服务器还是路由来的,以后再说吧。

顺便可以说说的是cgi注入不了,我已经测试过了。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

4条回应:“南医大新网关认证程序分析”

  1. 说道:

    表示猪肛依然在用旧的认证方式… 毫无压力

  2. 贺昌说道:

    就是喜欢这种就事而分析的东西,思路很有借鉴~

  3. 地球博客说道:

    啊啊,高深,老朽不懂。

发表评论

电子邮件地址不会被公开。 必填项已用*标注