欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【工具-DVWA】DVWA渗透系列一:Brute Force

程序员文章站 2022-06-02 14:10:23
...

前言

DVWA安装使用介绍,见:【工具-DVWA】DVWA的安装和使用

安全级别分低、中、高、安全四个级别来分析Brute Force的渗透测试过程。

【工具-DVWA】DVWA渗透系列一:Brute Force

1 Low

1.1 渗透测试

【工具-DVWA】DVWA渗透系列一:Brute Force

  • 使用SQL注入方式

使用账号【admin' OR '1'='1】+正确密码【password】,发现登陆失败

【工具-DVWA】DVWA渗透系列一:Brute Force

使用账号【admin' OR '1'='1】+空密码【】或者错误密码 ,发现登陆成功

使用账号【admin' OR '1'='2】+任何密码,都能登陆成功

【工具-DVWA】DVWA渗透系列一:Brute Force

咦?这是为何呢?找源码看看。

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个时都认为登陆失败:

【工具-DVWA】DVWA渗透系列一:Brute Force

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!

相关标签: DVWA