代码审计——DVWA SQL Injection(SQL 注入)

Low等级代码



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

	// Check database
	$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
'
); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user $html .= "
ID: {$id}
First name: {$first}
Surname: {$last}
"
; } mysqli_close($GLOBALS["___mysqli_ston"]); } ?>

分析代码

变量ID接受传参值
变量query 构造SQL语句
变量result 执行SQL语句

通过构造的SQL语句发现 ‘$id’ 。是个字符串的类型 需要用 ’ 单引号来闭合,并且没有过滤。直接用SQLmap跑就行了

	// Get input
	$id = $_REQUEST[ 'id' ];
	// Check database
	$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
'
);

Medium等级代码



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

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '
' . mysqli_error($GLOBALS["___mysqli_ston"]) . '
'
); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Display values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"
; } } // This is used later on in the index.php page // Setting it here so we can close the database connection in here like in the rest of the source scripts $query = "SELECT COUNT(*) FROM users;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
'
); $number_of_rows = mysqli_fetch_row( $result )[0]; mysqli_close($GLOBALS["___mysqli_ston"]); ?>

分析代码
Medium等级中 是用POST方式进行传参
mysqli_real_escape_string()函数 是把 单引号 双引号 (反斜杠)和NULL 进行转义的 如 ’ => '\
这里的话是防止 运用 字符串类型 进行注入的。
定义的SQL语句中 $id 没有单引号也没有双引号 是个int类型的,这里并没有什么过滤只是有个mysqli_real_escape_string(),而且还是int类型的 防不住可以直接跑出来。
代码审计——DVWA SQL Injection(SQL 注入)_第1张图片

High等级代码



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

	// Check database
	$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
	$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
Something went wrong.
'
); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user $html .= "
ID: {$id}
First name: {$first}
Surname: {$last}
"
; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

先抓个包看一下
第一此请求的是session-input.php文件
代码审计——DVWA SQL Injection(SQL 注入)_第2张图片
第二次请求的是/vulnerabilities/sqli/
代码审计——DVWA SQL Injection(SQL 注入)_第3张图片
分析代码
在High.php文件中变量id获取的是session中的id 值
在这里插入图片描述
通过抓包我们看到首先请求的是session-input.php文件 。分析一下session-input.php文件中的代码



define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';

dvwaPageStartup( array( 'authenticated', 'phpids' ) );

$page = dvwaPageNewGrab();
$page[ 'title' ] = 'SQL Injection Session Input' . $page[ 'title_separator' ].$page[ 'title' ];

if( isset( $_POST[ 'id' ] ) ) {
	$_SESSION[ 'id' ] =  $_POST[ 'id' ];
	//$page[ 'body' ] .= "Session ID set!


";
$page[ 'body' ] .= "Session ID: {$_SESSION[ 'id' ]}


"
; $page[ 'body' ] .= ""; } $page[ 'body' ] .= "


"
; dvwaSourceHtmlEcho( $page ); ?>

这里接受POST中的id值也就是第一个请求包中的id值。然后在把id值存到session中
代码审计——DVWA SQL Injection(SQL 注入)_第4张图片
high.php文件中 变量id的值是获取session【id】,然后把它带入到SQL语句中执行。
代码审计——DVWA SQL Injection(SQL 注入)_第5张图片
这里也没有过滤 非法字符 很明显是存在注入的。但是这个不能用sqlmap跑只能手工注入。
要跑这个数据包的话,会进行跳转 sqlmap无法获得返回值。
代码审计——DVWA SQL Injection(SQL 注入)_第6张图片

Impossible等级代码



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();
		$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 .= "
ID: {$id}
First name: {$first}
Surname: {$last}
"
; } } } // Generate Anti-CSRF token generateSessionToken(); ?>

分析代码
is_numeric() 函数用于检测变量是否为数字或数字字符串
is_numeric() 函数检测了传递过来的是不是数字类型 如果不是就为false,这里就杜绝了SQL注入。
代码审计——DVWA SQL Injection(SQL 注入)_第7张图片

你可能感兴趣的:(代码审计)