zoukankan      html  css  js  c++  java
  • mysql的floor()报错注入方法详细分析

    刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句。在此做个总结。
    (更好的阅读体验可访问 这里 )

    首先,只要该语句明白了,那么类似select count(*),(floor(rand(0)*2))x from table group by x;这样的变形语句基本上都可以变通(这里只是起了个别名)。
    基本的查询 select 不必多说,剩下的几个关键字有 count 、group by 、floor、rand。

    几个关键函数的说明

    rand(0)*2

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

    可见,每次产生的都不一样。当我们提供一个种子参数 0 后,再次查看:

    可以发现,每次产生的值都是一样的。也可以称之为伪随机(产生的数据都是可预知的)。
    查看多个数据看一下。( test 是我之前创建的一个拥有9条数据的表)

    发现第一条数据与刚才查看的单个数据相符合,其它的数据也完全一样。
    为什么要乘以 2 呢?这就要配合 floor 函数来说了。

    floor(rand(0)*2)

    floor() 返回小于等于该值的最大整数。
    之前我们了解到,rand() 是返回 0 到 1 之间的随机数,那么乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1。

    为什么需要这两个数呢?

    group by 与 count(*)

    group by 主要用来对数据进行分组(相同的分为一组),这里与count() 结合使用。举个例子就一目了然了。

    可以观察到,这里对重复性数据进行了整合,然后计数。

    重点来了,也就是在这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。
    经过网上查询,发现mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count(*)。也就对应于上个截图中的 prod_price 和 count(*)。
    然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。

    报错分析

    rand()的特殊性

    select count(*) from test group by floor(rand(0)*2);
    

    而又因为 rand 函数的特殊性(如果使用rand()的话,该值会被计算多次)。
    在这里的意思就是,group by 进行分组时,floor(rand(0)*2)执行一次(查看分组是否存在),如果虚拟表中不存在该分组,那么在插入新分组的时候 floor(rand(0)*2) 就又计算了一次。(其实在上述 rand(0) 产生多个数据的时候,也能观察出来。只要 rand(0) 被调用,一定会产生新值)。

    这样,所有的理论细节就全部明朗了。

    报错

    还记得我们之前产生的疑问,为什么要用 floor(rand(0)*2 产生 0 和 1 这两个数吗?

    当 group by 对其进行分组的时候,首先遇到第一个值 0 ,发现 0 不存在,于是需要插入分组,就在这时,floor(rand(0)*2)再次被触发,生成第二个值 1 ,因此最终插入虚拟表的也就是第二个值 1 ;然后遇到第三个值 1 ,因为已经存在分组 1 了,就直接计数加1(这时1的计数变为2);遇到第四个值 0 的时候,发现 0 不存在,于是又需要插入新分组,然后floor(rand(0)*2)又被触发,生成第五个值 1 ,因此这时还是往虚拟表里插入分组 1 ,但是,分组 1 已经存在了!所以报错!

    总结

    可见,floor(rand(0)*2的作用就是产生预知的数字序列01101,然后再利用 rand() 的特殊性和group by的虚拟表,最终引起了报错。

    参考:Mysql报错注入原理分析(count()、rand()、group by)

  • 相关阅读:
    css中盒模型的理解与整理
    Java从入门到精通——数据库篇Mongo DB GridFS文件系统
    Java从入门到精通——数据库篇Mongo DB 导出,导入,备份
    Java从入门到精通——数据库篇Mongo DB 安装启动及配置详解
    MySQL基于mysqldump快速搭建从库
    Linux下C语言操作MySQL数据库
    html dl dt dd 标签语法与使用
    人的一切痛苦,本质上都是对自己的无能的愤怒
    游泳健康好处多
    从疲劳到猝死只需6步!
  • 原文地址:https://www.cnblogs.com/sfriend/p/11365999.html
Copyright © 2011-2022 走看看