DVWA之Brute Force,Command Injection全关解析

本文详细分析了从LOW到HIGH三个级别的网络安全防护,包括密码爆破、SQL注入防御和命令注入。LOW级存在明显的SQL注入漏洞,可使用Bruteforce工具进行爆破;MEDIUM级增加了SQL参数过滤,但可以通过其他字符绕过;HIGH级引入了CSRFToken和更多防御措施,但仍有命令注入的潜在风险。针对这些情况,文章讨论了相应的攻击手段和防御策略。
摘要由CSDN通过智能技术生成

Brute Force

LOW级

查看源码

下面展示一些 内联代码片

下面展示一些 内联代码片

<?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);
}

?> 

LOW级源码可以看出没有任何防护措施,我们甚至可以用SQL注入进行攻击,但这里先说爆破,爆破需要用到brupsuite,抓包。

抓包

具体如何抓包这里就不做过多解释,前面的文章也有提到,抓到的包如下:在这里插入图片描述
右击发送到Intruder在这里插入图片描述
如图,用§包住的就是我们要爆破的目标,我们先清除所有的§,这次我们要爆破出密码,就只给密码进行标记在这里插入图片描述
在这里插入图片描述
之后选择爆破类型,不同的爆破类型将字典中的数据替换到标记位置的方式也会有所不同,在LOW级难度里我们用Sniper,它的规则是把字典中的字符串一个一个替换到我们前面标记的位置进行爆破。
在这里插入图片描述
之后添加字典
在这里插入图片描述
开始爆破在这里插入图片描述
当密码正确是,反应时间会有所不同,根据反应时间的不同我们可以确定密码为password
在这里插入图片描述

Medium级

查看源码

下面展示一些 内联代码片

<?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);
}

?> 

我们会发现多了一行
下面展示一些 内联代码片

    $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)) ? "" : ""));

isset() 函数用于检测变量是否已设置并且非 NULL。返回TRUE。若变量不存在则返回 FALSE(错误),若变量存在且其值为NULL(无效),也返回 FALSE,若变量存在且值不为NULL,则返回 TURE(真),同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
is_object() 函数用于检测变量是否是一个对象
mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。返回已转义的字符串
最后一旦密码错误会延迟两秒,这个会增加我们的爆破时间,但是依然是可以爆破出来的,方法同Low级一样

High级

查看源码

下面展示一些 内联代码片

<?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();

?> 

我们可以看到加上了Token值, stripslashes(string)是去除掉string字符的反斜杠\,使用了stripslashes函数和mysqli_real_esacpe_string来抵御SQL注入和XSS的攻击。而对于Token,Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

爆破

爆破模式Attack type选用Pitchfork,Pitchfork对每个标记字段单独设置字典,按照一一对应的关系取最少的组合
在这里插入图片描述
求包与自己的响应包有对应顺序,需要单线程,在Resource pool中添加一个单线程,线程数量修改为1。在这里插入图片描述
在Options选项中,找到Grep Extract栏,添加一个从响应包中的提取规则。点击Add,并从响应报文中找到对应的token信息位置,选中之后会自动生成匹配规则,然后点击OK确定。确定之后会在Grep-Extract列表中出现这一规则。
在这里插入图片描述在这里插入图片描述

之后设置字典,选择类型为递归,就是说前一次爆破产生的token将继续用在下一次,递归查询:从response中提取数据 user_token 的,然后去替换我们爆破的值在这里插入图片描述
Set1的设置和LOW级一样在这里插入图片描述
之后就可以开始爆破

Command Injection

Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。黑客如果能够利用命令执行漏洞,那么黑客就可以像电脑用户控制自己电脑一样,自由地对电脑进行操作,就好像通过CMD进行对计算机进行操作

LOW

查看源码在这里插入图片描述

可以看到这里直接将target 变量放入 shell_exec()执行ping命令,没有进行任何过滤,用户端可以直接拼接特定的命令,来执行并获取想要的信息。
A; B //A不论正确与否都会执行B
A&B //A后台运行,A和B同时执行
A&&B //A执行成功后才会执行B
A|B //A执行的输出结果作为B命令的参数,A不论正确与否,都会执行B
A||B //A执行失败后才会执行B命令

直接输入127.0.0.1&&ipconfig,可以看到把IP信息也显示出来了,之后我们甚至可以127.0.0.1&&ping baidu.com ,想干嘛干嘛
在这里插入图片描述

Medium级

在这里插入图片描述
这里设置了黑名单过滤规则,但是只过滤了两种字符’&&’ 和’;',我们可以用&,||等进行绕过
在这里插入图片描述

High级

在这里插入图片描述
看上去,似乎敏感的字符都被过滤了,但是 | 明显后面有个空格,所以如果不使用空格的话依然可以绕过:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值