这几天回家,家里的wifi被小朋友们共享了,本来也没什么,毕竟我晚上10点后才对网有很大的需求,现在就比较恐怖了,10点钟之后小朋友对wifi的需求不减反增了。于是我恼怒的要改wifi密码了!
首先这里的路由器是装的移动宽带,所以我们在这里登陆:
192.168.1.1(也有的是192.168.0.1)
到这里之后,突然懵逼了:
我发现应该在路由器上注明的账号密码不见了。
- -这时候就要发挥一个了解过网安的程序员应该有的素质了!
首先,分析这个网页,打开网页源代码:
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script language="javascript" type="text/javascript" src="../js/jquery-1.4.2.js"></script>
<script language="javascript" type="text/javascript" src="../js/jquery.json-2.2.js"></script>
<script language="javascript" type="text/javascript" src="../js/jquery.utils.homestation.min.js"></script>
<script language="JavaScript">
var Status = '0';
var REGTYPE = '0';
document.οnkeydοwn=function mykeyDown(e){
e = e||event;
if(e.keyCode == 13)
{
document.getElementById('login_btn').click();
}
return;
}
function postRegisterResult()
{
$.ajax(
{
url: 'registerResult_jiangsu.cgi?name=bb',
dataType: 'json',
cache: false,
async: false,
success: function(returnData, status)
{
if(returnData.RETURN.success)
{
callback(returnData.RETURN.success,returnData);
}
else
{
callback(returnData.RETURN.success,returnData);
}
}
}
);
}
function onlogin(a)
{
$.ajax({
url:'/area.conf',
dataType:'json',
cache:false,
async:false,
success: function(data, status){
AREACODE = data.AREA;
RESULT = data.RESULT;
}
});
if (a == 1)
{
var loc = 'login_CM.htm.cgi?';
var pass = password.value;
pass = pass.replace(/&/g, "123fiberhome321");
pass = pass.replace(/!/g, "321telecomadmin123");
pass = pass.replace(/#/g, "321useradmin123");
loc += 'username=' + user_name.value;
loc += '&password=' + pass;
if(user_name.value == null || user_name.value.length <= 0)
{
alert("用户名不能为空,请重新输入!");
return false;
}
if(password.value == null || password.value.length <= 0)
{
alert("密码不能为空,请重新输入!");
return false;
}
var code = 'location="' + loc + '"';
eval(code);
}
else if (a == 2)
{
password.value = "";
document.getElementById("login_error_hint").style.display = "none";
}
else if (a ==3)
{
postRegisterResult();
$.ajax({
url:'../JS.conf',
dataType:'json',
cache:false,
async:false,
success: function(data, status){
isOverMaxRegTime = data.isOverMaxRegTime;
}
});
var regtype = '';
var Loid = '';
if (AREACODE == "Jiangsu" && isOverMaxRegTime == 1)
{
alert("已连续注册失败3次,请3分钟后再尝试注册")
}
else if (AREACODE == "Jiangsu" && RESULT == 1)
{
alert("已经注册成功,业务下发成功,无需再次注册")
}
else if (AREACODE == "Fujian" && RESULT == 1)
{
alert("设备已注册成功.无需再注册")
}
else if (AREACODE == "Anhui" && RESULT == 1)
{
if (regtype != "2")
{
alert("该设备已注册成功(LOID:),如需重新注册请恢复出厂设置")
}
else
{
alert("该设备已注册成功,如需重新注册请恢复出厂设置")
}
}
else
{
window.location="../register.html";
}
document.getElementById("login_error_hint").style.display = "none";
}
else if (a ==4)
{
window.location="routehainan.htm.cgi";
}
}
function formLoad()
{
var stata = '';
var log = '0';
if ( log == "1" )
{
setTimeout(function() {
var loc = '../index.html';
var code = 'window.parent.location="' + loc + '"';
eval(code);
}, 60000 );
}
var LOGSIGN = '0';
var MENU_PREFIX = '';
var Factory_mode = '0';
var ROUTESTATUS = '1';
if ( LOGSIGN == "3" )
{
alert("您的连续错误登陆次数已经超出3次,请1分钟以后再试!");
}
else
{
if ( MENU_PREFIX == "admin" )
{
alert("维护帐号已被禁用,请另选帐号登录!");
document.getElementById("login_error_hint").style.display = "none";
}
else if ( MENU_PREFIX == "useradmin" )
{
alert("当前已有用户在别处登录,请稍后登录!");
document.getElementById("login_error_hint").style.display = "none";
}
else if ( MENU_PREFIX == "factory" )
{
document.getElementById("login_error_hint").style.display = "";
}
else if ( MENU_PREFIX == "error" )
{
alert("您的连续错误登陆次数已经超出3次,请1分钟以后再试!");
document.getElementById("login_error_hint").style.display = "";
}
else
{
document.getElementById("login_error_hint").style.display = "none";
}
}
$.ajax({
url:'/area.conf',
dataType:'json',
cache:false,
async:false,
success: function(data, status){
AREACODE = data.AREA;
RESULT = data.RESULT;
}
});
if (AREACODE == "Jiangsu" || AREACODE == "Anhui" || AREACODE == "Fujian")
{
document.getElementById("register_btn").style.display = "";
}
else
{
document.getElementById("register_btn").style.display = "";
if ( RESULT == '1' )
{
document.all("register_btn").disabled= 1;
}
else
{
document.all("register_btn").disabled= 0;
}
}
}
</script>
<meta HTTP-EQUIV='Pragma' CONTENT='no-cache'>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<link type=text/css rel=stylesheet href=../css/jquery.ui.core.css>
<link type=text/css rel=stylesheet href=../css/style.css>
<link type=text/css rel=stylesheet href=../branches/e8/customize.css>
<link type=text/css rel=stylesheet href=../css/defaultBranding.css>
</head>
<body onLoad="formLoad()">
<div class="wraplogin_CM">
<div id="login_header_CM"></div>
<div id="login_content">
<div class="w_text">
<div style="height:70px; width:400px; position:relative; left:190px;">
<div style="height:22px; width:inherit;">
<span style="float:left;color:black;font-size: 12px; font-family: SimSun;" align=left>用户: </span>
<span style="float:left;"><input name=user_name id=user_name class=board type=text size=20 /></span>
</div>
<div style="clear:both;"></div>
<div style="height:22px; width:inherit;">
<span style="float:left;color:black;font-size: 12px; font-family: SimSun;" align=left>密码: </span>
<span style="float:left;"><input name=password id=password class=board type=password size=20 /></span>
<span id=login_error_hint align=left style="float:left; width:45%;display:none;"><font color='red'>用户名或密码输入错误,请重新输入</font></span>
</div>
</div>
<div class="login_button2_CM">
<span style="float:left;"><input type=button id=login_btn name=save οnclick='onlogin(1)' value=登录 /></span>
<span style="float:left;"><input type=reset id=reset_btn style="float:left;" οnclick='onlogin(2)' value=取消 /></span>
<span style="float:left;"><input type=button id=register_btn οnclick='onlogin(3)' value=注册 /></span>
</div>
</div>
<div id="login_footer"></div>
</div>
</div>
</body>
</html>
大概就是个简单的基于ajax的html普通登陆验证界面。
他的账号密码在登陆的时候都显示了出来
var pass = password.value;
pass = pass.replace(/&/g, "123fiberhome321");
pass = pass.replace(/!/g, "321telecomadmin123");
pass = pass.replace(/#/g, "321useradmin123");
loc += 'username=' + user_name.value;
loc += '&password=' + pass;
所以我们只关注这个后面的代码。这里是在防简单的sql注入。
他把一些东西的关键词给过滤了。比如#,!,&,相信懂sql注入的人都知道这些是什么东西
&表示与,!表示非,#表示注释。
因为它写的方式,无法用js直接对其就行修改所以只能采用稍微绕一绕的方法了。
然后再看这段
if ( MENU_PREFIX == "admin" )
{
alert("维护帐号已被禁用,请另选帐号登录!");
document.getElementById("login_error_hint").style.display = "none";
}
else if ( MENU_PREFIX == "useradmin" )
{
alert("当前已有用户在别处登录,请稍后登录!");
document.getElementById("login_error_hint").style.display = "none";
}
else if ( MENU_PREFIX == "factory" )
{
document.getElementById("login_error_hint").style.display = "";
}
这时候就很明显了,看那个当前已有用户在别处登陆,这个时候的用户名为useradmin。
所以我们就锁定了用户名为useradmin
这个时候我们发现我们似乎只差密码了。
但是密码吧,很容易就可以百度到- -移动的wifi密码是使用AES加密的。
AES是可以破解的。
然后打开控制台,移动到network那里,这里可以监控他们传输的数据包。随便打一个密码。
发现什么都没有,这时候开始分析AES由什么获取的,一般形式是如何,可以确定为四个字母一个数字,这样是保证128位的,可自行百度,
然后把账号改成' or 1=1#',同时禁用那个过滤的js,即pass=pass。控制台输入。
这个时候,你会发现network给了你正确的回馈。,
可以获取AES加密后的密码为j37772256t
具体怎么解密肯定不能写出来。。大家自己探索一下
要用sql注入和密码学相关知识。
最后我登陆进去了修改了密码,开开心心的刷剧了。