【疑难攻关】——floor报错注入

news2025/1/12 1:38:56
作者名:Demo不是emo
主页面链接: 主页传送门
创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷
座右铭: 不要让时代的悲哀成为你的悲哀
专研方向: web安全,后渗透技术
每日emo: 树是生活,埋的是我,看花就好,别看我的落魄
今天给大家讲解的是SQL注入中的floor报错注入,这个注入平时我没怎么用,上次看别人面试时遇到了,就再来深究一下,研究其中的原理,利用方式等等

一、漏洞的简介

floor()报错注入的原因group by在向临时表插入数据时,由于 rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前 concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或数执行后的结果。

乍一看是不是听不懂,没关系,我们来详细讲解一下,首先介绍一下原理中涉及到的函数,如下

二、涉及的函数

floor()函数:对传入的值进行向下取整操作,并返回结果,如floor(1.999),则返回1.

rand()函数,返回随机数

rand(x)函数,x在这里代表参数,当rand()函数有了参数后,生成的就是伪随机数,什么意思呢?比如你使用rand(0)产生的第一个随机数产生的随机数相同,也就是当rand(x)这个参数x已知的时候我们就能知道,如下

同样的,刚才我们说的是使用rand(0)产生的第一个随机数都相同,产生的第n个随机数其实都相同,但是这n个随机数之间可能不相同,这样能懂吗?如下

也就是我user表里有三个数据,所以这个rand(0)执行了三次,可以看到rand(0)在不同的地方,执行的前三次的数据都是相同的

简单来说就是rand()函数有参数,即rand(x)时,rand(x)产生的就是伪随机的一个数组,数组中元素的值由x决定,就是你使用rand(x)产生的第n次数据,与我使用rand(x)产生的第n次数据是相同的

count(*)函数,返回值的条目,与count()的区别在于其不排除NULL,count()如果统计到NULL,返回的结果即为NULL,返回列数。如下,就是统计user表的内容条数

group by语句 分组的意思,如下

这里的意思就是以username字段来分组,会统计出users表中存在username字段的数据条数,但是当有多条数据的username相同时,我们统计出来的数据就不同,比如我们把上面其中四条数据的username都改为admin,如下

此时我们再以username字段来分组,效果如下

可以看到刚才统计了13条数据,现在只统计到了9条,说明以username来分组代表着统计username字段不同的数据,而经过我们刚才的修改,将5条数据的username都改为admin,所以它只识别到了其中一条,而且是第一条数据,所以此时以username来分组来分出来9条数据,这个意思可以理解吧

group by语句和count(*)函数结合 这样就可以统计指定字段的条数,如下

再这样就可以统计所有的username字段以及数据条数

floor报错注入的究极原因就是出在这两个函数混用时的运行原理中,如下

当count(*)和group by一起用,在执行的时候会创建一个类似于下面这样的虚拟表

其中的key就是主键,存放的也就是我们指定的字段数据,count(*)就作为值

当该命令运行后,会 遍历指定表中的数据,将数据中的指定字段带去虚拟表中查询,若虚拟表中存在该数据,则在对应的count(*)位置+1,若虚拟表中不存在,则将新的字段数据添加到主键位置,初始count(*)为1.例如有如下表

此时虚拟表为空,先遍历第一条数据,将指定的username字段数据带入虚拟表中查询,也就是Dumb,因为此时虚拟表为空自然是查不到的,所以就在虚拟表中添加在这条数据,此时虚拟表如下

接着遍历第二条数据,以此类推,就是没有数据就添加数据,有数据就添加count(*)的值,以此达到统计指定字段数据的目的

三、原理的剖析

上面我们已经知道了涉及的函数,这里就给大家讲讲floor报错注入的语句以及为什么会报错,首先来看看下面这个语句

select count(*),floor(rand(0)*2) from users group by floor(rand(0)*2)

执行结果如下

可以看到出现报错信息,提示“1”这个主键重复,这是为什么呢?在讲解之前我们首先要了解一个特性,就是rand()函数的一个特性

这个特性就是 rand()函数的执行速度要比 group by查询并插入key值的速度更快

首先我们讲了当group by和count(*)一起用时,会生成一个虚拟表,记录key和count(*),在上面的演示中我们用的是group by username,也就是以username字段作为key来统计数据,但是在这个报错的语句中,我们使用的是group by floor(rand(0)*2),而floor(rand(0)*2)的执行结果我们上面也已经知道了,就是下面这一串

按照group by语句的流程

1、首先将floor(rand(0)*2)的第一次执行结果,也就是0带入虚拟表的key中查询是否存在

