【工具-DVWA】DVWA渗透系列一:Brute Force
前言
DVWA安装使用介绍,见:【工具-DVWA】DVWA的安装和使用
安全级别分低、中、高、安全四个级别来分析Brute Force的渗透测试过程。
1 Low
1.1 渗透测试
- 使用Burpsuite来测试,详细过程见:【工具-BurpSuite】BurpSuite专业版 安装和使用
- 使用SQL注入方式
使用账号【admin' OR '1'='1】+正确密码【password】,发现登陆失败
使用账号【admin' OR '1'='1】+空密码【】或者错误密码 ,发现登陆成功
使用账号【admin' OR '1'='2】+任何密码,都能登陆成功
咦?这是为何呢?找源码看看。
1.2 源码分析
网站路径:DVWA-master\vulnerabilities\brute下面有源码
index.php:根据安全级别,来选择使用的php代码。
switch( $_COOKIE[ 'security' ] ) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
$method = 'POST';
break;
}
low.php:发现SQL执行使用的拼接,且对参数username、password没有做任何过滤,存在SQL注入漏洞和Brute Force漏洞。
//用来检测变量是否设置
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>' );
//当查询结果为1个,则认为登陆成功
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Login successful
$html .= "<p>Welcome to the password protected area {$user}</p>";
$html .= "<img src=\"{$avatar}\" />";
}
else {
// Login failed
......
}
......
}
回到之前的问题,为何使用账号【admin' OR '1'='1】+正确密码【password】,会登陆失败。
执行SQL,发现使用password的密码的用户有2个,当查询结果不为1个时都认为登陆失败:
PS:所以,一般SQL注入时,会使用空密码,来避免因密码重复而导致认证失败。
当用户名为【admin' OR '1'='2】时,由于AND优先级高于OR,所以,OR之后的条件相当于不存在,所以只能查询出admin一个用户出来,这个和password不正确的情况是一样的。
2 Medium
2.1 渗透测试
- 使用Burpsuite来测试
发现:依然可以成功,但是,慢了很多。
- 使用SQL注入
发现:无效!!
2.2 源码分析
medium.php:与low相比,添加了mysql_real_escape_string函数,来对特殊字符进行转义;同时登陆失败会休眠2秒
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
//对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行转义
$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' ];
//对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行转义
$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
$html .= "<p>Welcome to the password protected area {$user}</p>";
$html .= "<img src=\"{$avatar}\" />";
}
else {
// Login failed 登陆失败休眠2秒
sleep( 2 );
$html .= "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!
上一篇: 有道云Markdown指南