闪退没由报错_关于floor()报错注入,你真的懂了吗?

0x01 简述

floor报错注入也有叫group报错注入的,都一样,指的都是他们。floor报错注入我想大多数人跟我一样,都是会用而不明白其中的原理。这个问题困扰了在下好长时间了,所以决定好好研究下,最终产出了这篇文章。

0x02 环境

介绍下我的测试环境:

MySQL版本:5.5.53

使用的数据库:security.users,这数据库是sqli-labs的,大家都很熟悉。

0x03 搞起

a46b331dcf581fe75986e6b6f48bb55c.png

咱就直接抛出常用的报错语句了,语句的利用格式相对固定,咱们一点一点的拆解,一点一点说。

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

61a2bf3998f102ce7922e3ff314ebdbe.png

它们表达的意思是一样的,第一个中的asx其实就是concat(database(),floor(rand(0)*2))的代指(别名),这两个SQL语句表达的意思并没什么区别。

来,让我们瞅瞅它报了什么错:

ERROR 1062 (23000): Duplicate entry ‘security1’ for key ‘group_key’

它说’group_key’的主键’security1’重复了,嗯?’security1’从哪里来的?哪个表的主键重复了?

36d9ffb76a081f2d8dcee32ce7a05e98.png

虽然刚开始,咱们还不知道原理,但是可以看到报错提示语句中的数据库函数已经被执行了。

就像我之前说的那样,我本身有用到sqli-labs的数据库,所以database()执行后是’security’很正常吧。

0x04 floor(rand(0)*2)

‘security1’中的1便是来自floor(rand(0)2),它说’security1’重复,那说明之前的表中已经有这个主键了。因为database()固定,我们继续来看下产生’1’的这个floor(rand(0)2)

rand()同样是一个数学函数,它返回一个随机浮点值[0,1]

751634ab920a5be374c24bc93368c68c.png

若指定一个整数参数N,则它被作用种子值(也被叫为随机因子),(rand()会根据这个种子值随机生成)用来产生重复序列,也就是rand(0)的值重复计算是固定的。

6e91c8ea564f9d56846a937b1cb84b7c.png

而它后面的*2,则是选定获取数据的范围[0,2],其实就是乘以2。

ad46eed0e2f096fced926b3d39647bd8.png

floor()同样是一个数学函数,返回不大于x的最大整数值,比如floor(3.3)返回3,floor(-3.3)返回-4。

81a7b507f3871c80479717311067f465.png

现在让我们看下计算users表数据的次数,floor(rand(0)*2)的值。

d617432d7f20645db5237925a0843e78.png

可以看到rand(0)的值确实是固定的。同时1也出现了。

concat()是字符串拼接函数,拼接多个字符串,如果字符串中含有NULL,则返回结果为NULL。这样来看,concat后的结果为’security0’或’security1’,’security1’出现了。

分析到这,我们后半部分没什么好说的了,rand()还有一个非常重要的特性我们之后跟group by一起说。

0x05 group by 与 count(*)

咱们再来说这个count(*),这是一个聚合函数,返回值的数目,它与count()的区别是它不排除NULL。

咱们通过select count(*) from users group by username;这个查询语句来了解下group by的工作过程。

539c4b0df5838cef8b08d8cb3a4a13aa.png1cfabc9a54300e01d46b8428a4705e76.png

group by在执行时,会依次取出查询表中的记录并创建一个临时表,group by的对象便是该临时表的主键。如果临时表中已经存在该主键,则将值加1,如果不存在,则将该主键插入到临时表中,注意是插入!

查询前创建的空临时表。

388a183b1b43fc4726fb49a4896ab850.png

取第一条记录,username是Dumb,发现临时表中没有该主键,则将Dumb插入到主键,count(*)值计1,取第二条记录。

317ac5a9359c10e64ddf0c552260655a.png

同样,取第二条记录,username为Angelina,同样没有该主键,则将Angelina插入到主键,count(*)值计1。

feebf9cf4be5eb979030cbdc4cbc5765.png

当取到原表中第8条admin时,同样将admin作为主键插入到临时表中,并将count()计1.当取第15条数据时,发现临时表中已经有admin作为主键了,则直接count()加1。最终结果:

01014c7bc30727a9d1a2203e36790b73.png

5b98f679e52425b31c1bac0350943c29.png

虽然在命令行中的显示结果跟咱的不太一样,但是思路是正确的(它貌似对结果按照字母进行了排序,又或者在插入临时表前就先进行了排序)。

写到这里,那按照上面的逻辑,报错语句应该是 select count(*) from users group by ‘security0’或’security1’;啊?!然后group by时创建临时表,第一个是security0,发现没有这个主键,此时将security0插入主键的位置,计1,然后取from表中的下一条记录。

fb3ab6e479df8aea25c0660f48bc47be.png

