?

利用 select count(*),(floor(rand(0)*2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

基本的查询 select 不必多说,剩下的几个关键字有 count 、group by 、floor、rand。

二、关键函数说明

?

1.rand函数

rand() 可以产生一个在0和1之间的随机数。

可见,直接使用rand函数每次产生的数都不同,但是当提供了一个固定的随机数的种子0之后:

每次产生的值都是一样的。也可以称之为伪随机(产生的数据都是可预知的)。

查看多个数据看一下。(users是一个有6行数据的表)

这样第一次产生的随机数和第二次完全一样,也就是可以预测的。

利用的时候rand(0)*2为什么要乘以 2 呢?这就要配合 floor 函数来说了。

?

2.floor(rand(0)*2)函数

floor() 函数的作用就是返回小于等于括号内该值的最大整数。

而rand() 是返回 0 到 1 之间的随机数,那么floor(rand(0))产生的数就只是0,这样就不能实现报错的:

而rand产生的数乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1:

并且根据固定的随机数种子0,他每次产生的随机数列都是相同的0 1 1 0 1 1。

?

3.group by 函数

group by 主要用来对数据进行分组(相同的分为一组)。

还是按照下表进行实验

首先我们在查询的时候是可以使用as用其他的名字代替显示的:

但是在实际中可以缺省as直接查询,显示的结果是一样的:

然后就可以用group by函数进行分组,并按照x进行排序

注意:最后x这列中显示的每一类只有一次,前面的a的是第一次出现的id值

?

?

4.count(*)函数

count(*)统计结果的记录数。

这里与group by结合使用看一下:

这里就是对重复性的数据进行了整合,然后计数,后面的x就是每一类的数量。

?

5.综合使用产生报错:

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

根据前面函数,这句话就是统计后面产生随机数的种类并计算每种数量。

分别产生0 1 1 0 1 1 ,这样0是2个,1是4个,但是最后却产生了报错。

?

三、报错分析

?

这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。

首先mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count(*)。也就对应于实验中的 user_name 和 count(*)。

然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。

然后mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个"被计算多次"到底是什么意思,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)*2)报错的过程就知道了,从上面的函数使用中可以看到在一次多记录的查询过程中floor(rand(0)*2)的值是定性的,为011011 (这个顺序很重要),报错实际上就是floor(rand(0)*2)被计算多次导致的,我们还原一下具体的查询过程:

?

(1)查询前默认会建立空虚拟表如下图:

(2)取第一条记录,执行floor(rand(0)*2),发现结果为0(第一次计算),

(3)查询虚拟表,发现0的键值不存在,则插入新的键值的时候floor(rand(0)*2)会被再计算一次,结果为1(第二次计算),插入虚表,这时第一条记录查询完毕,如下图:

(4)查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算)

(5)查询虚表,发现1的键值存在,所以floor(rand(0)*2)不会被计算第二次,直接count(*)加1,第二条记录查询完毕,结果如下:

(6)查询第三条记录,再次计算floor(rand(0)*2),发现结果为0(第4次计算)

(7)查询虚表,发现键值没有0,则数据库尝试插入一条新的数据,在插入数据时floor(rand(0)*2)被再次计算,作为虚表的主键,其值为1(第5次计算),

然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了。

?

四、总结

?

整个查询过程floor(rand(0)*2)被计算了5次,查询原数据表3次,所以这就是为什么数据表中需要最少3条数据,使用该语句才会报错的原因。

另外,要注意加入随机数种子的问题,如果没加入随机数种子或者加入其他的数,那么floor(rand()*2)产生的序列是不可测的,这样可能会出现正常插入的情况。最重要的是前面几条记录查询后不能让虚表存在0,1键值,如果存在了,那无论多少条记录,也都没办法报错,因为floor(rand()*2)不会再被计算做为虚表的键值,这也就是为什么不加随机因子有时候会报错,有时候不会报错的原因。

比如下面用1作为随机数种子,就不会产生报错:

Mysql报错注入之floor报错详解

标签:图片   序列   排序   style   顺序   虚拟   查看   key   中间

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/hzk001/p/12799223.html

