SQL二次注入
创始人
2024-11-05 15:08:29

目录

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 ''; 		echo '
';

我们是否可以先注册一个类似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 ''; 		echo '
';

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

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

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

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

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

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

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...