DVWA | Brute Force(Low&Medium)的渗透实践

Brute force主要是通过爆破达到渗透目的:

Low

查看源代码:

php 复制代码
<?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);
}

?>

以上代码的含义是:
这段 PHP 代码是一个处理登录请求的脚本,
if (isset(_GET\['Login'\])):判断是否通过 GET 方法传递了名为 Login 的参数,如果有,则执行后续的登录逻辑。 从 _GET 中获取用户名 user 和密码 pass,并对密码使用 md5 进行哈希处理。
构建一个 SQL 查询语句 query,从 users 表中查找用户名和密码匹配的记录。 使用 mysqli_query 执行查询,如果查询失败则输出错误信息并终止脚本。 如果查询结果存在且只有一行匹配,说明登录成功: 获取用户的头像信息 avatar。
输出欢迎信息和显示头像。
如果查询结果不存在或匹配行数不为 1,则登录失败,输出错误提示。
最后使用 mysqli_close 关闭数据库连接。

接下来使用BP抓包:

空白处右键选择:发送给intruder

测试器-标签-位置,选择右侧清除

清除变量引用后,双击username跟password的变量值,并分别添加变量引用符号。

攻击类型选择:

集束炸弹(clusterbomb),可以对多个选定参数,这样我们可以同时对用户名跟密码互相组合发动爆破。

(拓展:狙击手(Sniper):仅指定单个爆破参数,定点爆破;

攻城锤/冲击夯(Battering Ram):指定一个文件对多个位置参数实施爆破,所有参数位置都一样;

音叉/鱼叉(Pitchfork):加入两个变量值)

选择"有效载荷-有效载荷集",选择1,有效载荷类型:"简单清单"。用户名爆破用例随意输入

"有效载荷-有效载荷集",选择2,有效载荷类型:"简单清单"。密码爆破用例同样随意输入:

点击右上角:发动攻击

我们发现,其中有一个长度比较异常(最长),尝试登录,

登录成功,结论:用户名:admin,密码:password

low通关。

Medium

调整靶场难度为:Medium,选择提交:

调整之后查看对应源代码:

php 复制代码
<?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);
}

?>

代码含义:

首先,通过 isset($_GET['Login']) 判断是否接收到了登录请求。然后对用户名 $user 和密码 $pass 进行了一些处理和净化:

  • 使用 mysqli_real_escape_string 函数来处理可能存在的特殊字符,以防止 SQL 注入。
  • 对密码进行了 md5 哈希处理。

接着执行一个 SQL 查询从 users 表中查找匹配的用户和密码。如果查询成功并且返回的行数为 1,表示登录成功:

  • 获取用户的头像信息 $avatar
  • 输出欢迎信息和头像。

如果查询结果为空或者行数不为 1,表示登录失败:

  • 程序会暂停 2 秒。
  • 输出登录失败的提示信息。

最后,关闭了与数据库的连接。

Medium级别比上一个级别多了一个sleep(),即登录失败后会有两秒的静默延迟。但我们同样可以使用LOW级的爆破方式做测试,但是时间会长一点。(参考low方法)

相关推荐
c7_ln2 分钟前
MYSQL C_API使用全解
c语言·数据库·mysql
karry01305 分钟前
高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
java·数据库·ide
叫我菜菜就好12 分钟前
【node后端】搭建项目(Express+Ts+Typeorm+Mysql一步到位)
mysql·oracle·express
经典19921 小时前
mysql 锁介绍
数据库·mysql
不太可爱的大白1 小时前
Mysql分片:一致性哈希算法
数据库·mysql·算法·哈希算法
~ 小团子1 小时前
每日一SQL 【游戏玩法分析 IV】
数据库·sql·游戏
零叹2 小时前
MySQL——常用程序and主从复制
数据库·mysql
胚芽鞘6816 小时前
关于java项目中maven的理解
java·数据库·maven
sun0077009 小时前
mysql索引底层原理
数据库·mysql
workflower11 小时前
MDSE和敏捷开发相互矛盾之处:方法论本质的冲突
数据库·软件工程·敏捷流程·极限编程