mysql中floor的用法_Mysql报错注入之floor报错详解相关推荐

  1. mysql中去重的用法_mysql中去重 distinct 用法

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...

  2. mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法

    Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...

  3. mysql中merge的用法_mysql中merge表存儲引擎用法介紹

    mysql中merge表存儲引擎用法介紹: mysql的merge引擎類型允許你把許多結構相同的表合並為一個表.然后,你可以執行查詢,從多個表返回的結果就像從一個表返回的結果一樣.每一個合並的表必須有 ...

  4. mysql中declare语句用法_MySQL declare语句用法介绍

    MySQL declare语句是我们经常用到的语句,下文就为您举例说明了MySQL declare语句的用法,希望对您学习MySQL declare语句的使用能有所帮助. MySQL declare语 ...

  5. mysql中正则表达式的用法_mysql之正则表达式的用法

    正则表达式用来匹配文本的特殊字符集合 格式:在where查询中使用regexp关键字,后面接正则表达式字符 正则表达式与like的区别 like匹配整列数据 regexp可以匹配列中任意位置的字符,更 ...

  6. mysql中field的用法_MySQL FIELD()用法及代碼示例

    FIELD(): 此函數有助於返回值在給定值列表中的位置.如果用戶將字符串值作為FIELD()函數的參數傳遞,則搜索將作為字符串值執行.並且,如果用戶將數字值作為FIELD()函數的參數傳遞,則搜索將 ...

  7. mysql中declare语句用法_mysql declare怎么用

    Q4:mysql declare cursor只能放在前面吗 本文中介绍了一个MySQL的存储过程,其中涉及Cursor的使用 示例如下: 复制代码 代码如下: CREATE PROCEDURE `j ...

  8. mysql数据库truncate 夯住_MySQL如何优雅的删除大表实例详解

    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候.这样一条命令下去,MySQ ...

  9. mysql数据库 or的用法_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  10. MySQL中show命令用法大全

    MySQL中show命令用法大全 官方文档:https://dev.mysql.com/doc/refman/5.6/en/show.html https://dev.mysql.com/doc/re ...

最新文章

  1. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
  2. sql server 2008学习7 规范化和其他基本设计问题
  3. Linux上调整sshd进程的优先级
  4. access自动自动累计余额_【大招来临】—— 真 自动化财务报告
  5. 【算法基础】常用的数据结构与算法
  6. 人生财富值得珍藏的文字
  7. linux shutdown 命令 关机 重启
  8. 机器学习笔记(二)——多变量最小二乘法
  9. ant 彻底了解(转)
  10. Vue项目中使用浏览器同步测试工具 browersync
  11. 使用python原生态的min和max函数实现升序排序和降序排序
  12. 一款Java开源的Springboot即时通讯 IM,附源码
  13. mysql主从怎么确保数据一致_如何保证主从复制数据一致性
  14. mac电脑投屏到小米盒子_苹果手机,小米盒子投屏,连接不上,什么情况?
  15. dbt2 mysql_mysql dbt2 benchmark Centos6下安装配置
  16. 永远不要使用 Boolean 对象
  17. 嵌入式之uboot源码分析-启动第一阶段学习笔记
  18. T480s安装Ubuntu16
  19. 示波器观察IIC通讯协议-STM32F4读写24C08EEPROM时序图-新人首更
  20. char、int、long它们各占几个字节?占几位?

热门文章

  1. Liunx free命令
  2. 大数据技术基础与应用
  3. 百度K站之前兆与解决方案的另类分析
  4. filebeat7.7.0相关详细配置预览- processors - add_fields
  5. 关键词拍卖竞价机制,排序与计费规则
  6. 高通IPQ5018 IPQ6010 刷机步骤
  7. 【高数】【本科笔记】【第七章 微分方程】【7.2 可分离变量的微分方程】
  8. 云计算时代,NGINX将是你的“必杀技”
  9. jQuery浮出广告插件带关闭
  10. 计算机网络操作技师论文,关于计算机操作技师论文计算机操作技师论文:计算机网络技术专业技师培养过程思考.doc...