sqli-labs靶场详解less-24(二次注入)

less-24

对于一个像我一样的小白来说这关就像php代码审计 

一开始进行判断注入点的时候怎么都找不到一点思路都没有

只能搜教程 说是二次注入 从来没遇见的题型 于是从代码审计开始

先说一下什么叫二次注入

二次注入
二次注入是指通过SQL语句存储到数据库的用户输入被读取后再次被SQL语句执行导致的注入。

原理
在第一次进行数据库插入数据的时候,仅仅只是使用了个别函数对其中的特殊字符进行了转义,在后端代码中可能被转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用拼凑SQL语句中,所以就形成了二次注入。
 

代码分析

login.php

<?PHP
session_start();
//当调用 session_start() 函数时,PHP 会检查当前请求中是否存在会话标识符(通常是通过 cookie 或 URL 参数传递的),
//如果存在会话标识符,则会恢复之前的会话数据;如果不存在会话标识符,则会创建一个新的会话,并生成一个唯一的会话标识符。
include("../sql-connections/sql-connect.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'"; //把转义后的用户和密码带入到数据库中进行查找 
   $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');//执行 如果失败返回提示信息
   $row = mysql_fetch_row($res); //
   if ($row[1]) {      //$row[1]也就是username的位置 看看是否有值
			return $row[1];
   } else {
      		return 0;
   }
}
$login = sqllogin();//将函数返回值给login参数
if (!$login== 0)     //如果username位置有值
{
	$_SESSION["username"] = $login;//给会话赋值
	setcookie("Auth", 1, time()+3600);  /* expire in 15 Minutes */
	header('Location: logged-in.php');//转到另一个logged-in.php
} 
else
{
?>
<img src="../images/slap1.jpg">
<?PHP
} 
?>

Logged-in.php

<?PHP
session_start();
if (!isset($_COOKIE["Auth"]))//如果cookie的auth的值不存在进入语句块
{
	if (!isset($_SESSION["username"])) //回话的username不存在进入语句块
	{
   		header('Location: index.php');//跳转到首页 也就是登录界面
	}
	header('Location: index.php');//同理 我感觉这两个跳转 在这个位置放一个就行
}
?>
//如果会话存在往下走 也就是cookie
<img src="../images/Logged-in.jpg"></br><font size="4" color="#FFFF00"></br></br>
YOU ARE LOGGED IN AS </br> 
<?php
echo $_SESSION["username"];//输出session中的username的值
?>
You can Change your password here. //如果修改密码跳转页面到passs_change.php页面
<form name="mylogin" method="POST" action="pass_change.php">
<strong>Current Password:</strong></font>
<strong>New Password:</strong>
<strong>Retype Password:</strong>

pass_change.php

<?PHP
session_start();
if (!isset($_COOKIE["Auth"]))
{
	if (!isset($_SESSION["username"])) 
	{
   		header('Location: index.php');
	}
	header('Location: index.php');
}
//以上同理查看是否存在cookie和session
?>
<?php
include("../sql-connections/sql-connect.php");
if (isset($_POST['submit']))
{
	$username= $_SESSION["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();//获取sql操作了数据库的几行数据
		if($row==1)//如果一行 也就是正常的情况
		{
			echo "Password successfully updated";//输出更改成功
		}
		else//如果修改密码失败 跳转到failed.php页面
		{
			header('Location: failed.php');
		}
	}
	else//两次输出的修改密码不一样 跳转到首页面
	{
		echo "Make sure New Password and Retype Password fields have same value";
		header('refresh:2, url=index.php');
	}
}
?>
<?php
if(isset($_POST['submit1']))//删除cookie也就是退出登录
{
	session_destroy();//销毁当前会话的所有数据
	setcookie('Auth', 1 , time()-3600);//清除cookie的有效时限 也就是清除cookie
	header ('Location: index.php');//跳转到登录界面
}
?>

failed.php

<?PHP
session_start();
if (!isset($_COOKIE["Auth"]))
{
	if (!isset($_SESSION["username"])) 
	{
   		header('Location: index.php');
	}
	header('Location: index.php');
}
//以上同理查看是否存在cookie和会话
//下面特别有意思 这个页面是因为输入的原始密码不对 所以给你个提示 滚开你个愚蠢的黑客
?>
<html>
<head>
</head>
<body bgcolor="#000000">
<div align="right">
<a style="font-size:.8em;color:#FFFF00" href='index.php'><img src="../images/Home.png" height='45'; width='45'></br>HOME</a>
</div>
</div>
<div style=" margin-top:150px;color:#FFF; font-size:24px; text-align:center">
<center>
<img src="../images/slap1.jpg">
</center>
</div> 
</body>
</html>

