当前位置:   article > 正文

DVWA靶机-暴力破解(Brute Force)_dvwa安全等级

dvwa安全等级

DVWA靶机-暴力破解

1.DVWA靶机的4个安全等级

DVWA Security分为四个等级,low,medium,high,impossible,不同的安全等级对应了不同的漏洞等级。
1.low-最低安全等级,无任何安全措施,通过简单毫无安全性的编码展示了安全漏洞。
2.medium-中等安全等级,有安全措施的保护,但是安全性并不强。
3.high-高等安全等级,有安全措施保护,是中等安全等级的加深,这个等级下的安全漏洞可能不允许相同程度的攻击。
4.impossible-最高(不可能)安全等级,存在相当强的安全保护措施,这个级别应能防止所有的漏洞,主要用于比较不同等级下的源代码。
在这里插入图片描述

2.暴力破解(Brute Force)

暴力破解也称为穷举法,是指未知用户名和密码的情况下,通过某些破解软件+破解词典(用户可能设置的用户名及密码文件),来爆破出正确的用户名及密码,此过程技术成分低,其耗费时间多,成功几率小
适用场景:适用于无验证码或者二次验证登录的WEB页面
在这里插入图片描述

(1).DVWA-LOW等级下的暴力破解

首先我们在此处用的暴力破解工具为Burp suite,此工具可以在截取WEB页面POST提交的信息后,可以通过修改用户名密码方式来测试WEB页面是否正确回显,也就是修改之后的用户名密码是否正确

由于暴力破解及其耗费时间,此时为了方便,我们在自定义词典,在词典中加入已知的用户名,密码,为了更快速的查到结果。
username:admin
password:123

Low Brute Force Source
<?php

if( isset( $_GET[ 'Login' ] ) ) {
    // Get username
    $user = $_GET[ 'username' ];

    // Get password
    $pass = $_GET[ 'password' ];
    $pass = md5( $pass );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
        // Get users details
        $avatar = mysql_result( $result, 0, "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();
}

?> 
  • 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
1.截取HTTP报文

在这里插入图片描述

2.转入Intruder-positions

Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于password,
攻击类型(Attack type)选为sniper
在这里插入图片描述

3.转入Intruder-Payloads

Payload Sets
Payload set:设置破解页,当前只针对于密码,为1
Payload type 设置为Simple list,单表模式
在这里插入图片描述
Payload Options[Simple list]
load:通过load可以载入常用用户名及密码词典,文件形式
Add:添加单独可能存在的密码
常用的用户名密码词典在网上都能下载,此处为了方便,快速的达成效果,我们Add中添加已知的密码
在这里插入图片描述

4.Start Attack

定义好词典后,开始攻击,我们可以发现当出现正确的密码时回复中,Length有不同的结果,此时正确的长度为5317,这就是判断密码是否正确的方法,同时可以在Response Render中查看web页面的回显效果
在这里插入图片描述

(2).DVWA-Medium等级下的暴力破解

同low等级下的暴力破解类似,为了方便,我们在自定义词典,在词典中加入已知的用户名,密码,为了更快速的查到结果。
username:admin
password:123

由于low等级下,不存在安全策略,无安全行可言,但是Medium等级下存在安全策略,为了方便快速,我们此时可以先查看源码再进行破解。

mysql_real_escape_string():此函数转义了SQL语句中使用的字符串的特殊字符
也就是过滤了一些特殊字符,包括(\x00、\n、\r 、\、 '、 "、 \x1a),也意味着用户名和密码中不能存在这些特殊字符

Medium Brute Force Source
<?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 );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
        // Get users details
        $avatar = mysql_result( $result, 0, "avatar" );

        // Login successful
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // Login failed
        sleep( 2 );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }

    mysql_close();
}

?> 
  • 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
1.截取HTTP报文

在这里插入图片描述

2.转入Intruder-positions

Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于username&password,
攻击类型(Attack type)选为Cluster bomb
在这里插入图片描述

3.转入Intruder-Payloads

Payload Sets
Payload set:设置破解页,当前于用户名和密码,为2
Payload type 设置为Simple list,单表模式
在这里插入图片描述
Payload Options[Simple list]
load:通过load可以载入常用用户名及密码词典,文件形式
Add:添加单独可能存在的用户名及密码
常用的用户名密码词典在网上都能下载,此处为了方便,快速的达成效果,我们Add中添加已知的用户名及密码
用户名:
在这里插入图片描述
密码:
在这里插入图片描述