下一条是group by ‘security1’,临时表中不存在security1的主键,则将security1插入主键位置,计1,然后取下一条记录。

86f0cf87738bf39dd642f4dfa58bda90.png

之后group by 只有security0或security1,那应该只是计数上的变化了啊。最终应该是:

6d7d4dade834fafa3f1e587dd6e9705b.png

那为什么不是这个结果,反而报了主键重复的错误了呢?

因为还有一个最重要的特性,就是group by与rand()使用时,如果临时表中没有该主键,则在插入前rand()会再计算一次(也就是两次,但有些博客写的是多次,这个多次到底是几次并不知道,但是以两次来理解下面的实验都能说的通)。就是这个特性导致了主键重复并报错。我们来看:

当group by 取第一条from 表记录时,此时group by的是’security0’,发现临时表中并没有’security0’的主键,注意,这个时候rand(0)*2会再计算一次,经floor()后,率先插入临时表的主键不是security0,而是security1,并计数1。

369ab67b5b514d9527e66ac6f1f5a1b6.png

然后取第二条记录,第二条记录group by 的key中的01仍由floor(rand(0)2)继续计算获得,也就是security1。此时临时表中已经有security1的主键了,所以count()直接加1就可以。

1013c13aba05151adb28b195b0b427ca.png

继续从from的表中取第三条记录,再次计算floor(rand(0)2),结果为0,与database()拼接为security0,临时表的主键中并不存在,在插入前,floor(rand(0)2)又计算一次,拼接后与secruity1,但是是直接插入,即使临时表中已经有了主键security1也硬要插入,从而导致主键重复报错,也就是:ERROR 1062 (23000): Duplicate entry ‘security1’ for key ‘group_key’。

写道这里报错的原理已经说完了,不知道大家跟我呼应上了没,有没有感受到我的倔强及小宇宙。

0x06 优化

咱们继续看,咱们共从from的表中取了三条记录,因为floor(rand(0)2)的值为011011…,但其实第三次计算的1可以不要的,如果某个floor(rand(x)2)满足0101或1010,那么from的表中两条数据就是可以报错的。我经过多次实验,发现floor(rand(14)*2)的值为101000…,那么咱们创建一个有两条数据的表试一下看看。

f78bdbd104ce5f5f1f5b8d74d10b26c5.png

创建一个test表,里面只有两条数据。

2dbcd09bf6e7f9f68904e166c943e7f3.png

分别用rand(0)2和rand(14)2做实验。

362c2723be8c8052f90ae609a76f8d35.png

也就是说,在测试过程中,其实使用rand(14)*2更好一丢丢。如果from的表中只有一条数据的话floor()报错注入就没法用了,毕竟是重复,只插入一条数据怎么主键重复,对吧。

0x07 总结

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

参考链接:

https://www.freebuf.com/column/235496.html

http://8rr.co/8bjS

34868d0c0239fde49bbbdf07832fc760.gif

精彩推荐

c817f75c4ce2bb64069835bdf9b871f3.png96077982f23490250f2819808a89543c.png97d9e65065eb96eb4a2f9a709dd8ad46.png

418a80907f8717c7d57f8a85df82b86c.png

ab04595f705c57151876202026809e8e.png

f805e641d828445fb0216eb0d446fee8.png

1c63f2c9a9e1093d7109e8810159c283.gif

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

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

相关文章

Photoshop(CC2020)未完

基础知识: 概括: Adobe Photoshop,简称PS,是由美国Adobe Systems开发和发行的图像处理软件。属于再加工型软件,是对很多素材的再次加工处理,并非原创型软件。 功能:Photoshop主要处理以像素构成的位图图像…

使用 做签名的post_基础实操|使用jmeter对聊天软件进行接口测试

前言准备上架一款聊天app,上架之前准备做一些测试工作,模拟用户进入房间,维持心跳,房间送礼,发言等行为(因为用的第三方im以及声网,这些都是基于http的),也不是很懂测试,听老大说过一…

MySQL中主键的选择与磁盘性能

偶然看到了“Fotolog: Scaling the World\s Largest Photo Blogging Community”,才发现很多数据库的优化其实道理都很简单,至高境界是当你面对问题时,是否真正做出了自己的思考,而不仅仅只是经验主义的惯性使然:本文案…

matlab畸变校正代码_关于OpenCV中的去畸变

在opencv中,有关图像或像素点(角点)去畸变的函数有cv::undistort(),cv::getOptimalNewCameraMatrix(),cv::initUndistortRectifyMap(),remap(),cv::undistortPoints()。其中undistort可以直接对…

redis数据库简介、redis下载及安装(win64位)、node操作redis、redis实现短信校验注册接口

