报错注入

函数报错注入

MySQL在5.1.5版本后开始提供在XML文档中按照xpath语法来查询节点内容的函数extractvalue()和对查询到的节点内容进行修改操作的函数updatexml()。

语法如下:

extractvalue(xml文档对象,xml路径)

updatexml(xml文档对象,xml路径,替换内容)

可知,extractvalue()和updatexml()两个函数的第二个参数都是xml路径,都需要符合xpath语法,xml文档中查找字符位置使用"/xx/xx/xx"这种格式,如果写入其他格式就会触发报错并返回写入的非法格式的内容,也就是我们想要爆出的内容,这样就达到了我们的目的。

而如果正常查询格式正确,即使查询不到也不会报错。

双查询报错注入

group by ...——>分组语句 //将查询结果分类汇总

rand()——>随机数生成函数

floor()——>取整函数 //用来对生成的随机数取整

concat()——>连接字符串

count()——>统计函数 //结合group by语句统计分组后数据

子查询又称内部查询,子查询允许把一个查询嵌套在另一个查询中

rand()函数测试:

floor()+rand()函数测试:(floor()函数的作用是对参数进行取整操作,且取下不取上,如果只是rand()函数随机出来的数进行取整的话,恒为0,所以需要取整rand()*2)

结合子查询显示表users信息

因为表users中有13列,所以显示出的security+random number也有13列组合

而双查询报错注入原理就是利用count(*)对前面的返回数据进行统计,由于group by和随机数的原因,有可能会出现重复的键值,当键值重复时就会触发错误,然后报错,又因为子查询在错误发生之前就已经完成,所以子查询内容会随着报错信息一起显示出来。

报错数据库名

mysql> select count(*),concat((select database()),floor(rand()*2)) as a from information_schema.schemata group by a;

报错当前数据库下第一个表名

mysql> select count(*),concat((select concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),floor(rand()*2)) as a from information_schema.tables group by a;

group by 实际是将查询到的每列插入到临时表中,然后再排序。

通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(rand(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新数据;如果该key不在临时表中,则在临时表中插入key所在行的数据。group by floor(rand(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(rand(0)*2)可能为0,如果此时临时表中只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(rand(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。)

group by原理:

在执行group by语句时,MySQL会在内部建立一个虚拟表,用来储存列的数据,表中会有一个group_key值作为表的主键,这里的主键就是用来分类的value列中的数据,当查询数据时,取数据库数据,然后查看虚拟表中是否存在,不存在则插入新记录。

读取到第一行数据时,a不存在,将a放入主键列中,1放入id列

插入b,发现b也不存在,直接放进去

继续执行,发现重复value b,便其汇总

根据group by查询分类

加count(*)聚合函数:查看虚拟表是否存在该主键值,不存在插入新记录,存在则count()字段值+1

所以双查询报错关键就在这里,主要原因在于rand()函数在group by的过程中被触发了多次,使执行增加操作的主键与已有主键重复冲突,进行报错返回。

posted @ 2020-09-26 12:40  Ch3ckmat3  阅读(110)  评论(0编辑  收藏  举报