地板()报错注入的原因是什么

  介绍

小编给大家分享一地板()报下错注入的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

0 x01简述

楼报错注入也有叫集团报错注入的,都一样,指的都是他们.floor报错注入我想大多数人跟我一样,都是会用而不明白其中的原理。

0 x02环境

介绍下我的测试环境:

MySQL版本:5.5.53

使用的数据库:安全。用户,这数据库是sqli-labs的,大家都很熟悉。

0 x03搞起

地板()报错注入的原因是什么

咱就直接抛出常用的报错语句了,语句的利用格式相对固定,咱们一点一点的拆解,一点一点说。

select count(*)从用户组concat(数据库(),地板(兰德(0)* 2));

select count (*), concat(数据库(),地板(兰德(0)* 2))从用户组x;

地板()报错注入的原因是什么

它们表达的意思是一样的,第一个中的<代码>   x 其实就是<代码> concat(数据库(),地板(兰德(0)* 2))>

来,让我们瞅瞅它报了什么错:

错误1062(23000):重复条目& # 39;security1& # 39;for key 'group_key'

它说'group_key'的主键'security1'重复了,嗯?'security1'从哪里来的?哪个表的主键重复了?

floor()报错注入的原因是什么

虽然刚开始,咱们还不知道原理,但是可以看到报错提示语句中的数据库函数已经被执行了。

就像我之前说的那样,我本身有用到sqli-labs的数据库,所以database()执行后是'security'很正常吧。

0x04 floor(rand(0)*2)

'security1'中的1便是来自floor(rand(0)*2),它说'security1'重复,那说明之前的表中已经有这个主键了。因为database()固定,我们继续来看下产生'1'的这个floor(rand(0)*2)

rand()同样是一个数学函数,它返回一个随机浮点值[0,1]

floor()报错注入的原因是什么

若指定一个整数参数N,则它被作用种子值(也被叫为随机因子),(rand()会根据这个种子值随机生成)用来产生重复序列,也就是rand(0)的值重复计算是固定的。

floor()报错注入的原因是什么

而它后面的*2,则是选定获取数据的范围[0,2],其实就是乘以2。

floor()报错注入的原因是什么

floor()同样是一个数学函数,返回不大于x的最大整数值,比如floor(3.3)返回3,floor(-3.3)返回-4。

floor()报错注入的原因是什么

现在让我们看下计算users表数据的次数,floor(rand(0)*2)的值。

floor()报错注入的原因是什么

可以看到rand(0)的值确实是固定的。同时1也出现了。

concat()是字符串拼接函数,拼接多个字符串,如果字符串中含有NULL,则返回结果为NULL。这样来看,concat后的结果为'security0'或'security1','security1'出现了。

分析到这,我们后半部分没什么好说的了,rand()还有一个非常重要的特性我们之后跟group by一起说。

0x05 group by 与 count(*)

咱们再来说这个count(*),这是一个聚合函数,返回值的数目,它与count()的区别是它不排除NULL。

咱们通过select count(*) from users group by username;这个查询语句来了解下group by的工作过程。

floor()报错注入的原因是什么floor()报错注入的原因是什么

group by在执行时,会依次取出查询表中的记录并创建一个临时表,group by的对象便是该临时表的主键。如果临时表中已经存在该主键,则将值加1,如果不存在,则将该主键插入到临时表中,注意是插入!

查询前创建的空临时表。

floor()报错注入的原因是什么

地板()报错注入的原因是什么