dvwa学习-brute force(暴力破解)

一、简介:

Brute-Force(暴力破解),又称为穷举攻击,是一种密码分析的方法,即将密码进行逐个推算直到找出真正的密码为止。例如:一个已知是四位数并且全部由阿拉伯数字组成的密码,其可能共有10000种组合,因此最多尝试9999次就能找到正确的密码。理论上除了具有完善保密性的密码以外,利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。有些人运用计算机来增加效率,有些人透过字典攻击来缩小密码组合的范围。

二、dvwa brute force(Low)

1.dvwa 安全级别
  • low: 完全没有安全防护
  • medium: 使用了简单的防护,很容易被绕过
  • high: 稍微复杂的防护方案,但任存在漏洞
  • impossible: 使用了安全的防护措施,在当前代码中时绝对安全的。
2.dvwa 安全级别设置
  • 点击“DVWA Security”,选择“Low”,点击“Submit”,修改DVWA 代码安全等级为Low
    dvwa学习-brute force(暴力破解)_第1张图片
3.漏洞分析(查看源码)
  • 如图,点击“Brute Force”,出现登录界面2,点击“view Source”,可以查看当前页面的源代码
  • dvwa学习-brute force(暴力破解)_第2张图片
    可以看出,Low级别的代码未作任何安全处理
    dvwa学习-brute force(暴力破解)_第3张图片
3.漏洞利用

1.burpsuite暴力破解:

  • 为本地浏览器设置全局代理(以火狐浏览器为例),依次点击“perference”->“General”->“Seting”,打开浏览器网络设置。
    dvwa学习-brute force(暴力破解)_第4张图片
    选择“Manual proxy configuration”,设置 “http proxy”以及“port”
    dvwa学习-brute force(暴力破解)_第5张图片

  • 打开burpsuite,关闭拦截
    dvwa学习-brute force(暴力破解)_第6张图片

  • 使用本地浏览器访问dvwa(由于电脑内存有限,作者访问的是dvwa的一个在线靶场),点击Brute Force(记得将安全等级设置为Low并提交),随意填写“username”和“password”,点击“login”。
    dvwa学习-brute force(暴力破解)_第7张图片
    当然会提示用户名或密码错误。
    dvwa学习-brute force(暴力破解)_第8张图片

  • 回到burpsuite,点击“Http history”,找到我们提交的http请求(包含用户名和密码参数),右键发送到intruder模块。
    dvwa学习-brute force(暴力破解)_第9张图片dvwa学习-brute force(暴力破解)_第10张图片

  • 依次点击“intruder”、“positions”,“intruder”模块攻击类型有四种(自行google),由于要同时破解用户名和密码,此处选择“Cluster bomb”,从图中可以看出,默认会破解5个参数(阴影部分),但是我们只需要破解两个参数。
    dvwa学习-brute force(暴力破解)_第11张图片

  • 选中该http请求所有内容,点击“clear”,清除默认破解参数。
    dvwa学习-brute force(暴力破解)_第12张图片
    dvwa学习-brute force(暴力破解)_第13张图片

  • 选中“username=”后面的“123”,点击“add”,对“password”进行相同处理,可以看到“123”和“456”前后均被添加了一个“$”符号。
    dvwa学习-brute force(暴力破解)_第14张图片dvwa学习-brute force(暴力破解)_第15张图片

  • 添加爆破字典,其中“payload set”中的1是表示“username”,“payload type”指定字典类型(这里选择的简单集合,也可以从文件中读取),同理为“password”添加爆破字典
    dvwa学习-brute force(暴力破解)_第16张图片dvwa学习-brute force(暴力破解)_第17张图片

  • 点击“start attack”,开始破解用户名和密码。
    dvwa学习-brute force(暴力破解)_第18张图片

  • 破解结果,从图中可以看出,当“payload1”、“payload2”分别为“admin”和“password”时,响应长度不一样(length=4743),可以判断,爆破成功。
    dvwa学习-brute force(暴力破解)_第19张图片
    2.手工sql注入

    • username: admin’ or ‘1’='1 password: 空
      dvwa学习-brute force(暴力破解)_第20张图片

    • 原理
      数据库数据:
      dvwa学习-brute force(暴力破解)_第21张图片
      当输入 admin’ or ‘1’='1 和 空后,数据库执行的sql语句为:
      在这里插入图片描述
      注意在sql语句中“and”的优先级高于“or”

  • username: admin’ # password: 空

三、dvwa brute force(Medium)

1.源码分析

相比于Low安全级别的源码,Medium使用mysql_real_escape_string函数对用户输入进行了处理,这个函数会对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行转义,基本上能够抵御sql注入攻击,但是依然可以使用burpsuite进行破解,破解过程和Low级别过程相同,不再累述。
dvwa学习-brute force(暴力破解)_第22张图片

四、dvwa brute force(High)

1.源码分析

dvwa学习-brute force(暴力破解)_第23张图片
相比于medium级别的代码,该代码主要增加了一个user_token防止无脑爆破。

四、dvwa brute force(impossible)

1.源码分析
if( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Sanitise username input
    $user = $_POST[ 'username' ];
    $user = stripslashes( $user );
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitise password input
    $pass = $_POST[ 'password' ];
    $pass = stripslashes( $pass );
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $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 = strtotime( $row[ 'last_login' ] ); $timeout = $last_login + ($lockout_time * 60); $timenow = time(); /* print "The last login was: " . date ("h:i:s", $last_login) . "
"
; print "The timenow is: " . date ("h:i:s", $timenow) . "
"
; print "The timeout is: " . date ("h:i:s", $timeout) . "
"
; */ // Check to see if enough time has passed, if it hasn't locked the account if( $timenow < $timeout ) { $account_locked = true; // print "The account is locked
"; } } // 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 ""; // 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(); ?>

可以看到,impossible级别的代码加入了可靠的防爆破机制,当检测到3次错误登录之后,dvwa会将账号锁定一段时间。此外sql语句使用更为安全的PDO(PHP Data Object)机制防御sql注入。

你可能感兴趣的:(dvwa学习-brute force(暴力破解))