sql注入-双查询报错注入

由 Miagz 发布

前言

本文章参考一篇大佬的文章

双查询报错注入

如果使用双查询注入的话需用到group by 语句与四个函数:

 1. group by ... ==>分组语句 //将查询的结果分类汇总
 2. rand()函数 ==> 生成随机数
 3. floor()函数 ==> 取整
 4. conncat()函数 ==> 连接字符
 5. count()函数 ==>统计数量 //之后结合group by 语句统计分组后的数据

概念

在讲解本篇文章时,得先了解下子查询的概念
子查询又称为内部查询,就是将一个查询语句嵌套在另一查询语句中,我们可以演示一下子查询是什么

我们此查询语句时,首先执行子查询语句,所以select database()先执行,然后我们就查询到了当前当前的数据库名"data",并且将其传给了concat()函数,concat()函数在对前面的字符"database:"进行连接,于是就得到了图中显示的结果

rand()函数

rand()函数其作用是生成一个大于0小于1的随机浮点数

floor()函数

floor()函数将传入的参数进行取整,由于rand()生成的值取整结果是能为0,所以我们得做一些处理,使其生成一个大于0小于2的随机整数,并对其取整

MYSQL> select floor(rand()*2);

接下来我们结合子查询,显示数据库的信息

mysql>select concat((select database()),floor(rand()*2)) from tab;

由于我这里的tab表里面只有4条数据,所以这里返回了四条数据

在实战注入中,我们不知道表名,一般都会使用information_schmea这个数据库进行猜解
其中information_schema.schemata中包含了整个数据库的库名,information_schema.tables中包含了整个数据库表名

我数据库中只有六个数据库,所以显示了六条数据

group by 语句

文章开头讲述了group by 语句是一个分组语句,就是将返回的数据进行分组处理

由于concat((select database()),floor(rand()*2))着实有点长,所以我就起了一个别名'a' 使后面使用Group by 时不用打那么长一串了,直接使用别名就行
上图将查询到的六条数据进行分组,将相同的分到一个组,最后返回了"data0"与"data1"这个条数据

上述的知识只是为下面的内容做铺垫,我们在一些注入过程中,时长会遇到网页无回显的环境,我们是看不到任何信息,难道要进行猜解字符,一个一个将那些字母猜解出来?
所以接下来我们进入正题,我们要利用count()函数和上面我们学到的操作,使mysql内部进行报错,然后通过错误提示信息获取得到我们想要的信息
在之前学到的mysql语句中增加一个聚合函数count(),构造语句如下:

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

我这里重复执行了三次上图的语句,前两次返回了正常,为什么第三次却出现了报错呢?
这里是利用count(*)对前面返回的数据进行统计,由于group by 和随机数的原因,有可能会出现重复的键值,当键值重复,就会触发错误,然后进行报错,由于子查询在错误发生前就已经执行完成,所以子查询就会随着报错信息一起显示出来

如果想了解双查询报错注入的原理的话 ----- sql注入--双查询报错注入原理探索


暂无评论

发表评论