SQL注入:二次注入

 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工具来进行解码:

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

<?phpini_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.rhkb.cn/news/247407.html

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

相关文章

防御保护--NAT策略

目录 NAT策略 NAT类型 server-map表 P2P --- peer to peer 网络类型 ​编辑 目标NAT--服务器映射 双向NAT ​编辑 多出口NAT NAT策略 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多NAPT 服务器映射 源NAT--基于源IP地址进行转…

IDEA插件(MyBatis Log Free)

引言 在Java开发中&#xff0c;MyBatis 是一款广泛使用的持久层框架&#xff0c;它简化了SQL映射并提供了强大的数据访问能力。为了更好地调试和优化MyBatis应用中的SQL语句执行&#xff0c;一款名为 MyBatis Log Free 的 IntelliJ IDEA 插件应运而生。这款插件旨在帮助开发者…

扭蛋机小程序开发:创新体验与商业机会

一、引言 随着移动应用的普及&#xff0c;小程序已经成为一种新型的应用形式&#xff0c;以其轻便、快捷、无需安装等优点深受用户喜爱。扭蛋机作为一种常见的娱乐设备&#xff0c;其小程序开发将带来全新的用户体验&#xff0c;同时也为企业带来了商业机会。本文将探讨扭蛋机…

阿里云发送短信

0.阿里云文档地址 可以设置测试手机号 1.引入依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId></dependency><dependency><groupId>com.aliyun</groupId><artifactId…

LLM大语言模型(五):用streamlit开发LLM应用

目录 背景准备工作切记streamlit开发LLM demo开一个新页面初始化session先渲染历史消息接收用户输入模拟调用LLM 参考 背景 Streamlit是一个开源Python库&#xff0c;可以轻松创建和共享用于机器学习和数据科学的漂亮的自定义web应用程序&#xff0c;用户可以在几分钟内构建一…

ES6.8.6 创建索引配置分词器、映射字段指定分词器、查询数据高亮显示分词结果(内置分词器、icu、ik、pinyin分词器)

文章目录 ES环境内置分词器&#xff0c;以simple分词器示例查询创建索引simple_news&#xff0c;修改分词器为simple插入模拟数据分词查询&#xff1a;返回通过分词查询到的结果、高亮分词分词匹配&#xff1a;写一次示例&#xff0c;其他分词和匹配思路基本一致第一步&#xf…

What is Rust? Why Rust?

why Rust&#xff1f; 目前&#xff0c;Rust 变得越来越流行。然而&#xff0c;仍然有很多人&#xff08;和公司&#xff01;&#xff09;误解了 Rust 的主张价值是什么&#xff0c;甚至误解了它是什么。在本文中&#xff0c;我们将讨论 Rust 是什么以及为什么它是一种可以增强…

laravel框架项目对接小程序实战经验回顾

一.对接小程序总结 1.状态转换带来的问题&#xff0c;如下 问题原因&#xff1a;由于status 传参赋值层级较多&#xff0c;导致后续查询是数组但是传参是字符串&#xff0c; 解决方案&#xff1a;互斥的地方赋值为空数组&#xff0c;有状态冲突的地方unset掉不需要的参数 2参…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

初探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读题目解法一解法二 题目 题目&#xff1a;给定一个 n 个元素有序的&#xff0…

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装&#xff08;指定好Docker文件目录&#xff09;2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可&#xff0c;安…

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由&#xff08;首页&#xff0c;详情&#xff09;3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参&#xff08;查询参数 $ 动态路由&#xff09;7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由&#xff08;首…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

借用GitHub将typora图片文件快速上传CSDN

前情概要 众所周知&#xff0c;程序员大佬们喜欢用typora软件写代码笔记&#xff0c;写了很多笔记想要放到CSDN上给其他大佬分享&#xff0c;但是在往csdn上搬运的时候&#xff0c;图片总是上传出错&#xff0c;一张一张搞有很麻烦&#xff0c;咋如何搞&#xff1f; 废话不多…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为&#xff0c;只能保证块内有序的情况下&#xf…

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序&#xff0c;尤其大中型的项目来说&#xff0c;在程序启动和运行时&#xff0c;往往需要传入许多参数来控制程序的行为&#xff0c;我们可以通过命令行参数&#xff0c;环境变量&#xff0c;配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求&#xff0c;仅想提高sink2es的qps&#xff0c;所以仅调节了sink2es的并行度&#xff0c;但在调节不同算子并行度时遇到一些问题&#xff0c;找出问题的根本原因解决问题&#xff0c;并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

centos 7安装MySQl

本文参考借鉴&#xff1a;https://cloud.tencent.com/developer/article/2353312&#xff0c;非常赞&#xff01; 为了避免权限不足的问题&#xff0c;建议切换至root用户进行安装 1.MySQL的清理与安装 查看是否存在MySQL服务 安装mysql之前&#xff0c;需要先看看要安装系…