天天看点

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

文章目录

  • 6.SQL Injection
    • 6.1、low
    • 6.2、medium-mysqli_real_escape_string
    • 6.3、high
    • 6.4、impossiable
  • 7.SQL Injection(Blind)
    • 7.1、low
    • 7.2、medium
    • 7.3、high
    • 7.4、impossiable

6.SQL Injection

参考链接:DVWA SQL Injection 通关教程

6.1、low

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

$_REQUEST请求方式,单引号闭合,且无过滤,因此可以直接进行union注入。、

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

可见列名为2.

爆数据库名称与用户名称

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

爆数据库中的表名

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

爆指定表中的列名

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)
DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

获取字段的值

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

6.2、medium-mysqli_real_escape_string

语法:mysqli_real_escape_string(connection,escapestring);

参数 描述
connection 必需。规定要使用的 MySQL 连接。
escapestring 必需。要转义的字符串。编码的字符是 NUL(ASCII 0)、\n、\r、\、’、" 和 Control-Z。
DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

POST请求方式,字符型闭合,还添加了一个过滤的字符函数mysqli_real_escape_string()。

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)
DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

6.3、high

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

请求方式为$_ SESSION,单引号闭合,无过滤。

可以看到,与Low Secuity Level的代码相比,Medium Secuity Level的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。

6.4、impossiable

采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了”脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

<?php
/*Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,*/
if( isset( $_GET[ 'Submit' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$id = $_GET[ 'id' ];

	// Was a number entered?
	if(is_numeric( $id )) {
		// Check the database
		$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
		print_r($db);
		$data->bindParam( ':id', $id, PDO::PARAM_INT );
		$data->execute();
		$row = $data->fetch();


		// Make sure only 1 result is returned
		if( $data->rowCount() == 1 ) {
			// Get values
			$first = $row[ 'first_name' ];
			$last  = $row[ 'last_name' ];

			// Feedback for end user
			$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
		}
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

           

7.SQL Injection(Blind)

参考文献:DVWA SQL Injection(Blind) 通关教程

作者:御用闲人

7.1、low

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
	// Get input
	$id = $_GET[ 'id' ];

	// Check database
	$getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

	// Get results
	$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
	if( $num > 0 ) {
		// Feedback for end user
		$html .= '<pre>User ID exists in the database.</pre>';
	}
	else {
		// User wasn't found, so the page wasn't!
		header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

		// Feedback for end user
		$html .= '<pre>User ID is MISSING from the database.</pre>';
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

           

由源码可见,与上面的显错注入源码类似,均没有进行参数过滤,且闭合方式也为单引号闭合;但是在这里并不会输出数据库的数据与数据库的报错提示,只会显示输入的id是否在数据库中。如下图。

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

在这里我们可以利用布尔注入逐个猜解数据库名的每个字母。例如:

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

7.2、medium

利用mysqli_real_escape_string函数对特殊符号\x00,\n,\r,,’,”,\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。

DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

闭合方式为数字型。

7.3、high

利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {
	// Get input
	$id = $_COOKIE[ 'id' ];

	// Check database
	$getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

	// Get results
	$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
	if( $num > 0 ) {
		// Feedback for end user
		$html .= '<pre>User ID exists in the database.</pre>';
	}
	else {
		// Might sleep a random amount
		if( rand( 0, 5 ) == 3 ) {
			sleep( rand( 2, 4 ) );
		}

		// User wasn't found, so the page wasn't!
		header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

		// Feedback for end user
		$html .= '<pre>User ID is MISSING from the database.</pre>';
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

           
DVWA攻略-03-SQL显错or 盲注6.SQL Injection7.SQL Injection(Blind)

7.4、impossiable

采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,Anti-CSRF token机制的加入了进一步提高了安全性。

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$id = $_GET[ 'id' ];

	// Was a number entered?
	if(is_numeric( $id )) {
		// Check the database
		$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
		$data->bindParam( ':id', $id, PDO::PARAM_INT );
		$data->execute();

		// Get results
		if( $data->rowCount() == 1 ) {
			// Feedback for end user
			$html .= '<pre>User ID exists in the database.</pre>';
		}
		else {
			// User wasn't found, so the page wasn't!
			header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

			// Feedback for end user
			$html .= '<pre>User ID is MISSING from the database.</pre>';
		}
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>