2、此时不存在,所以会将此时的floor(rand(0)*2)的结果插入虚拟表中

3、但是不要忘了rand()函数的特性, rand()函数执行是比group by语句查询并插入key值更快的,也就是floor(rand(0)*2)执行了一次后,就被带去查询,此时floor(rand(0)*2)仍在执行,等查询完确认虚拟表中没有0这个key后,就将floor(rand(0)*2)此时的结果插入虚拟表

4、但此时floor(rand(0)*2)已经执行完第二遍了,结果为1,就导致了 带去查询的数据为0,但插入的数据却为1,对应的count(*)也为1,此时虚拟表如下
5、接着 floor(rand(0)*2)第三次执行,结果为1,group by也遍历到了第三个结果,也就把1带入虚拟表中的key值去查,发现存在“1”这个key值,所以直接在该key值对应的count(*)加1,也就是计数,注意这里并不需要插入操作,所以floor(rand(0)*2)的第四次执行还没有完成

6、接着 floor(rand(0)*2)第四次执行完成,结果为0,group by语句带0进入虚拟表key中查询,发现没有这个key值,所以将此时的floor(rand(0)*2)结果插入虚拟表,但是,因为rand()函数的特性,插入还没完成之前,floor(rand(0)*2)第五次执行结果已经完成,结果为1,所以导致带入查询的数据为0,插入的数据却为1,此时虚拟表如下

这样就导致出现了上面报错信息中的问题——主键重复

四、漏洞的利用

上面的讲解我们已经明白了为什么会提示“1”这个主键重复,那我们应该怎样利用呢?

既然是报错,那我们当然就要利用它的报错信息来入手,提示“1”这个主键重复,“1”这个主键是怎么来的?是不是我们的floor(rand(0)*2)执行出来的?那我们可不可以加入我们的恶意语句,让他在报错时进行执行,首先看看下面的语句

select count(*),concat(user(),floor(rand(0)*2)) from users group by concat(user(),floor(rand(0)*2))

我们在floor(rand(0)*2)旁边用concat()函数连接我们的恶意语句试试看,执行结果如下

成功执行我们的恶意语句并回显,说明我们的想法没问题,在floor(rand(0)*2)旁边连接上我们的恶意语句即可,这样就达到了floor报错注入的目的,将上面的恶意语句user()换成database()再试试,如下

同样达到效果

五、利用的拓展

上面我们已经弄懂了floor报错注入,但是每次修改语句都都要前后都修改,比较麻烦,有没有什么更好的方式,那自然是有的,就是下面要介绍的——别名

别名的格式如下

(语句)x

这里的x随便定义,用啥都行

来看看这个语句

select count(*),(concat(database(),floor(rand(0)*2)))x from users group by x;

既然后面的语句和中间的语句相同,所以上面语句中将中间语句加别名,后面直接用x代替,这样每次就只需要修改一个地方的语句就可以了

到这里floor报错注入漏洞就全部给大家介绍完了,有什么问题随时私信和评论都可以哦,希望能帮到你们

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

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

相关文章

mysql多表查询30个经典案例

mysql多表查询30个经典案例插入两张表一个dept一个emp插入dept表数据插入emp表数据1.列出每个部门里面有那些员工及部门名称;2.运维部门的收入总和;3.HR部入职员工的员工号4.财务部门收入超过5000元的员工姓名5.找出销售部收入最低的员工的入职时间;6.找…

5G NR标准: 第20章 5G的演进

第20章 5G的演进 NR 的第一个版本,第 15 版,侧重于对 eMBB 的基本支持,在某种程度上,URLLC.1 如前几章所述,第 15 版是为即将发布的 NR 未来发展构建的基础 . NR 演进将带来额外的功能并进一步提升性能。 附加功能不…

Netty原理示图

