完整的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
时间: 2024-11-08 22:36:12