• 【业务安全-04】万能用户名及万能密码实验


    1 实验介绍

    1.1 实验目的

    由于网页服务端对代码的过滤不够严谨,可能会存在万能用户名或万能密码绕过的风险。
    加深对网页代码和SQL代码的理解。

    1.2 实验环境

    实验靶机——win2008虚拟机:

    <?php
    include "../inc/dblink.inc.php"//将数据库连接的文件包含到此文件中
    ?>
    <html>
    <head>
        <meta charset="utf-8">
        <title>  登录----今日论坛</title>
    
    </head>
    <body>
        <h1>今日论坛BBS</h1>
        <?php
        if(isset($_POST['userSubmit'])){
            if($_POST['vcode']==$_COOKIE['vcode']){
                $userName=$_POST['userName'];
                $userPass=$_POST['userPass'];
                $sql="select * from users where name='".$userName."' && password='".md5($userPass)."'";
                if($results=mysqli_query($link,$sql)){
                    if(mysqli_num_rows($results)>0){
                        setcookie('name',$userName,time()+3600*24, "/PHP/jrltbbs");
                        //注意cookie的路径,不同路径的cookie认为是两条cookie
                        echo "登录成功,返回<a href='../index.php'>首页</a>或<a href='./index.php'>个人中心</a>";
                    }else{
                        echo "用户名或密码错误,<a href='./login.php'>请重新登录</a>";
                    }
                }else{
                    die("sql语句有误");
                }
    
            }else{
                echo "验证码错误,<a href='./login.php'>请重新登录</a>";
            }
        }else{
            $html=<<<HTML
           <form 
            method="post">
            用户名:<input type="text" name="userName"><br/>
            密码:<input type="password" name="userPass"><br/>
            验证码:<input type="text" name="vcode"> 
            <iframe src= "./vcode.php" width="100" height=30 frameboder="0"></iframe><br>
            <input type="submit" name="userSubmit"  value="登录">
        </form>
    HTML;
            echo $html;
        }
        ?>
        <hr/>
    </body>
    </html>
    
    <?php
    mysqli_close($link);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    根据上述sql语句,可初步分析,关键变量是name,而不是password(无论输入啥,都会进行md5加密,无法进行Sql语句的拼接)

    2 实验

    2.1 实验分析

    (1)上述代码第8行用于在数据库中检验客户端输入账号密码是否存在,而能否登录成功关键在于第10行 if 语句判断条件是否为真,也就是说只要构造的用户名或密码能让SQL语句能成功查询并返回结果,就能实现登录。
    (2)由于SQL语句采用的是单引号闭合的方式,因此所构造的语句需要注意屏蔽前后的单引号.

    2.2 实验过程

    (1)输入网址http://172.16.1.1/PHP/jrltbbs/member/login.php进入网站的登录页面
    在这里插入图片描述

    (2)在登录界面输入用户名aaa' or 1=1#,密码随意,如下,点击登录。
    在这里插入图片描述

    (3)可以看到成功登录。
    在这里插入图片描述
    (4)点击个人中心,可以看到目前登录的账户是数据库中注册的第一个账号。
    在这里插入图片描述
    在这里插入图片描述

    2.3 实验结果总结—万能用户名及万能密码

    采用不同用户名及密码的组合进行实验结果如下。其中表中的万能用户名字母(如aaa和a),要注意用户是数据库中存在的还是不存在的,会导致结果不一样。

    用户名密码结果分析
    aaa’ or 1=1#随意成功采用单引号屏蔽变量前的单引号,采用#注释掉变量后续语句
    aaa’ or ‘1’='1随意失败因为and的优先级比or的优先级高,语句先执行’1’=‘1’ and password = '随意’语句得到false,再执行name = ‘aaa’ or false,结果还是false,所以SQL语句无法查询到内容,登录失败.
    a’ or ‘1’='1随意成功与上一组合不同的是,此处a是刚好碰到数据库中有该用户名,所以or语句执行成功,适合用于爆破特定用户名
    a’#随意成功此处a是刚好碰到数据库中有该用户名,所以执行成功,适合用于爆破特定用户名
    随意aaa’ or 1=1#失败由于密码字段在代码中被MD5编码过,无法实现语句构造的功能
    随意aaa’ or ‘1’=‘1’失败同上

    注意:当后台代码对输入参数进行过滤转换时,需要注意思考之前学过的各种绕过技巧。

    3 总结

    (1)加深理解SQL语句构造与绕过;
    (2)掌握万能用户名与密码检测的方法。

  • 相关阅读:
    4.RocketMQ消息的消费
    【JavaWeb】XML
    C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法
    什么是美国服务器,有哪些优势,适用于什么场景?
    B/S端界面控件DevExtreme v22.2即将发布的功能——Part 2
    Linux内存管理(三十三):直接内存回收详解
    c#中switch常用模式
    华为软件开发实习生笔试2021.3.31(三)
    NX二次开发-挂菜单栏.men和工具条.rtb及菜单中文汉字乱码问题
    go语言有哪些web框架
  • 原文地址:https://blog.csdn.net/m0_64378913/article/details/125435902