栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SQL注入 Less24(二次注入)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL注入 Less24(二次注入)

二次注入原理

二次注入(存储型注入),这种手法所利用的原理是:在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义。因而使得用户第一次提交的时候不会被当做代码执行。但是这些数据存入数据库的时候却没有转义(比如用户输入的数据为admin'#,进行执行代码的时候会转义为admin'#,存入数据库的数据仍为admin'#),而网站程序默认数据库中的数据都是安全的,当网站程序第二次调用刚才存储的脏数据的时候,则不会转义使用而是直接使用,因此就会达到注入的效果。

注意两点:
1、网站会将数据原封不动的存入数据库中。
2、网站会直接调用数据库中的数据而不会对其进行检测等操作。(信任数据库中的数据)

第一次进行数据库插入数据的时候,使用了 addslashes 、get_magic_quotes_gpc、mysql_escape_string、mysql_real_escape_string等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 “” 进行转义,但是“”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。

  • 第一步:插入恶意数据
    进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
  • 第二步:引用恶意数据
    开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。并不会进行转义操作,而是直接拼接到SQL语句中执行。
Less24黑盒


一个用户登录界面,可以注册新用户和登录。

我们登录一个Dumb:Dumb看一下

可以更改密码

我们看一下我们当前的users表

我们注册一个新用户admin'#,密码为123456

admin'#是直接原数据存入了数据库

我们登录admin'#用户,进行修改密码

将密码修改为nihao

但发现admin用户的密码变为了nihao

然后我们就获得了admin:nihao,可以登录这个账户了。这就是我们的目的

Less24白盒

注册用户


	

# Validating the user input........

	//$username=  $_POST['username'] ;
	$username=  mysql_escape_string($_POST['username']) ;
	$pass= mysql_escape_string($_POST['password']);
	$re_pass= mysql_escape_string($_POST['re_password']);
	
	echo "";
	$sql = "select count(*) from users where username='$username'";
	$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
  	$row = mysql_fetch_row($res);
	
	//print_r($row);
	if (!$row[0]== 0) 
		{
		?>
		;
		
       		if ($pass==$re_pass)
			{
				# Building up the query........
   				
   				$sql = "insert into users ( username, password) values("$username", "$pass")";
   				mysql_query($sql) or die('Error Creating your user account,  : '.mysql_error());
					echo "
"; echo "
"; //echo "User Created Successfully"; echo "
"; echo "
"; echo "
"; echo "
Redirecting you to login page in 5 sec................"; echo ""; echo "
If it does not redirect, click the home button on top right
"; header('refresh:5, url=index.php'); } else { ?>

对用户输入的数据进行了转义

	$username=  mysql_escape_string($_POST['username']) ;
	$pass= mysql_escape_string($_POST['password']);
	$re_pass= mysql_escape_string($_POST['re_password']);

插入数据库

insert into users ( username, password) values("$username", "$pass")

为什么插入的是原数据而不是转义后的数据,我觉得应该是数据库内部的操作,自动去除了转义符。
之所以转义,是为了预防用户进行SQL注入

修改密码


	
	
	# 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 '
'; if($row==1) { echo "Password successfully updated"; } else { header('Location: failed.php'); //echo 'You tried to be smart, Try harder!!!! :( '; } } else { echo '
'; echo "Make sure New Password and Retype Password fields have same value"; header('refresh:2, url=index.php'); } } ?>

同样对用户输入的数据进行了转义

	$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']);

但是注意,这里的username是直接拿过来的,没有进行转义操作!!!
如果对username进行转义了,就不会出现二次注入漏洞了

UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'

https://blog.csdn.net/hhhhhhhhh85/article/details/121328475
https://blog.csdn.net/weixin_43901998/article/details/107288123

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号