new_user.php

<?php
include '../sql-connections/sql-connect.php' ;
?>
//创建新用户的页面 把参数传给login_create.php
<a style="font-size:.8em;color:#FFFF00" href='index.php'><img src="../images/Home.png" height='45'; width='45'></br>HOME</a>
<form name="mylogin" method="POST" action="login_create.php">

<h2 style="text-align:center;background-image:url('../images/Less-24-new-user.jpg');background-repeat:no-repeat;background-position:center center">
<div style="padding-top:300px;text-align:center;color:#FFFF00;"><?php echo $form_title_ns; ?></div>
</h2>

</html>

login_create.php

<?PHP
session_start();//同理
?>
<?php
include("../sql-connections/sql-connect.php");
if (isset($_POST['submit']))//判断是否存在submit也就是提交的参数 如果有进入语句块
{
	$username=  mysql_escape_string($_POST['username']) ;//同理 对非法字符转义
	$pass= mysql_escape_string($_POST['password']);		 //同理
	$re_pass= mysql_escape_string($_POST['re_password']);//同理
	$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);//获取一行数据
	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)//两次密码输入的是否一致 一致执行代码块
			{
   				$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";//将数据插入数据库中
   				mysql_query($sql) or die('Error Creating your user account,  : '.mysql_error());//执行sql语句如果报错提醒你
					echo "<center><img src=../images/Less-24-user-created.jpg><font size='3' color='#FFFF00'>";   									
					echo "</br>Redirecting you to login page in 5 sec................";
					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');
			}
		}
}
?>

代码其实不难理解

第一步

盲猜里面有一个admin的用户

新建一个admin'#的用户  

走的login_create.php的文件

这个文件对所有的输入的非法字符转义(输入数据中的单引号注释符等)转成字符串

然后使用select count(*) from users where username='admin'#'  判断admin'#用户是否存在

