something about DVWA - brute force

DVWA

DVWA => 备份地址

Brute Force(暴力破解)

Low

  • 选取暴破点

    GET /dvwa/vulnerabilities/brute/?username=admin&password=§p§&Login=Login HTTP/1.1 中,
    password进行暴破。

  • 设置payload

    Attact type选择SniperPayloads选择Runtime file, 既而选择密码 字典文件(2019_top100.txt),暴力破解即可。

  • 源码分析

    • 直接从request中获取参数

      1
      $pass = $_GET[ 'password' ]; 
    • 直接将参数以字符串的方式拼接入sql

      1
      $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; 

Medium

  • 选取暴破点

    Low级别相同。

  • 设置payload

    Low级别相同。

  • 源码分析

    request中获取参数后,使用mysqli_real_escape_string函数对参数中可能干扰到sql查询的特殊字符进行删除。

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

High

  • 选取暴破点

    由于有token检测,除了password暴破点外,还需要设置user_token暴破点。
    GET /dvwa/vulnerabilities/brute/?username=admin&password=§pa§&Login=Login&user_token=§ad5031ef52b181892a11a845db6807b7§ HTTP/1.1

  • 设置Options

    由于需要绕过token检测,因此需要获取页面请求时返回的token值。

    由于需要先进行页面请求,再进行暴破,因此需要用到重定向Redirections中设置Follow redirections:Always

    Options中,Grep - Extract中添加一条记录,捕获token值。
    Refetch response后,选中tokenvalue值,burpsuite会自动生成对应的捕获正则表达式, 添加即可在每次的页面请求response中捕获对应token值,用于payload中。

    由于绕过token需要对每一次的页面请求responsetoken值进行捕获,因此不可以使用多线程。 Resource Pool中自定义Max concurrent requests1的规则。

  • 设置payload

    Attact type设置为Pitchfork后对每个暴破点设置payload

    password暴破点的payload正常设置。

    tokenpayload设置为Recursive grep,也即使用捕获的token值。

  • 源码分析

    • 检测token

      先进行token的检测检测通过,再进行后续操作。

      1
      checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    • stripslashes函数过滤参数

      request中获取参数后,先使用stripslashes函数去除参数中的\字符。

      1
      $pass = stripslashes( $pass ); 
    • mysqli_real_escape_string函数过滤参数

      再使用mysqli_real_escape_string函数对参数中可能干扰到sql查询的特殊字符进行删除。

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

Impossible

相比High级别,增加了尝试次数的限定,超过尝试次数后一段时间内禁止尝试。

1
2
3
4
// Default values
$total_failed_login = 3;
$lockout_time = 15;
$account_locked = false;
作者

cSan

发布于

2021-11-16

更新于

2021-11-16

许可协议