DVWA靶机-暴力破解(Brute Force)

DVWA靶机-暴力破解

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

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

2.暴力破解(Brute Force)

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

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

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

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

Low Brute Force Source


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

Welcome to the password protected area {$user}

"
; echo "{$avatar}\" />"
; } else { // Login failed echo "

Username and/or password incorrect.
"
; } mysql_close(); } ?>
1.截取HTTP报文

DVWA靶机-暴力破解(Brute Force)_第3张图片

2.转入Intruder-positions

Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于password,
攻击类型(Attack type)选为sniper
DVWA靶机-暴力破解(Brute Force)_第4张图片

3.转入Intruder-Payloads

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

4.Start Attack

定义好词典后,开始攻击,我们可以发现当出现正确的密码时回复中,Length有不同的结果,此时正确的长度为5317,这就是判断密码是否正确的方法,同时可以在Response Render中查看web页面的回显效果
DVWA靶机-暴力破解(Brute Force)_第6张图片

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

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

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

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

Medium Brute Force Source


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

Welcome to the password protected area {$user}

"
; echo "{$avatar}\" />"
; } else { // Login failed sleep( 2 ); echo "

Username and/or password incorrect.
"
; } mysql_close(); } ?>
1.截取HTTP报文

DVWA靶机-暴力破解(Brute Force)_第7张图片

2.转入Intruder-positions

Intruder默认针对于所有的变量,我们先将其原策略清除(clear),重新添加(Add)单选项针对于username&password,
攻击类型(Attack type)选为Cluster bomb
DVWA靶机-暴力破解(Brute Force)_第8张图片

3.转入Intruder-Payloads

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

4.Start Attack

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

此时我定义了6个用户名,7个密码,其共有42中结果,这个过程花费大概1min,可想而知,如果用成千上万个用户名和密码来测试,那需要的时间就相当的长,此时暴力破解的缺点也就显露出来。
DVWA靶机-暴力破解(Brute Force)_第11张图片

(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


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

Welcome to the password protected area {$user}

"
; echo "{$avatar}\" />"
; } else { // Login failed sleep( rand( 0, 3 ) ); echo "

Username and/or password incorrect.
"
; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken(); ?>

(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等组成了相当大的防御体系



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 "

This account has been locked due to too many incorrect logins.
";
// 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 "

Welcome to the password protected area {$user}

"
; echo "{$avatar}\" />"
; // Had the account been locked out since last login? if( $failed_login >= $total_failed_login ) { echo "

Warning: Someone might of been brute forcing your account.

"
; echo "

Number of login attempts: {$failed_login}.
Last login attempt was at: ${last_login}.

"
; } // 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 "

Username and/or password incorrect.

Alternative, the account has been locked because of too many failed logins.
If this is the case, please try again in {$lockout_time} minutes.
"
; // 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(); ?>

你可能感兴趣的:(渗透测试-DVWA靶机)