【union联合查询注入】

一、union的语法介绍

请添加图片描述
union 前面查询的是从user表里找到符合username='admin’的密码

union 后面的表用的是从schemata表里查询schema_name数据库,用来查询当前数据库下的数据库名

通过union可以可以将两条指令拼接在一起执行,并把结果放到一个结果集里,因此union拼接的命令查询结果,前后两个查询的列名可以不一样,但是列的数量必须一致

二、order by 语法介绍

请添加图片描述
我们通过下面的图可以发现有没有order by 查询的排序是不一样的,order by 起到了一个排序的作用。
请添加图片描述
如果我们加上了desc,就会起到一个降序的作用:
请添加图片描述
如果我们加上一个3,发现查询结果和最初的比起来没有变化,这个三呢代表的就是我们的第三列:
请添加图片描述
在sql注入中,我们可以用order by来判定表的数量,例如我们可以用order by 来排序第4行:
请添加图片描述
我们发现出现了一个错误,那么意味着如果order by 排序的列大于了表中列的数量就会报错

三、information_schema库

请添加图片描述

Schemata表

请添加图片描述
我们找到Schemata表里面的schema_name有四个数据,分别是四个数据库名
请添加图片描述

Tables表

请添加图片描述
例如上面的:

Select table_name from tables where table_schema=‘web’;

可以用来查询web数据库下的表名

Columns表

请添加图片描述
打开数据库看看发现能对应上:
请添加图片描述
请添加图片描述
上面的第二张图,web就是我们的数据库名,user是表名,username是列名

四、union 联合查询注入

注入流程

请添加图片描述

利用条件

请添加图片描述

注入过程

请添加图片描述

查找注入点

我们看到例题:
请添加图片描述
请添加图片描述
我们通过判断加上引号和去掉引号后的回显来判断,上图去掉引号,正常回显,加上引号,报错没有回显,我们就可以判断是数字型注入

测试列数

拿到注入点后就开始测试列数,我们用order by猜测一下有没有5列,没有回显报错了:
请添加图片描述
再猜1列,成功了,说明是有列数的:
请添加图片描述

二分法

我这里可以用二分法来猜测,什么是二分法:

就比如,我们先猜一个比较大的数5,再猜一个比较小的数1,最后把5+1/2=3,这样会更有效率,所有我们后面再猜一个3:
请添加图片描述
猜了三后没有报错,我们再把3+5/2=4,我们接着再猜4:
请添加图片描述
因为3是成功的4是报错的,所以这个表里只有三列数据

测试回显位

什么叫测回显位?我们刚刚拿到了三列数据,我们需要测试一下哪列数据会被输出到页面上,这里我们执行以下代码,回显的结果只有一个hello admin,这里我们分析一下为什么会导致这样的结果:
请添加图片描述
我们这里对语句进行一个拼接,并输入到数据库进行一个测试:
请添加图片描述
请添加图片描述
我们发现打印了两条数据,说明我们输入的数据是被执行了的,但是页面为什么没有回显足够的数据,我们查看源码发现,在执行了数据库操作后,使用fetch_assoc函数,它是取查询结果的第一条数据,也就是只会取admin这条数据,后面的123不会取:
请添加图片描述
那么我们只需要让前一条查询语句的查询结果为空,那么结果就只剩下了我们后面的查询结果:
请添加图片描述
我们进题目测试一下,我们把1改为-1,因为sql里面是没有-1这个id的,如果我们输入-1就会返回空结果,并且页面也成功回显了2,那么我们就可以知道页面回显位为第二列:
请添加图片描述

拿数据库名字

我们在第二列的位置加上database(),就能让页面回显出了数据库名,database()的作用就是显示当前数据库名
请添加图片描述
或者可以用information_schema库来拿数据库名
请添加图片描述
在执行后发现拿到的数据库名和我们刚刚的不一样变成了information_schema,我们分析一下是什么原因造成的:
请添加图片描述
我们把拼接后的语句直接放入sql执行,执行后出现了四个结果,但是我们的源码用了 fetch_assoc 只会取第一条结果,所以后面的三个语句没有被取到,至于这个如何解决后面会讲到,我们先用database()来获取表名:
请添加图片描述

拿表名

我们从information_schema.tables来拿表名,加上限制条件table_schema=‘web’ 指定web数据库,传入给table_name,得出表名:flag
请添加图片描述

拿列名

我们从information_schema.columns来拿表名,加上限制条件table_name=‘flag’ 指定flag表,传入给column_name,得出列名:flag
请添加图片描述

拿数据

直接指定flag 表里的 flag 列,页面成功回显了数据
请添加图片描述

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值