首页 > 代码库 > 注入之mysql报错Floor报错分析

注入之mysql报错Floor报错分析

完整的payload:
http://www.xishaonian.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

简化后:select count(*),(floor(rand(0)*2))x from table order by x;


MYSQL官方文档指出rand和group by不能一起用,为啥不能够一起用呢?因为一个是随机的一个是排序的。你咋让随机的进行排序呢。是吧。所以是不行滴。floor注入也就是主要利用这一点。

(floor(rand(0)*2))x :

  • rand(0)*2 就是说取随机数0(该数字被称之为随机因子,如图一所示)乘2。floor是向下取正。
  • 本来rand(0)的值是:0.15522042769493574
  • 乘2以后是:0.3104408553898715
  • 向下取正以后就是0
  • 后面的x是别名,等价于 (floor(rand(0)*2)) as x;(如图二所示)
  • 所以得出:(floor(rand(0)*2))x会等于0(如图二所示)
  • 图一:技术分享

  • 图二:技术分享

那么都分析了还有一个count(*)还没分析呢。

count和group by 合在一起用就会建立一个虚拟表,来数(shǔ)数(shù)。
大概的虚拟表如下所示(其中key是主键,是不可以重复的)

技术分享

 


他首先会在自己内部自己创建一个虚拟的表,1代表有,0代表无。一、二、三、四、五.....如此数下去。数到最后也就0的就会结束。

(floor(rand()*2));出现的是0和1随机出现的,但(floor(rand(0)*2))出现的则是固定的为0 

技术分享技术分享

 

 

 

 

一篇相似的文章:http://www.2cto.com/article/201604/498394.html

注入之mysql报错Floor报错分析