1. AWT事件驱动 2. Websocket协议 3. 基于多个反应器的多线程模式 4. Netty Reactor 工作架构图 5. Bootstrap引导过程 Channel Channel是Java NIO的基础。它表示一个开放的连接,进行IO操作。基本的 I/O 操作( bind() 、 connect() 、 read() 和 write(…

什么是异常?异常可以看作你敲出来的bug

异常异常的体系抛异常try -catchfinally自定义异常作为初学者,在刚开始写代码的时候,差不多写一行代码都要见一行红吧异常的体系 这里我们首先需要知道的一点是,所有的异常其实都是类。我们所有的异常都是继承于Throwable这个大类的&#xff…

喜讯!神策分析 Android SDK 入选数据安全“星熠”案例

随着《数据安全法》和《个人信息保护法》的相继出台实施,标志着数据安全保护法治时代的真正到来,国家对数据安全的重视达到了前所未有的高度。在此背景下,神策数据全面落地数据开发利用和数据安全领域的技术推广与产业创新,神策分…

有哪些视频素材网站值得推荐?

高质量视频素材网站,免费、可商用,建议收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 网站有超多视频素材,全部都是高清无水印,各种类型都有,像自然、城市、动物、科技、商业等等都…

【算法】哈希表

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

Unity3D打包Assetbundle丢失Shader问题

详情见:https://www.pianshen.com/article/5391338163/1、Unity3D在打包Assetbundle时,可能会遇到Shader丢失的问题,解决方法:打开Edit->Project Settings->Graphics,在Always Included Shaders列表添加上所需的…

微信小程序测试(简单项目测试)

Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性 什么是flex布局? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 任何一个容器都可以指…

小程序 - 起步:小程序的构成、宿主环境、协同工作和发布

小程序 - 起步:小程序的构成、宿主环境、协同工作和发布 Date: January 5, 2023 Sum: 小程序的构成、宿主环境、协同工作和发布 小程序简介 小程序与普通网页开发的区别 1. 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 2. API 不同 由于运行环境的不同…

P1308 [NOIP2011 普及组] 统计单词数————C++

题目 [NOIP2011 普及组] 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是&#xff1…

数字验证学习笔记——SystemVerilog芯片验证21 ——覆盖率类型

一、覆盖率类型 覆盖率是衡量设计验证完备性的一个通用词语。随着测试逐步覆盖各种合理的组合,仿真过程过程会慢慢勾画你的设计情况。覆盖率工具会在仿真过程中收集信息,然后进行后续处理并且得到覆盖率报告。通过这个报告找出覆盖之外的盲区&#xff0…

冒泡排序模拟qsort函数

欢迎来到 Claffic 的博客 💞💞💞 前言: 学习C语言,一般情况下都会接触到冒泡排序,你知道吗,用冒泡排序的思想可以模拟实现qsort函数(库函数的一种,可以实现快排&#xff…

图解面试题:经典50题!掌握这些题,面试也太简单了!

已知有如下4张表:学生表:student(学号,学生姓名,出生年月,性别)成绩表:score(学号,课程号,成绩)课程表:course(课程号,课程名称,教师号)教师表:teacher(教师号,教师姓名)1.汇总分析-查询学生的总成绩并进行排名/* 【知…

CSS基础知识(盒子模型)

继承上一篇CSS的三大特性的优先级继续讲解。 1.1优先级 优先级注意点: 权重是有4组数字组成的,但是不会有进位。可以理解为类选择器永远大于元素选择器,id选择器永远大于类选择器以此类推。等级判断从左向右,如果某一位数值相同…

前端学习之CSS基础

前言 html标签就不说了&#xff0c;这次学习CSS样式&#xff0c;就是美化html标签。 快速了解什么是css 普通标签&#xff1a; 加了css样式&#xff1a; <img src"https://static.runoob.com/images/icon/mobile-icon.png" style"height:100px" /&…

No module named ‘pycocotools’

网上搜了之后 按照网上的去做 全都无果 开始自己探索 原本我pycharm里选的环境是 python3.8 (pytorch)winR输入cmd进去后 输入 python –V返回的是本地python版本2.7 所以我当前系统python版本和我pycharm里选的不一样 然而pycocotools这个包本质上应该是安装在我pycharm里…

Referer;盗链;防盗链的工作原理

目录 Referrer-policy 如何设置referer 盗链 防盗链的工作原理 绕过图片防盗链 设置meta 设置referrerpolicy"no-referrer" 客户端在请求时修改header头部 利用https网站盗链http资源网站&#xff0c;refer不会发送 常见防盗链方法 利用nginx 服务器端判…

python基础语法一

一、变量 1.1、变量定义 变量就是可变的量&#xff0c;对于一些有可能会经常变化的数据&#xff0c;我们需要使用一个符号&#xff0c;这样才能计算中使 用它&#xff0c;就像我们在小学时学过的一元方程中的"x"一样。比如说&#xff0c;我们在控制台内输入&#xf…

Java 集合List接口介绍和使用

List接口的基本介绍 1.List接口是Collection的子接口 2.List中的元素都是有序的除了LinkedList。 一些实用的方法 1.add()添加元素 2.get()得到指定位置的元素 3.addAll&#xff08;&#xff09;追加一个List 4.indexOf&#xff08;&#xff09;返回元素的位置 5.remove…