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的有效时限 也就是清除cookieheader ('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>;//用户名已经存在请换一个用户名<?phpheader('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><?phpheader('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密码

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 安装 mvn

mvn 下载地址&#xff1a;https://maven.apache.org/download.cgi 选择一个合适的版本 cd /opt && curl -o apache-maven-3.8.6-bin.tar.gz https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz tar -xzf apache-maven-3.8.6-bin.…

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

uni-app x生成的安卓包,安装时,提示不兼容。解决方案

找到 manifest.json 进入&#xff1a;源码视图 代码 {"name" : "xxx康养","appid" : "__xxx6","description" : "xxx康养","versionName" : "1.0.12","versionCode" : 100012,&…

sqli-labs靶场详解(less17-less22)

目录 less-17 less-18 less-19 less-20 less-21 less-22 less-17 修改密码关卡 服务器后端 账号密码都存在数据库中 使用UPDATE进行修改密码 尝试username处 尝试好久尝试不出来应该是对用户名进行了过滤 于是对password进行注入 判断注入点 passwdadmin 报错&#xff1a…

有手就会的产品宣传册制作步骤,一定要收藏!

产品宣传册制作就是为了扩大宣传企业产品&#xff0c;让大众了解和认识产品&#xff0c;从而对产品产生信任。但是&#xff0c;制作一本让人满意的产品宣传册并不容易&#xff0c;很多人都觉得很难&#xff0c;尤其是新手小白。 其实&#xff0c;这些都不是问题&#xff0c;只…

滑块验证码之图片距离计算

滑块验证码之图片距离计算 1.使用工具 vscodepython3.8 2.安装opencv-python python -m pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com查看安装的版本&#xff1a; C:\Users\wenhz>pip list|findstr opencv opencv-pyt…

初次尝试http OAuth2验证的请求

第一次对接OAuth2验证的接口&#xff0c; 莫不着门道&#xff0c;后面获取token成功后&#xff0c;发现其实不难&#xff0c; 用postman举例&#xff1a; 其实挺简单。用客户端id秘钥 获取token---》后面的请求带上token 1,在head中增加 Authorization头 内容格式如上图&…

如何在外远程访问本地NAS威联通QNAP?

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 威联通安装cpolar内网穿透二. 内网穿透2.1 创建隧道2.2 测试公网远程访问 三.…

RK3568 android11 实现GT9xx双路I2C触摸

一&#xff0c;GT911 触摸屏简介 它的接口类型为 I2C &#xff0c;供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻&#xff0c;这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序&#xff0c;同样是 GT911 &#xff0c;不同批次的器件都有…

Spring Cloud+Nacos 注册中心详解及开发示例

目录 一、Nacos 的关键特性包括: 二、逻辑架构及其组件介绍 三、Nacos安装 1、版本选择 2、预备环境准备 3、下载源码或者安装包 4、启动服务器 5、关闭服务器 四、如何引入 Nacos Discovery Starter 五、启动一个 Provider 应用 1 pom.xml的配置。一个完整的 pom.xm…

JMeter---BeanShell实现接口前置和后置操作

在JMeter中&#xff0c;可以使用BeanShell脚本来实现接口的前置和后置操作。 下面是使用BeanShell脚本实现接口前置和后置操作的步骤&#xff1a; 1、在测试计划中添加一个BeanShell前置处理器或后置处理器。 右键点击需要添加前置或后置操作的接口请求&#xff0c;选择&quo…

波奇学C++:C++11的新特性

列表初始化 #include<iostream> using namespace std; struct A {int _x;int _y; }; int main() {// 三种方式等价&#xff0c;并且可以省略int x 1;int y { 2 };int z{ 3 };return 0; } {}按声明顺序初始化类成员变量 A p{ 1,2 }; cout << p._x; //1 cout &…

C语言--每日选择题--Day27

第一题 1. 对于代码段&#xff0c;问下面不可以表示a[1]地址的是&#xff08;&#xff09; int a[10]; A&#xff1a;&a[0] 1 B&#xff1a;a sizeof(int) C&#xff1a;(int*)&a 1 D&#xff1a;(int*)((char*)&a sizeof(int)) 答案及解析 A A&#xff1a;取到…

自定义一个函数返回两个值的两种方法

自定义一个函数返回两个值的两种方法 1.用void 2.用址传递

Maven生命周期

Maven生命周期 通过IDEA工具的辅助&#xff0c;能很轻易看见Maven的九种生命周期命令&#xff0c;如下&#xff1a; 双击其中任何一个&#xff0c;都会执行相应的Maven构建动作&#xff0c;为啥IDEA能实现这个功能呢&#xff1f;道理很简单&#xff0c;因为IDEA封装了Maven提供…

Xred木马是什么

xred是非常常见的蠕虫病毒之一&#xff0c;属于AutoRun家族&#xff0c;样本变种极多&#xff0c;使用Dephi编写。 病毒可通过文件分享和U盘、移动硬盘等媒介传播。 最常见的域名就是&#xff1a; xred.mooo.com 一般会访问链接&#xff0c;下载文件&#xff0c;但是网址文件…

neo4j在Linux上安装及使用

1、简介 neo4j安装主要有两个步骤&#xff1a; 环境配置&#xff1a;Java安装工具下载&#xff1a;neo4j安装 2、java 安装 2.1 检查 安装前可以检查下&#xff0c;当前环境是否有Java 查看是否安装&#xff1a;java -version 说明当前环境没有&#xff0c;那么去下载 …

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…

浅谈无线测温系统在海上石油平台高压配电盘的应用-安科瑞 蒋静

摘要&#xff1a;海上石油平台的封闭式中高压配电盘在平台电力系统起着十分重要的作用&#xff0c;通过统计其配电盘的 大部分故障为前期的热效应引起&#xff0c;由于配电盘内部空间封闭狭小&#xff0c;所以无法进行人工巡查测温&#xff0c;这给油田的供电系统埋下了一定的潜…

Web3.0时代:区块链DAPP将如何颠覆传统模式

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 随着…