服务器渗透测试练习(part2:网页设计(1))
#0:主页面
开始编写index.php:网站的主页面。
其实最开始主页面上面没有什么太多的东西,废话不多说,上代码。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>read online</title>
<style>body{text-align: center}</style>
<script>
function login(){
window.open("login.php");
window.close();
}
function signup(){
window.open("signup.php");
window.close();
}
</script>
</head>
<body>
<?php
error_reporting(0);
echo "Hello,游客,权限:游客";
echo '<button onClick="login()">登录</button><button onClick="signup()">注册</button>';
?>
</body>
</html>
其实只是一个非常简单的界面。可以打开浏览器输入IP:端口号/index.php进行查看。虽然有两个按钮,但是相应的功能还没有实现。下面先对储存账号的xml文件(AuthInfo.xml)进行初始化。
#1:账号数据文件
打开AuthInfo.xml文件,进行如下的编写:
<users> <user><id>0</id><name>root</name><pass>63a9f0ea7bb98050796b649e85481845</pass><permissions>2</permissions></user> <user><id>1</id><name>Maiker</name><pass>5f4dcc3b5aa765d61d8327deb882cf99</pass><permissions>1</permissions></user> </users>
其中Maiker的name标签是可以自己取名字的,root也不是说一定要root,但是这样会方便一些。后面的pass标签是用户的密码的哈希值(明文分别是root和password),permissions标签是用户权限(在我的架构中2==主管,1==管理员,0==普通用户,可以用自己的标识)。暂时先这样,然后来实现基于xml的登录认证。
#2:登录界面
打开login.php,进行如下编写:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>login</title>
<style>body{text-align: center}</style>
<script>
function check(){
if(document.frm.uname.value==""){
alert("请填写用户名!");
document.frm.uname.focus();
return false;
}
else{
if(document.frm.pass.value==""){
alert("请填写密码!");
document.frm.pass.focus();
return false;
}
//
else{
return true;
}
}
}
});
</script>
</head>
<body>
<?php
error_reporting(0);
if(isset($_POST["uname"]) && isset($_POST["pass"])){ //检测是否有表单输入
$un=$_POST["uname"];
$p=$_POST["pass"]; //获取表单输入
$mp=md5($p); //转换成MD5加密的信息
//再用模拟表单使用POST发送信息
echo '<form method="post" action="logcheck.php" name="frmc"><input type="hidden" name="un" value="'.$un.'"><input type="hidden" name="pwd" value="'.$mp.'"></form><script>document.frmc.submit();</script>';
}
?>
<form method="post" name="frm" action="">
输入用户名:
<br>
<input type="text" name="uname">
<br>
输入密码:
<br>
<input type="password" name="pass">
<br>
<br>
<input type="submit" name="sub" value="确定" onClick="return check()">
</form>
<a href=".\\signup.php">还没有账号?先注册</a>
</body>
</html>
这里因为有一些敏感信息(账号密码)要通过网络发送,所以这里在本地用MD5加密了密码之后再发给验证登录的页面,但是在后面就会看到这会导致更严重的问题。
#3:登录验证
打开logcheck.php,编写如下代码
<?php function get_real_ip(){ //用于获取客户端IP以构造session文件 $ip=false; if(!empty($_SERVER['HTTP_CLIENT_IP'])){ $ip=$_SERVER['HTTP_CLIENT_IP']; } if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']); if($ip){ array_unshift($ips, $ip); $ip=FALSE; } for ($i=0; $i < count($ips); $i++){ if(!eregi ('^(10│172.16│192.168).', $ips[$i])){ $ip=$ips[$i]; break; } } } return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>logcheck</title> </head> <body> <?php error_reporting(0); if(isset($_POST["un"]) && isset($_POST["pwd"])){ $un=$_POST["un"]; $mp=$_POST["pwd"];//获取传入参数 $xml=simplexml_load_file(".\\AuthInfo.xml");//打开xml文档 $ulist=$xml->children();//获取账号列表 foreach($ulist as $i){//进行查找 if($i->name==$un){ $r=1;//找到返回1,没有保持0 break; } } if($r==1){//判断是否找到相应的账号 if($mp==$i->pass){//验证密码 $ip=get_real_ip();//获取客户端IP $f=fopen(".\\tmp\\session@".$ip.".txt","w");//构造session文件 fwrite($f,time()."\r\n".$i->name."\r\n".$i->permissions."\r\n".$ip); fclose($f); echo '<script>alert("登录成功,'.$i->name.'");</script>';//弹出提示 echo '<script>window.open("index.php");</script>';//跳转 echo '<script>window.close();</script>'; } else{ echo '<script>alert("密码错误!");</script>'; echo '<script>window.open("login.php");</script>'; echo '<script>window.close();</script>'; } } else{ echo '<script>alert("该用户名无效,请先注册!");</script>'; echo '<script>window.open("signup.php");</script>'; echo '<script>window.close();</script>'; } } else{ //进行非法访问的规避 echo '<script>alert("请从登录页面访问该网页!");</script>'; echo '<script>window.open("login.php");</script>'; echo '<script>window.close();</script>'; } ?> </body> </html>
好了,现在可以打开浏览器,输入IP:端口号/login.php查看效果了,输入刚才AuthInfo.xml中设置的两个账号的其中一个,应该可以看到登录成功的字样,然后确认,跳转到主页面。
等等,为什么依然显示的是游客呢?
因为压根就没有进行设置。
#4:主页面改善(1)(因为后面还会对主页面进行多次加工,所以有一个编号)
打开index.php,找到error_reporting(0);这一行,把下面的两个echo删掉,改为:
$user=get_real_ip(); if(file_exists("tmp\\session@".$user.".txt")){//检查是否存在session文件 $f_arr=file("tmp\\session@".$user.".txt"); //print_r($f_arr); if((floatval($f_arr[0])+3600)<time()){//检测是否超过登录时间(此处为一个小时,可以根据情况自己定义,但是要保证所有用到session的地方都要一致) unlink("tmp\\session@".$user.".txt");//超时解除session echo '<script>alert("登录已过期,将以游客身份访问");</script>'; echo "Hello,游客,权限:游客"; echo '<button onClick="login()">登录</button><button onClick="signup()">注册</button>'; } else{//判断权限 if(intval($f_arr[2])==2){ echo "Hello,主管,权限:Root"; echo '<form method="post" name="frm" action="logout.php"><input type="text" name="id" value="'.$user.'" style="opacity: 0;width: 0px;"><input type="submit" name="sub" value="注销"></form>'; } elseif(intval($f_arr[2])==1){ echo "Hello,".$f_arr[1].",权限:管理员"; echo '<form method="post" name="frm" action="logout.php"><input type="text" name="id" value="'.$user.'" style="opacity: 0;width: 0px;"><input type="submit" name="sub" value="注销"></form>'; } elseif(intval($f_arr[2])==0){ echo "Hello,".$f_arr[1].",权限:普通用户"; echo '<form method="post" name="frm" action="logout.php"><input type="text" name="id" value="'.$user.'" style="opacity: 0;width: 0px;"><input type="submit" name="sub" value="注销"></form>'; } } } else{ echo "Hello,游客,权限:游客"; echo '<button onClick="login()">登录</button><button onClick="signup()">注册</button>'; }
然后在文件的顶部(!doctype html的上面)加入get_real_ip();部分的代码(参考logcheck.php)。
现在重新登录(或者直接刷新页面)就可以看到提示语句了。上面提到了注销,所以就先把这部分写了吧。
#5:注销页面
打开logout.php,编写如下代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>logout</title>
<style>body{text-align: center}</style>
</head>
<body>
<?php
if(isset($_SERVER["HTTP_REFERER"])){//检测是否有上一个页面来判断是否为非法访问
if(isset($_POST["sub"])){
$id=$_POST["id"];
if(file_exists("tmp\\session@".$id.".txt")){//判断是否存在相应的session文件
unlink("tmp\\session@".$id.".txt");//删除session文件
echo '<script>alert("已注销。");</script>';
}
else{
echo '<script>alert("您未登录!");</script>';
}
}
else{
echo '<script>alert("您未登录!");</script>';
}
}
else{
echo '<script>alert("请从主页面访问该网页!");</script>';
}
echo '<script>window.open("index.php");</script>';
echo '<script>window.close();</script>';
?>
</body>
</html>
重新加载index页面,或者重新登录,然后点击注销按钮,应该就会看到提示,确认即可。然后就会发现已经退出了。重新进入index页面就会发现已经是游客身份了。
好了,告一段落,下一篇文章将讲解其他的几个网页的编写。

浙公网安备 33010602011771号