联合查询注入
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是一个恒假的式子,所以前面的不会执行
再次查看页面回显 可以看到 回显已经改变了
接下将 回显位置改变为查询语句就可以了。这里不再演示。
参考博客: