UNION是SQL注入中最稳定高效的攻击载体,因其天然适配多数漏洞场景:只需闭合原始查询即可拼接SELECT结果,无需执行权限、不触发WAF敏感词、兼容主流数据库,且通过ORDER BY试探列数、UNION SELECT验证回显位,实现高效数据回显。

UNION 是 SQL 注入中实际落地最稳、绕过能力最强的攻击载体,不是因为它“高级”,而是它天然适配多数漏洞场景的执行模型。
UNION 不需要执行权限就能回显数据
很多防御机制(比如 WAF 或简单关键词过滤)会拦 SELECT、INSERT、分号 ;,甚至 EXEC,但 UNION 本身是合法查询操作符,不触发存储过程、不写库、不改数据,只“拼结果”。只要原始查询可被闭合(比如用 ' 或 "),后面接 UNION SELECT 1,2,3 就能跑通。
- 数据库不会报语法错误,WAF 很难靠规则识别这是攻击
- 不需要
root权限,普通只读账号也能用 - 不像布尔盲注或时间盲注,它直接返回数据,效率高、反馈快
列数和类型约束反而成了可探测的突破口
UNION 要求左右两边 SELECT 的列数严格一致,否则报错:ERROR 1222 (21000): The used SELECT statements have a different number of columns。这个“报错”在开发环境或调试模式下,反而是攻击者最想要的信号。
- 用
ORDER BY N试探:从ORDER BY 1一路试到报错,最大不报错的N就是原查询列数 - 用
UNION SELECT 1,2,3,...N验证回显位置,页面上哪个数字出现,就说明对应列被渲染出来了 - 类型不匹配时,MySQL 常用隐式转换兜底;稳妥做法是全用字符串,比如
CONCAT('a',user())或CAST(version() AS CHAR)
UNION 在真实漏洞链中几乎不可替代
其他注入方式(如报错注入、堆叠注入)依赖特定函数(extractvalue、updatexml)或数据库配置(mysqli_multi_query 开启),而 UNION 是 SQL 标准语法,MySQL、PostgreSQL、Oracle 全支持,且只要后端拼接用户输入、没参数化,基本都能打。
-
$queryRawUnsafe这类 Prisma 接口等于直接放行,' UNION SELECT user(), database() --会被原样执行 - 即使过滤了
UNION关键字,大小写变形(UnIoN)、空格绕过(UNI/**/ON)、注释切割(UNION/*a*/SELECT)仍可能生效 - 相比
SELECT单独出现,UNION SELECT组合更难被正则黑白名单精准拦截
真正难的不是构造 payload,而是当错误提示被关闭、回显被过滤、字段类型强校验时,怎么把 UNION 的“列数对齐”和“类型兜底”做扎实——这两点漏掉一个,整个注入链就断在第一步。

















