服务器渗透测试练习(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页面就会发现已经是游客身份了。

好了,告一段落,下一篇文章将讲解其他的几个网页的编写。

posted @ 2021-02-26 16:32  awcyvan  阅读(117)  评论(0)    收藏  举报