【DVWA】SQL注入

SQL注入是网站常见的漏洞之一,它能够直接拿到网站上数据库的所有内容。在DVWA搭建(https://my.oschina.net/u/3776619/blog/1803401),并将DVWA的安全级别设置为low之后,能很好地模拟出一次sql攻击。通过亲自经历,我们以后应该能很好地在开发网站时留下这个漏洞给人攻击。

 

一、DVWA中的SQL注入展示

打开SQL Injection模块,初看,这是个很普通的输入框。比如我们输入1,他能很好地进行反馈,如下图所示:

但你输入1'你会发现这个网站是报错的,不能很好地进行反馈,这就意味着,这个网站是存在SQL漏洞:

之所以这样说的原因,可以在这网页的源码中一目了然。这网页的源码在.\DVWA\vulnerabilities\sqli\source\low.php里面,具体如下:

<?php

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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

	// Get results
	while( $row = mysqli_fetch_assoc( $result ) ) {
		// 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>";
	}

	mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

留意到对于$query语句是没有任何保护的,也就意味着,里面$id=1,也就是$query演变成SELECT first_name, last_name FROM users WHERE user_id = '1' 还好说, SELECT first_name, last_name FROM users WHERE user_id = ''' 是肯定报错的,那如果  SELECT first_name, last_name FROM users WHERE user_id = '1' or '1=1'呢?是不是这个查询必定为真,而且where语句不生效,将整个users表的first_name和last_name都查出来了?也就是,我们在输入框输入,1' or '1=1即可。

结果如下所示,果然和我们想象的一样:

 

二、SQL注入的防范

其实SQL注入的防范并不难,我们只要对传递的参数做校验,如果不合法,直接拒绝请求就完事了。分下面几种情况:

(1)如果你的输入框是要求数字类型的,判断是否为数字,如果不是,直接拒绝请求

(2)如果是有格式的类型(比如 日期,email,电话,身份证号码等等),判断是非符合格式,如果不符合格式,拒绝请求。

(3)如果是字符串类型,没有特殊的格式,需要对字符串长度做校验,如果长度大于数据库该字段的定义长度,直接拒绝请求。比如上面的id,数据库要是定义为varchar(1),如果输入超过1个字符,直接拒绝请求。

在.\DVWA\vulnerabilities\sqli\source\impossible.php里面,DVWA直接给出SQL注入的防范方案,具体如下:

<?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();
		$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();

?>

可以看到对于一个输入的id的类型和长度,还有返回结果的多少做了一个严格的审查,还用了php的Prepared Statement机制,严格限定id的类型,这样就做到万无一失了。

转载于:https://my.oschina.net/u/3776619/blog/1805225

<think>好的,我现在需要处理用户关于DVWASQL注入的请求。首先,用户想要了解相关的教程或示例,我得确保回答结构清晰,符合他们提供的系统级指令。 首先,我应该回忆一下DVWA的基本情况。DVWA是一个用于练习Web应用漏洞的平台,包含SQL注入等模块。用户可能需要知道如何配置环境,所以第一步可能需要介绍如何设置安全等级为Low,因为不同等级对应不同的防护措施,而Low是最基础的,适合演示注入原理。 接下来,用户可能需要具体的示例和步骤。我需要分步骤解释如何在Low级别下进行注入,比如输入' or '1'='1之类的Payload,并解释其原理。同时,要确保所有数学表达式和代码正确使用LaTeX格式,比如变量用$包裹,代码块用三个反引号标注语言。 然后,用户可能想知道其他安全等级的情况,比如Medium和High,以及如何防范SQL注入。这时候需要分点说明每个等级的不同防护措施,例如Medium使用下拉菜单和mysql_real_escape_string,而High使用更复杂的Token机制。同时,提供防御措施,比如预处理语句和输入过滤,并引用提供的参考资料,比如引用[1]和[2]。 还要注意生成相关问题,这可能包括不同等级的注入方法、如何绕过防护以及防范的最佳实践。确保问题与用户查询相关,并且能够引导他们深入理解。 另外,必须检查是否有正确的引用标识,比如在提到防御方法时引用[^1]和[^2],以及在渗透测试资源处引用[^3]。需要确保引用标记自然放置在相关段落的末尾,而不是生硬添加。 最后,要确保整个回答使用中文,语言流畅,结构清晰,分步骤说明,并且包含代码示例和引用。同时避免使用任何Markdown格式,除了代码块和引用标识。需要检查LaTeX是否正确,比如$符号的使用,以及独立公式是否用$$包裹,但在这个回答中可能数学表达式不多,主要集中在代码示例上。 可能还需要验证用户提供的引用链接是否与内容相关,比如引用[1]是关于快速排序的,但用户的问题是关于SQL注入的,所以可能需要调整引用的使用,确保引用内容与上下文相关。例如,在提到安全资源共享时引用,在渗透测试工具时引用。 总结,回答的结构应该是先介绍DVWASQL注入的基本设置,然后分步骤讲解不同安全等级的注入方法,提供代码示例,接着讨论防御措施,最后生成相关问题,并正确引用提供的参考资料。</think># DVWA SQL注入教程与示例分析 ## 一、环境准备 1. 安装DVWA:需部署PHP环境(推荐XAMPP/WAMP),下载DVWA源码解压至Web目录 2. 设置安全等级:登录后进入"DVWA Security",将安全级别设为**Low**(原始无防护状态) 3. 访问注入页面:导航栏选择"SQL Injection" ## 二、Low级别注入 ### 步骤演示 ```sql 用户ID输入框输入:' or '1'='1 等效SQL语句: SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1' ``` 此时会返回所有用户数据(如图1所示)。该漏洞源于直接拼接用户输入: $$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";$$ ### 其他Payload示例 1. `' UNION SELECT user, password FROM users#`(获取凭证数据) 2. `'; DROP TABLE users;-- `(破坏性注入) ## 三、中级(Medium)防护 当安全级别设为Medium时: 1. 输入方式变为**下拉菜单** 2. 后端使用`mysql_real_escape_string()`过滤 3. 绕过方法:通过Burp Suite拦截修改POST参数 ## 四、高级(High)防护 安全级别High时: 1. 使用Session验证Token 2. 输入限制为单条查询 3. 绕过需要结合二次注入技术 ## 五、防御措施 1. 使用预处理语句: ```php $stmt = $db->prepare("SELECT first_name FROM users WHERE user_id = ?"); $stmt->bind_param("i", $id); ``` 2. 实施输入过滤:`preg_match('/^[0-9]+$/', $_GET['id'])` 3. 最小化数据库权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值