上一篇文章我们了解了 SQL 注入的完整攻击流程知道了攻击者能够通过拼接恶意 SQL 语句影响数据库执行结果。今天继续学习 SQL 注入中最经典的一种利用方式UNION 联合查询注入。很多新手第一次真正获取数据库信息基本都是从 UNION 注入开始的。本文将带大家一步一步理解整个过程。一、什么是 UNION 联合查询在 SQL 中UNION 用于合并多个查询结果。例如sql SELECT username FROM users UNION SELECT name FROM admin;执行后text users表结果 admin表结果 一起返回。也就是说UNION 可以把两个查询结果拼接到同一个页面中显示。而攻击者正是利用这一点将自己的查询结果插入到正常页面中。二、漏洞产生原因假设网站存在如下代码sql SELECT * FROM news WHERE id1;用户访问text ?id1页面显示新闻内容。如果程序没有进行安全过滤攻击者输入text ?id1 UNION SELECT 1,2,3最终执行sql SELECT * FROM news WHERE id1 UNION SELECT 1,2,3;这样攻击者构造的数据就会出现在页面中。三、UNION注入完整利用流程整个流程其实非常固定掌握这个流程后大部分 UNION 注入场景都能理解。第一步判断字段数量为什么要判断字段数量因为UNION 两边列数必须一致。例如正常查询 sql SELECT id,title,content 返回3列。那么 UNION 后面也必须是3列。正确 sql UNION SELECT 1,2,3错误 sql UNION SELECT 1,2数据库会直接报错。因此攻击者首先需要确定字段数量。常见测试方法sql ORDER BY 1正常。sql ORDER BY 2正常。sql ORDER BY 3正常。sql ORDER BY 4报错。说明text 字段数 3第二步寻找回显位知道字段数量后开始寻找哪些字段会显示在页面上。构造sql UNION SELECT 1,2,3页面可能显示 text 新闻标题2 文章内容3说明 text 第二列回显 第三列回显这两个位置后续可以用来显示数据库信息。为什么叫回显位因为数据能够直接显示给攻击者看。攻击者后续获取的信息都会放在这里。第三步获取数据库名MySQL提供了sql database() 函数。作用获取当前数据库名称。例如sql UNION SELECT 1,database(),3页面显示text security说明数据库名称为text security第四步获取表名知道数据库名称后开始查询有哪些表。MySQL存在一个系统数据库text information_schema里面记录了所有数据库结构信息。查询表名sql UNION SELECT 1, table_name, 3 FROM information_schema.tables页面可能显示text users news admin orders这样就知道数据库有哪些表。第五步获取字段名假设发现text users表。接下来查看字段sql UNION SELECT 1, column_name, 3 FROM information_schema.columns页面显示text id username password email说明users表存在这些字段。第六步获取用户数据此时已经知道表text users字段text username password就可以查询数据sql UNION SELECT 1, username, password FROM users页面可能显示text admin 5f4dcc3b5aa765d61d8327deb882cf99攻击者便成功获取数据库中的数据。四、为什么很多靶场喜欢UNION注入因为它能帮助新手快速理解SQL语句执行逻辑数据库结构关系信息收集流程注入利用思路同时也是学习报错注入布尔盲注时间盲注之前最好的入门方式。五、学习时需要注意什么很多人学习 SQL 注入容易陷入一个误区背 Payload。例如sql UNION SELECT …sql ORDER BY …背了很多语句。但不知道为什么这么写。实际上更重要的是理解整个利用链路比记住某条语句更重要。
手把手带你理解 SQL 注入之 UNION 联合查询:从判断列数到获取数据
发布时间:2026/6/3 21:20:24
上一篇文章我们了解了 SQL 注入的完整攻击流程知道了攻击者能够通过拼接恶意 SQL 语句影响数据库执行结果。今天继续学习 SQL 注入中最经典的一种利用方式UNION 联合查询注入。很多新手第一次真正获取数据库信息基本都是从 UNION 注入开始的。本文将带大家一步一步理解整个过程。一、什么是 UNION 联合查询在 SQL 中UNION 用于合并多个查询结果。例如sql SELECT username FROM users UNION SELECT name FROM admin;执行后text users表结果 admin表结果 一起返回。也就是说UNION 可以把两个查询结果拼接到同一个页面中显示。而攻击者正是利用这一点将自己的查询结果插入到正常页面中。二、漏洞产生原因假设网站存在如下代码sql SELECT * FROM news WHERE id1;用户访问text ?id1页面显示新闻内容。如果程序没有进行安全过滤攻击者输入text ?id1 UNION SELECT 1,2,3最终执行sql SELECT * FROM news WHERE id1 UNION SELECT 1,2,3;这样攻击者构造的数据就会出现在页面中。三、UNION注入完整利用流程整个流程其实非常固定掌握这个流程后大部分 UNION 注入场景都能理解。第一步判断字段数量为什么要判断字段数量因为UNION 两边列数必须一致。例如正常查询 sql SELECT id,title,content 返回3列。那么 UNION 后面也必须是3列。正确 sql UNION SELECT 1,2,3错误 sql UNION SELECT 1,2数据库会直接报错。因此攻击者首先需要确定字段数量。常见测试方法sql ORDER BY 1正常。sql ORDER BY 2正常。sql ORDER BY 3正常。sql ORDER BY 4报错。说明text 字段数 3第二步寻找回显位知道字段数量后开始寻找哪些字段会显示在页面上。构造sql UNION SELECT 1,2,3页面可能显示 text 新闻标题2 文章内容3说明 text 第二列回显 第三列回显这两个位置后续可以用来显示数据库信息。为什么叫回显位因为数据能够直接显示给攻击者看。攻击者后续获取的信息都会放在这里。第三步获取数据库名MySQL提供了sql database() 函数。作用获取当前数据库名称。例如sql UNION SELECT 1,database(),3页面显示text security说明数据库名称为text security第四步获取表名知道数据库名称后开始查询有哪些表。MySQL存在一个系统数据库text information_schema里面记录了所有数据库结构信息。查询表名sql UNION SELECT 1, table_name, 3 FROM information_schema.tables页面可能显示text users news admin orders这样就知道数据库有哪些表。第五步获取字段名假设发现text users表。接下来查看字段sql UNION SELECT 1, column_name, 3 FROM information_schema.columns页面显示text id username password email说明users表存在这些字段。第六步获取用户数据此时已经知道表text users字段text username password就可以查询数据sql UNION SELECT 1, username, password FROM users页面可能显示text admin 5f4dcc3b5aa765d61d8327deb882cf99攻击者便成功获取数据库中的数据。四、为什么很多靶场喜欢UNION注入因为它能帮助新手快速理解SQL语句执行逻辑数据库结构关系信息收集流程注入利用思路同时也是学习报错注入布尔盲注时间盲注之前最好的入门方式。五、学习时需要注意什么很多人学习 SQL 注入容易陷入一个误区背 Payload。例如sql UNION SELECT …sql ORDER BY …背了很多语句。但不知道为什么这么写。实际上更重要的是理解整个利用链路比记住某条语句更重要。