查看web时可以直接检索关键字,如cmd,就是直接执行系统命令这种的。
select count(*),floor(rand(0)*2) x from information_schema.character_sets group by x;
rand(0)
随机输出0~1间的浮点数
select rand(0) from information_schema.schemata;
rand(0)*2
随机输出0~2间的浮点数
select rand(0)*2 from information_schema.schemata;
floor(rand(0)*2)
将随机输出的浮点数取整
select floor(rand(0)*2) from information_schema.schemata;
count(*)
统计输出数目
select count(*),floor(rand(0)*2) from information_schema.schemata;
select floor(rand(0)*2)a from information_schema.schemata;
字段名
group by a
对a列分类汇总
select floor(rand(0)*2)a from information_schema.schemata group by a;
报错原因分析:
本质:
group by语句的报错。
group by语句报错的原因:
floor(rand(0)*2)的不确定性,即可能为0也可能为1。
group by key 执行时循环读取数据的每一行,将结果保存于临时表中。
读取每一个行key时:
如果key存在于临时表中,则更新临时表中的数据(不再计算rand值)。
如果key不存在于临时表中,则在临时表中插入key所在行的数据(再次计算rand值)。
假设此时临时表只有key为1的行,不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插入时要再次计算rand值,此时floor(rand(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时都计算了rand值。
实际测试中发现,出现报错至少要求数据记录为3行,记录数超过3行一定会报错,2行时是不报错的。
利用concat将报错的key和我们想要注入的语句一并执行输出,达到报错回显的效果。
利用floor函数进行报错时只能爆一行结果,group_concat函数不适用于此报错函数。
可以利用limit 0,1逐行遍历。