SQL二次注入

avatar
作者
筋斗云
阅读量:0

目录

1.什么是二次注入?

2.二次注入过程

2.1寻找注入点 

2.2注册admin'#用户

2.3修改密码


1.什么是二次注入?

当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿出该用户名时没有对'和#进行转义,导致将密码的检测注释了,虽然看似后端代码将我们输入的'进行了转义,但是当将输入的数据存储到数据库中时,会将'加上存储的(数据库存储数据的特征),这样就实现了二次注入,也叫做存储型SQL注入。

2.二次注入过程

登录页面

注册页面 

 修改密码页面

2.1寻找注入点 

进行一些简单的测试,发现都无法成功 

查看后端代码发现,后端代码对我们输入的登录用户名和密码进行了过滤,因此无法注入

function sqllogin(){      $username = mysql_real_escape_string($_POST["login_user"]);  //过滤了单双引号    $password = mysql_real_escape_string($_POST["login_password"]);//过滤了单双引号    $sql = "SELECT * FROM users WHERE username='$username' and password='$password'"; //$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";    $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');    $row = mysql_fetch_row($res); 	//print_r($row) ;    if ($row[1]) { 			return $row[1];    } else {       		return 0;    }   }

但是发现pass_change.php文件中,修改密码时,当从数据库中找出所修改的用户的密码时,没有对username进行过滤,导致出现二次注入点。

if (isset($_POST['submit'])) { 	 	 	# Validating the user input........ 	$username= $_SESSION["username"]; 	$curr_pass= mysql_real_escape_string($_POST['current_password']); 	$pass= mysql_real_escape_string($_POST['password']); 	$re_pass= mysql_real_escape_string($_POST['re_password']); 	 	if($pass==$re_pass) 	{	 		$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; 		$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); 		$row = mysql_affected_rows(); 		echo '<font size="3" color="#FFFF00">'; 		echo '<center>';

我们是否可以先注册一个类似admin'#的用户,然后当对admin‘#用户进行修改密码时来进行注入呢?话不多说,直接开干

2.2注册admin'#用户

发现可以注册,与我们设想的一样

然后进行登录

顺利登录,此时页面显示YOU ARE LOGGED IN AS admin'#

2.3修改密码

根据pass_change.php文件的代码分析,current password可以随便填写,只要New Password等于Retype Password,程序就会进入if语句中,sql语句就会生效

if (isset($_POST['submit'])) { 	 	 	# Validating the user input........ 	$username= $_SESSION["username"]; 	$curr_pass= mysql_real_escape_string($_POST['current_password']); 	$pass= mysql_real_escape_string($_POST['password']); 	$re_pass= mysql_real_escape_string($_POST['re_password']); 	 	if($pass==$re_pass) 	{	 		$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; 		$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); 		$row = mysql_affected_rows(); 		echo '<font size="3" color="#FFFF00">'; 		echo '<center>';

此时我们将修改的密码进行提交后,admin'#进入sql语句中,上述sql语句就会变为 

$sql = "UPDATE users SET PASSWORD='$pass' where username='$admin'#' and password='$curr_pass' ";

标红的地方就会被注释掉,就会成功修改admin的密码

此时我们使用admin用户进行登录,测试admin的密码是否被修改

可以见到,我们确实用admin用户成功登录,在这之前我们是不知道admin用户的密码的

这就是sql二次注入,可以利用它来修改任意用户的密码,所以危害是比较大的

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!