不存在  使用 insert into users ( username, password) values(\"$username\", \"$pass\") 插入到数据库中(这个双引号加反斜杠就是确定双引号里面的是字符串 记住就行)

然后使用刚刚注册的进行登录

SELECT * FROM users WHERE username='$username' and password='$password'"; //把转义后的用户和密码带入到数据库中进行查找 查到后输出用户名 到这里都是没有问题的

先查看一下上帝视角users表里面的内容 原始admin账户密码是123456 刚刚我们注册时密码是 qwe

登录新建用户admin'#后我们进行更改密码为asd

服务器执行的代码是

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

这个时候就出现问题了 admin'#进入数据库的时候单引号和#号被当成了字符 但是从$username提取出来的admin'# 单引号和#号又被当成了特殊字符

于是语句就变成了

UPDATE users SET PASSWORD='asd' where username='admin'#' and password='$curr_pass'

标记红的是被注释掉了 这样就造成了无admin密码的情况下 就可以修改admin密码

这样就成功的无视原始用户密码的条件进行修改密码 前提你知道里面的用户是谁

其实这都不重要  重要的是我们发现了这个二次注入的注入点 和注入方式

有了这个我估计可以实施进一步注入 构造新的语句作为用户名

我看所有教程都是教更改密码的 没有进行下一步的注入 

有可能是太难了 没人愿意演示

也有可能是不存在下一步注入

下一步注入也是我估计的 我先不进行下一步注入 如果以后碰到类似的题 我再回来做

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/194232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_9(USART串口)

一、串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大地扩展了单片机的应用范围&#xff0…

西南科技大学(数据结构A)期末自测练习一

一、填空题(每空0.5分,共5分) 1、数据结构是指( A )。 A、数据元素的组织形式 B、数据类型 C、数据存储结构 D、数据定义 2、数据结构被形式地定义为(D,R),其中D是( B )的有限集合,R是D上( D )的有限集合。 (1)A.算法B.数据元素C.数据操作D.逻辑结构 (2)A.操作B.…

滴滴昨晚崩了,看这波还敢不敢降本增效?

起因 截至 2023 年 11 月 27 日晚&#xff0c;中国最大的网约车服务平台滴滴打车遭遇系统崩溃&#xff0c;继阿里云控制台故障之后&#xff0c;再次引发热议。这一事件迅速攀升至热搜榜首&#xff0c;引起广泛关注。 今晚约 10 点&#xff0c;滴滴打车遭遇大范围技术故障。用户…

小程序----使用图表显示数据--canvas

需求&#xff1a;在小程序上实现数据可视化 思路&#xff1a;本来想用的是echarts或者相关的可视化插件&#xff0c;但因为用的是vue3&#xff0c;大多数插件不支持&#xff0c;所以用了echarts&#xff0c;但最后打包的时候说包太大超过2M无法上传&#xff0c;百度了一下&…

[Linux] 正则表达式及grep和awk

一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…

继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏 数据脱敏是一种保护隐私数据的技术&#xff0c;通过将敏感信息转化为非敏感信息来实现对数据的保护&#xff0c;以保护敏感隐私数据的可靠性和安全性。 数据脱敏可以分为可恢复和不可恢复两类: 可恢复类可以通过一定的方式恢复成原来的敏感数据。不可恢复类则无…

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务&#xff1a;右键“此电脑”&#xff0c;选择“管理”&#xff0c;之后选择“服务和应用程序”--“服务”&#xff0c;在服务中找到“MySQL”&#xff0c;右键选择“停止”。 2、找到“控制面板”--“程序和功能”&#xff0c;找到MySQL&…

C++二分查找视频教程:两数之和

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 n…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备&#xff0c;通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中&#xff0c;从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移&#xff0c;渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

STK Components 二次开发- StarLink

1.星链数据下载 CelesTrak: Current GP Element Sets 下载二根数就可以。 2.处理数据 下载下来的数据是这样&#xff0c;要将字符串转为 二根数对象 TwoLineElementSet tle new TwoLineElementSet(tleString); Sgp4Propagator propagator new Sgp4Propagator(tle); 3.批量…

linux task_struct中进程调度相关的变量记录

参考文章&#xff1a; Linux进程调度分析记录&#xff0c;进程优先级&#xff0c;隔离处理器&#xff0c;isolcpus - 知乎

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法&#xff1a; 方法二&#xff1a;reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案&#xff1a; 使用Set&#xf…

AT89S52单片机------中断系统

目录 单片机的内部结构 中断请求标志寄存器 (1)TCON寄存器 (2)SCON寄存器 (3)定时器2的控制寄存器T2CON 中断允许与中断优先级的控制寄存器 中断允许寄存器IE 中断优先级寄存器IP 响应中断请求的条件 外部中断响应时间 外部中断的触发方式选择 中断请求的撤销 1.定…

[极客大挑战2023] Crypto/PWN/Reverse

这个网站真辛苦&#xff0c;每次都要回到all&#xff0c;屏幕随时卡。界面有待进步老远。也不提示结束&#xff0c;结果现在才听说结束了&#xff0c;才开始记录一下。 还跟往常一样&#xff0c;WM不作&#xff0c;其它也AK不了&#xff0c;总是差点。 Crypto SignIn 53594…

AI - Steering behaviors(转向系统)

游戏AI角色的转向系统&#xff08;Steering behaviors&#xff09;实现 一些向量的接口是cocos2dx的。但从名字上应该能理解做了什么向量操作 Seek&#xff1a; 获取当前位置指向目标点的向量&#xff0c;转化为单位向量后再乘以速度值&#xff0c;即为所需速度desired velo…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…

化学仿制药参比制剂目录-参比制剂查询网站

2015年以前&#xff0c;参比制剂对于仿制药的研究无关紧要&#xff0c;但推出了’仿制药一致性评价’后&#xff0c;参比制剂的选择成为了决定仿制药成功与否的关键因素&#xff0c;如今在进行仿制药研究时&#xff0c;首要任务就是确定仿制目标&#xff0c;也就是参比制剂。 …

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

TIME_WAIT状态套接字重新使用

《TIME_WAIT相关知识》里边有相关理论知识。 《TIME_WAIT状态TCP连接导致套接字无法重用实验》有相关实验。 现代Linux的TCP协议栈已经做了许多升级&#xff0c;所以可以让我们直接重用TIME_WAIT状态套接字而不会引起问题。下边是优化的内容&#xff1a; 1.新连接的SYN告知序列…