SQL注入之简单的联合查询实践

联合查询注入

1.注入前提

页面中有显示位

2.前置知识

union 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

说明:UNION 会去重 UNION ALL 不去重

select 的一些特性

1.select 之后可以接一串数字 如 1,2,3,abc 等等这些字符串 也不一定从小到大到, 也可以是重复的,想获取多少列就写几个

2.select语句在指明要查询的内容属性(如select id)后,要加from指明是从哪个数据库表中获得数据,在数据库环境中我们一般会先写一句use xxxdatabase,之后写select from语句直接加当前数据库中的表名就可以了。如果我们没有声明使用哪个数据库,也可以直接写 select xxxx from security.users(假设要从security数据库的users表中获取数据)。而select直接加数字串时,可以不写后面的表名,那么它输出的内容就是我们select后的数字,这时我们写的一串数字就是一个数组,这时select实际上没有向任何一个数据库查询数据,即查询命令不指向任何数据库的表。返回值就是我们输入的这个数组,这时它是个1行n列的表,表的属性名和值都是我们输入的数组

演示如下

 

3.操作过程

当我们通过 order by 判断了字段的个数,下一步我们就可以使用联合查询了。前面已经提到 联合查询 需要 两边的字段个数保持一致的,以下面的数据库为例,联合查询时可以在 union select 后面随便跟 3个用逗号隔开的字符或数字。我们现在需要判断的是,这个库中的哪些字段会回显到页面上。

下面是一个演示案例:

这是数据库中的信息。

 

这里直接在php中模拟注入吧。

第一次的查询语句为

@$sql = 'select * from tset where id=1';

 页面回显情况:

现在使用第二个查询语句

'select * from tset where id=1 union select 1,2,3';

 

页面回显情况:

 

这里就比较异或 ?? 不应该啊 回显没有变?

在数据库中直接查询 可以看到 这里会查询到两个结果,但页面为啥就显示一个呢?

 后来查了下源代码中

mysqli_fetch_array()函数

意思是只取一行结果,那后面的当然不会显示出来了

所以为了不必要的麻烦 一般会将 union 前面的查询结果为空,那么就可以输出 union 后的信息了。

这里把 sql2的语句改为 1 and 1=2 1=2是一个恒假的式子,所以前面的不会执行

再次查看页面回显 可以看到 回显已经改变了

接下将 回显位置改变为查询语句就可以了。这里不再演示。

参考博客:

SELECT 1,2,3...的含义及其在SQL注入中的用法_BUAA小细腿的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值