美文网首页
DVWA--Brute Force

DVWA--Brute Force

作者: 六亲不认的步伐 | 来源:发表于2020-06-06 09:22 被阅读0次

    本次搭建OWASP靶机中自带的DWVA靶机对暴力破解进行测试


    Simple级别

    源代码查看
    <?php
    if( isset( $_GET['Login'] ) ) {
        $user = $_GET['username'];
        $pass = $_GET['password'];
        $pass = md5($pass);
        $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
        $result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );
        if( $result && mysql_num_rows( $result ) == 1 ) {
            // Get users details
            $i=0; // Bug fix.
            $avatar = mysql_result( $result, $i, "avatar" );
            // Login Successful
            echo "<p>Welcome to the password protected area " . $user . "</p>";
            echo '<img src="' . $avatar . '" />';
        } else {
            //Login failed
            echo "<pre><br>Username and/or password incorrect.</pre>";
        }
        mysql_close();
    }
    ?>
    

    根据源代码查看出现关键代码

    $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";

    说明除了此题可以进行暴力破解,而且能够进行SQL注入测试


    SQL注入方法破解

    很明显SQL查询语句是可以对账户,密码进行拼接,所以可以尝试通过万能密码和注释符进行测试

    user = ' or '1'='1‘’ #
    

    为了便于查看SQL语句,对源代码进行编辑,能够打印出拼接后的结果


    测试结果

    根据测试结果和源代码审计发现,虽然成功进行了注入,逃过密码验证,但是由于if判断时,返回结果只能返回一个,所以导致报错。
    所以根据代码进行改正测试的注入代码

    'or '1' ='1' limit 0,1#
    
    成功注入

    当然除了可以进行使用万能密码外,可以在知道用户名时尝试其他的注入方法,例如

    admin' #
    admin' -- 
    

    口令暴力破解

    首先捕获请求数据包,对要进行的变量进行标记


    请求数据包

    对指定变量进行字典替换并请求


    成功爆破出密码

    Medium级别

    源代码查看
    <?php
    if( isset( $_GET[ 'Login' ] ) ) {
        // Sanitise username input
        $user = $_GET[ 'username' ];
        $user = mysql_real_escape_string( $user );
        // Sanitise password input
        $pass = $_GET[ 'password' ];
        $pass = mysql_real_escape_string( $pass );
        $pass = md5( $pass );
        $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
        $result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );
        if( $result && mysql_num_rows($result) == 1 ) {
            // Get users details
            $i=0; // Bug fix.
            $avatar = mysql_result( $result, $i, "avatar" );
            // Login Successful
            echo "<p>Welcome to the password protected area " . $user . "</p>";
            echo '<img src="' . $avatar . '" />';
        } else {
            //Login failed
            echo "<pre><br>Username and/or password incorrect.</pre>";
        }
        mysql_close();
    }
    ?>
    

    根据源代码查看出现关键代码

    $user = mysql_real_escape_string( $user );
    此函数对输入的字符进行转义

    单引号过滤
    查询MySQL版本

    因此对该函数在MySQL5.5.37以下版本有绕过方法
    对于\’进行绕过时,可以考虑宽字节注入,常用的%df进行测试


    宽字节注入失败
    因为宽字节注入是在GBK编码下进行利用,所以可以查看数据库编码
    show variables like 'char%'
    
    MySQL编码查看

    但是该等级并未对暴力破解增加任何防护,所以同Low等级,直接暴力破解即可。


    High级别

    源代码查看
    <?php
    if( isset( $_GET[ 'Login' ] ) ) {
        // Sanitise username input
        $user = $_GET[ 'username' ];
        $user = stripslashes( $user );
        $user = mysql_real_escape_string( $user );
        // Sanitise password input
        $pass = $_GET[ 'password' ];
        $pass = stripslashes( $pass );
        $pass = mysql_real_escape_string( $pass );
        $pass = md5( $pass );
        $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
        $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
        if( $result && mysql_num_rows( $result ) == 1 ) {
            // Get users details
            $i=0; // Bug fix.
            $avatar = mysql_result( $result, $i, "avatar" );
            // Login Successful
            echo "<p>Welcome to the password protected area " . $user . "</p>";
            echo '<img src="' . $avatar . '" />';
        } else {
            // Login failed
            sleep(3);
            echo "<pre><br>Username and/or password incorrect.</pre>";
            }
        mysql_close();
    }
    ?>
    

    根据源代码查看出现关键代码

    $user = stripslashes( $user );
    此函数对输入的字符进行转义

    在暴力破解方面,增加了关键代码

    sleep(3);
    每爆破错误一次 ,就停止3s验证,导致整个爆破时间拉长,从而增加工具者的时间成本,但不是最安全的


    个人认为最安全的方法是SQL注入部分进行实体化参数代入,暴力破解防御应适当加入验证码,以及当日最大错误次数等机制进行防御。

    相关文章

      网友评论

          本文标题:DVWA--Brute Force

          本文链接:https://www.haomeiwen.com/subject/naggzhtx.html