redis简介: 1:内存数据库,同时也能够保存数据到磁盘; 2:比其他的内存数据库有着更多的数据类型: 列表,集合,排序集合,哈希表等; 3:主从结构:数据可以备份到从服务器; 4: Redis数据操作速度快; 5:所有的操作都是原…

go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言你没看错,这里讲的就是 Go 中的泛型。只不过还没有正式发布,是基于草案设计的,已经是实现了可运行的版本。所以,泛型到来真的不远了&a…

bios设置_bios怎么设置显存 bios设置显存教程【图文】

有些用户可能会发现打开电脑系统信息窗口显示的内存容量与实际容量不同,例如系统内存显示4G,可用3.73G。那么不可用的那部分内存到哪里去了呢?其实是被集成显卡占用当做显存使用了。下面我们就通过 bios设置显存 来调整占用内存容量的大小,我…

4变形物体_Houdini基础(二)曲线变形物体

设想:先从二维上来看直角坐标系。物体是由x,y两个轴向的数据组成的。少了其中一组数据物体就只能是分布在单一轴向上的点。单独保留物体x、y情况下的点分布情况现在将x、y加起来,可见在三维空间中形成了一个平面。仅有x、y坐标的物体从目前的…

mybatis 映射成多个list_SSM:Mybatis架构与原理

MyBatis功能架构设计功能架构讲解:我们把Mybatis的功能架构分为三层:API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层&…

10无法勾选隐藏的项目_Excel超好用的隐藏操作,不可多得

日常工作中,表格数据的展示与隐藏也是有大学问的,为了表格更加简洁明了、美观大气,实用的隐藏技巧就派上用场了。且听小翼慢慢分享~1、隐藏行列方法1:选中目标区域,右击鼠标选择“隐藏”即可。如图:方法2&a…

HTML5简略介绍

今天要说下 HTML5特有的一个元素 canvas ,旨在让web页面上作矢量图不需要在依靠flash或是其他插件,在网页上使用canvas元素时,它会创建一块矩形区域,默认300*150,当然也是可以自定义的。Canvas中的坐标是从左上角开始的…

我的世界java和基岩版哪个好玩_我的世界:Java版本好玩还是基岩版好玩?老玩家看完后沉默了...

MC刚开始是在国外风靡了起来,传到中国的时候MC已经火了很久了,这时候外国已经出现了很多玩MC十分厉害的大神和主播,而在国外也有超多的服务器,其中有号称最强的原版生存服务器Scicraft,而在版本方面MC其实算下来大概有…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠,今天第一次在自己的项目中使用了下,感觉不是那么好,特别是SQL语句的支持度还是很欠缺,如limit等都不支持,还有特别单双引号都是需要特别注意的,下面是SQL S…

Windows下断言的类型及实现

一、内容综述 本文主要介绍Windows下断言assert的实现,并总结断言的不同应用准则。最后给出一个windows自定义断言的方法。 本文行文参考《Debugging Windows Programs》第三章相关内容,如果有兴趣的话建议读者可以深入阅读下。 二、断言的类型 1. ANSI…

linux右上角不显示网络连接_来体验下Linux吧

在前面的几期中我们从树莓派开始了解Linux,大家可能已经想来试一下手了。趁热打铁,本期我将介绍两种方便体验学习Linux的方法,在线体验或者安装虚拟机。1 在线体验Linux如果想快速的体验下Linux系统,我们可以选择云计算服务商提供…

python md5解密_python 生成文件MD5码

pymd5.py的代码如下: #-*-coding:utf-8-*-Created on 2012-5-25 author: kanpiaoxueimport hashlib import os import sys def printUsage(): print (Usage: [python] pymd5.py ) def createMD5(filePath): if not os.path.isfile(filePath): printUsage() else: tm…

Java数据结构、list集合、ArrayList集合、LinkedList集合、Vector集合

数据结构: 数据存储的常用结构有:栈、队列、数组、链表、红黑树。 栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操…

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”,是指将所有图元都先划到一个人眼看不到的“设备上下文”之上,最后再一次性复制到真正的屏幕DC之上,这样我们就看不到中间画的过程了,也就不会感到闪烁了。 注意,这时不能解除ScrolledWindow1的背景擦除…

Tomcat+JSP经典配置实例

经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题,于是总结了一下如何tomcat下配置jsp、servlet和ben,希望对那些初学者有所帮助。    一、开发环境配置    第一步:下载j2sdk和tomcat:到sun官方站&#xf…

python海龟编辑器画小汽车_【海龟编辑器下载】海龟编辑器(Python编辑器) v1.3.4 官方免费版-趣致软件园...

海龟编辑器是一款专为广大少儿打造的Python编辑器,该软件功能强大且使用便利,可以帮助孩子们以搭积木的方式来学习Python,并且支持Python代码和图形化积木的双向互相转译,不但可以有效提升孩子的学习兴趣,而且还能够降…