union 联合查询注入是一种常用的 SQL 注入方式。
- 0x00 场景
使用 union 联合查询注入查询出结果。
- 必须保证有数据的显示位。
- 并且 union 后连接的查询的字段数一致,列的数据类型转换没有问题。
- 0x01 介绍
- SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
- SQL UNION 语法
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
- SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
- MYSQL union 注入流程
Tips:善用 order by 子句 确定列数,通过 order by n 猜出的列数超过数据库表中的列数时,会报错并且不能返回数据。
- order by 确认列数。
- 观察页面回显,选择合适的字段位置进行下一步注入。
- 查基本信息(database()数据库名、version()数据库版本、user()用户名)
- 查库
- 查表
- 查字段
- 查数据
七个步骤层层深入到数据信息。
- 0x02 操作
Tips:要想避免正差数据干扰使 union 后你所执行的语句回显,需要使 union 前的查询语句查询为空或者报错从而执行 union 后的查询子句。
例如:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
原执行查询的语句插入的参数为 id ,这时候把原来插入的参数改为不存在的参数,比如 -1 ,那么 union 后的查询就能正常回显了。
URL: http://localhost/sqli-labs/Less-1/?id=1' union select 1,user(),3 --+
$sql="SELECT * FROM users WHERE id='1' union select 1,user(),3 --+' LIMIT 0,1";
URL: http://localhost/sqli-labs/Less-1/?id=-1' union select 1,user(),3 --+
$sql="SELECT * FROM users WHERE id='-1' union select 1,user(),3 --+' LIMIT 0,1";
Tips: ' 号使 union 前闭合成单独的子句从而形成完整的查询。
最后用 --+ 注释掉后面的 LIMIT。
原文作者:Keefe
原文链接:SQL 注入 union 联合查询注入
版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可