4.Start Attack

定义好词典后,开始攻击,我们可以发现当出现正确的用户名和密码时回复中,Length有不同的结果,此时正确的长度为5326,这就是判断密码是否正确的方法,同时可以在Response Render中查看web页面的回显效果

此时我定义了6个用户名,7个密码,其共有42中结果,这个过程花费大概1min,可想而知,如果用成千上万个用户名和密码来测试,那需要的时间就相当的长,此时暴力破解的缺点也就显露出来。
在这里插入图片描述

(3).DVWA-high等级下的暴力破解

在high等级中,存在更加强的安全策略
1.token机制(基于token的身份验证)
2.stripslashes()函数,过滤字符串中的反斜杠’’,也就是说用户名中和密码不能存在
3.mysql_real_escape_string(),同medium等级一样,过滤了一些特殊字符,包括(\x00、\n、\r 、\、 '、 "、 \x1a),也意味着用户名和密码中不能存在这些特殊字符

由于token值,每次都是随机的,客户端和服务端都为随机值,无法使用burp suite进行暴力破解,但是可以通过python脚本,自动获取token,后期会发布python相关脚本文件的暴力破解过程。

High Brute Force Source
<?php

if( isset( $_GET[ 'Login' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // 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 );

    // Check database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
        // Get users details
        $avatar = mysql_result( $result, 0, "avatar" );

        // Login successful
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // Login failed
        sleep( rand( 0, 3 ) );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }

    mysql_close();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
  • 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

(4).impossiable

Impossible Brute Force Source

impossible等级的安全策略相当强大,应能防止所有的漏洞,用于比较不同等级下的源代码。
相比于high等级,impossible等级,加上了登录失败策略,定义了3个变量
total_failed_login:总的登录失败次数,当前定义为3次。
lockout_time:账户锁定时间,当前定义为15s
account_locked:创建用户的时候锁定用户
bindparam:为用户名和密码绑定参数PDOStatement::bindParam
时间函数:
last_login、timeout、timenow等组成了相当大的防御体系

<?php

if( isset( $_POST[ 'Login' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Sanitise username input
    $user = $_POST[ 'username' ];
    $user = stripslashes( $user );
    $user = mysql_real_escape_string( $user );

    // Sanitise password input
    $pass = $_POST[ 'password' ];
    $pass = stripslashes( $pass );
    $pass = mysql_real_escape_string( $pass );
    $pass = md5( $pass );

    // Default values
    $total_failed_login = 3;
    $lockout_time       = 15;
    $account_locked     = false;

    // Check the database (Check user information)
    $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();

    // Check to see if the user has been locked out.
    if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
        // User locked out.  Note, using this method would allow for user enumeration!
        //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";

        // Calculate when the user would be allowed to login again
        $last_login = $row[ 'last_login' ];
        $last_login = strtotime( $last_login );
        $timeout    = strtotime( "{$last_login} +{$lockout_time} minutes" );
        $timenow    = strtotime( "now" );

        // Check to see if enough time has passed, if it hasn't locked the account
        if( $timenow > $timeout )
            $account_locked = true;
    }

    // Check the database (if username matches the password)
    $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR);
    $data->bindParam( ':password', $pass, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();

    // If its a valid login...
    if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {
        // Get users details
        $avatar       = $row[ 'avatar' ];
        $failed_login = $row[ 'failed_login' ];
        $last_login   = $row[ 'last_login' ];

        // Login successful
        echo "<p>Welcome to the password protected area <em>{$user}</em></p>";
        echo "<img src=\"{$avatar}\" />";

        // Had the account been locked out since last login?
        if( $failed_login >= $total_failed_login ) {
            echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
            echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
        }

        // Reset bad login count
        $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
        $data->bindParam( ':user', $user, PDO::PARAM_STR );
        $data->execute();
    }
    else {
        // Login failed
        sleep( rand( 2, 4 ) );

        // Give the user some feedback
        echo "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";

        // Update bad login count
        $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
        $data->bindParam( ':user', $user, PDO::PARAM_STR );
        $data->execute();
    }

    // Set the last login time
    $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
  • 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
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/726513
推荐阅读
相关标签
  

闽ICP备14008679号