sqli-labs-Less-24

SQL-Labs 实验

Less-24:

这一关与之前的关卡都不同,进入之后,发现本关主要有以下几个功能,一是用户登陆页面;二是用户注册页面;三是用户修改密码页面;四是忘记密码页面。这里的忘记密码页面没什么用,主要是依托前三个页面,进行两个账号注册,然后修改密码进行二次注入,就可以破解用户登陆密码。

观察这一用户登陆页面,我们可以注意到这里有一个"New User click here?",点击之后,发现进入了新的注册页面,如下图:

这里我们注册一个新的账号:heze09,密码输入:123。

记住这里的密码,后面我们会发现,可以在不知道当前密码的情况下,修改这个账号的密码,使用新的密码登陆。

这个时候,我们观察一下原代码中,关于查询用户账号与密码的SQL语句:

php 复制代码
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;
   }

我们可以看到,在登陆用户界面时,使用mysql_real_escape_string()函数对账户名和密码进行了单、双引号的过滤,这里我们再次查询其他页面,发现在用户注册页面当中的SQL查询语句,没有严格的过滤单、双引号,我们就可以利用这一点修改Payload。

php 复制代码
if (isset($_POST['submit']))
{
	

# 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 "<font size='3' color='#FFFF00'>";
	$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) 
		{
		?>
		<script>alert("The username Already exists, Please choose a different username ")</script>;
		<?php
		header('refresh:1, url=new_user.php');
   		} 
		else 
		{
       		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 "</br>";
					echo "<center><img src=../images/Less-24-user-created.jpg><font size='3' color='#FFFF00'>";   				
					//echo "<h1>User Created Successfully</h1>";
					echo "</br>";
					echo "</br>";
					echo "</br>";					
					echo "</br>Redirecting you to login page in 5 sec................";
					echo "<font size='2'>";
					echo "</br>If it does not redirect, click the home button on top right</center>";
					header('refresh:5, url=index.php');
			}
			else
			{
			?>
			<script>alert('Please make sure that password field and retype password match correctly')</script>
			<?php
			header('refresh:1, url=new_user.php');
			}
		}
}

我们构造一个新的账号:heze09'#,密码:789。这里实际上是将"heze09'#"作为一个字符串进行了输入,当作账户名。

这时我们返回最初的登陆界面,使用账号:heze09'#,密码:789来登陆系统。

登陆之后的页面如下图所示:

通过查询这个页面的源码,我们发现SQL语句可以进行修改密码的操作。

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

上述代码中最重要的一句SQL更新用户名与密码的代码是这一句:

php 复制代码
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

我们在用户名这里输入了"heze09'#",其中"#"将后面的语句注释掉了,实际上整条查询语句就变以下面这句:

php 复制代码
$sql = "UPDATE users SET PASSWORD='$pass' where username='heze09'#' and password='$curr_pass' ";

可以看到,我们以heze09'#账号进入了一个可以修改用户密码的页面,这时在Current Password这里可以随便输入一个密码,如567,然后输入新的密码:456,并确认。

这里需要提醒大家的是,这个修改密码的操作,实际上是修改了账号:heze09的密码,上文提到这个账号的初始密码是123,我们修改了密码之后,就可以使用新的密码:456来登陆heze09的账户了。

这是使用账号heze09,密码:456,登陆进来的页面。由此,我们可以看到,这种情况下,不需要知道账号heze09原来的密码是什么,也可以成功重置密码进行登陆。

相关推荐
cnskylee1 小时前
【MySQL】麒麟V10 SP3系统安装MySQL-Commercial-8.0.46
数据库·mysql·adb
梦幻通灵1 小时前
修改MySQL数据库递增序列【持续更新】
数据库·mysql
大侠归来2 小时前
常用 MySQL 分库分表方案详解
数据库·mysql
文章永久免费只为良心2 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
塞讯科技2 小时前
13,500 个分支被植入窃密工作流:Gheist 如何用 GitHub 令牌搬走仓库密钥
网络安全·ai·github·软件供应链安全·供应链投毒
`Levie7 小时前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)7 小时前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
吹什么轩7 小时前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
paopaokaka_luck8 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
m0_639906948 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql