Mysql报错sql注入原理

通常有错误回显的注入可以用如下语句执行查询

1 union select 1 from(select count(*),concat(floor(rand(0)*2),(select+user() from information_schema.tables limit 0,1))a from information_schema.tables+group+by+a)b #

报错的关键语句是下面这句

SELECT count(1),concat(round(rand(0)),(SELECT concat(user,0x23,password) FROM MySQL.user LIMIT 0,1))a FROM information_schema.tables GROUP by a

最终是由于group by会创建一个临时表,然后插入数据插入的时候重复出现这个错误,原因如下(是来自网上的解释)


通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1。
group by key的原理是循环读取数据的每一行,将结果保存于临时表中。

读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;如果该key不存在于临时表中,则在临时表中插入key所在行的数据。

group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。
即检测时和插入时两次计算了随机数的值。