1.UNION介绍
union 操作符用于合并两个或多个SELECT语句的结果集
注:
- union 内部的 select 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,
每条select语句中的列的顺序必须相同。 - 默认情况,union 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
UNION注入应用场景
前提:
- 注入点页面有回显
- 只要UNION连接的几个查询的字段数一样,且列的数据类型转换没有问题,就可以查询出结果
注意的点:
- 只有最后一个SELECT子句允许有ORDER BY;
- 只有最后一个SELECT子句允许有LIMIT;
例:select * from users order by id union select 1,2,3; 会报错
UNION注入过程
- order by 确定列数
- 观察页面返回,选取可以显示数据的位置,进行下一步的注入
- 读库信息
- 读表信息
- 读字段
- 读数据
TIPS
-
为什么要使用order by 来确定字段数?
因为union操作符要求所有select 语句拥有相同的列,于是在注入中,select * from users where id = '1' union select 1,2,3--+ 后面注入的select要和前面的 select * 的字段数一样。于是就要先用order by 来确定前面的select用多少字段,然后构造相同的字段数在注入的select中 -
注入中为什么 id=-1' union select 1,2,3 --+ 中id=-1而不是1
答:如果id=1 那么页面返回结果就是id=1的值,id=1的值占据了后面注入的select的值的位置,导致无法显示,如果在数据库命令行中,两个结果都会返回。所以必须让前面的select语句的查询为空,这样才能显示后面注入的select语句 - select语句中可以嵌套select
select * from users where id=-1 union select 1,(select version()),3;
网友评论