【PortSwigger Academy】SQLi UNION 攻击 (确定列数)

本文仅用于技术研究,禁止用于非法用途。
Author:枷锁

本指南详细介绍了如何完成 PortSwigger Web Security Academy 中的 "SQL injection UNION attack, determining the number of columns returned by the query" 实验。

1. 实验信息

  • 实验名称:SQL injection UNION attack, determining the number of columns returned by the query
  • 难度:初级 (Apprentice)
  • 目标 :通过 UNION 攻击探测出原始查询结果中的列数。
  • 官方直达链接 :(注意要科学上网环境)点击访问实验页面

2. 核心原理:UNION 注入的前提条件

在进行 UNION 注入时,有两个核心规则必须遵守:

  1. 列数必须一致UNION 后面的查询(注入的部分)必须与 UNION 前面的查询(原始查询)具有相同数量的列。
  2. 数据类型必须兼容:对应列的数据类型必须相互兼容。

本实验的目标就是解决第一个问题:探测原始查询到底有多少列

探测方法 A:使用 ORDER BY

ORDER BY 子句可以指定按照第几列进行排序。

  • 如果我们尝试 ORDER BY 3 成功,说明至少有 3 列。
  • 如果我们尝试 ORDER BY 4 报错,说明原始查询只有 3 列。

探测方法 B:使用 UNION SELECT NULL

逐步增加 NULL 的数量,直到页面不再报错且显示正常。

  • UNION SELECT NULL-- (报错)
  • UNION SELECT NULL, NULL-- (报错)
  • UNION SELECT NULL, NULL, NULL-- (成功回显) -> 说明有 3 列。

3. 详细解题步骤

第一步:访问实验室并寻找注入点

  1. 点击实验页面的 "Access the lab"

  2. 进入实验室主页后,你会看到一个购物网站。

  3. 点击页面上的分类过滤器(例如点击 "Gifts" 或 "Accessories")。

  4. 观察 URL,你会看到类似:https://.../filter?category=Gifts

  5. 注入点就在 category 参数中。

第二步:使用 ORDER BY 法探测(推荐)

  1. 在 URL 末尾用hackbar工具添加 ' ORDER BY 1--,观察页面。

  2. 依次增加数字:

    • ' ORDER BY 1-- (正常)
    • ' ORDER BY 2-- (正常)
    • ' ORDER BY 3-- (正常)
    • ' ORDER BY 4-- (页面报错,显示 "Internal Server Error")
  3. 结论 :当数字为 4 时报错,说明原始查询只有 3 列。

第三步:使用 UNION SELECT NULL 法验证

为了完成实验,系统通常要求提交一个成功的 UNION SELECT 请求。

  1. 尝试输入:' UNION SELECT NULL, NULL, NULL--

  2. 结果:页面正常渲染,且可能在产品列表上方或下方多出了一个空行。

  3. 此时,实验上方应显示 "Congratulations, you solved the lab!"

4. Payload 深度解析

以最终成功的 Payload 为例:' UNION SELECT NULL, NULL, NULL--

符号 作用解析
' 闭合单引号 。闭合后端代码中 WHERE category = '...' 的左单引号。
UNION 联合查询关键字。告诉数据库将后面的查询结果合并到前面。
SELECT 选择关键字。开始我们的注入查询。
NULL 空值 。使用 NULL 是最稳妥的,因为 NULL 可以匹配任何数据类型(字符串、数字等)。
, 列分隔符
-- 注释符。注销掉后端代码中原本用于闭合的右单引号。

5. 常见问题排查

  1. 为什么不直接用数字 1, 2, 3?
    • 因为 UNION 要求类型兼容。如果第一列是整数,你输入 '1' 可能会报错;而 NULL 可以自适应任何类型。
  2. 注释符没生效?
    • 在某些环境下,-- 后面必须接一个空格。在 URL 中,你可以写成 --+ 或者 --%20
  3. 页面没变化?
    • 请确保你是在分类过滤器(Category Filter)的参数上进行注入,而不是主页 URL。

6. 防御方案

防止此类 UNION 攻击的最佳方案是:

  1. 参数化查询 (Prepared Statements):让数据库引擎将输入视为纯数据而非指令。
  2. 白名单校验 :对 category 参数仅允许预设的分类名称输入

宇宙级免责声明​​

🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨

1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。

2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。

3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。

4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。

5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。

6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。

7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:

✅ 先授权,再测试

✅ 只针对自己拥有或有权测试的系统

✅ 发现漏洞后,及时报告并协助修复

✅ 尊重隐私,不越界

⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。

希望这个教程对你有所帮助!记得负责任地进行安全测试。

相关推荐
1379号监听员_2 小时前
PID学习笔记
笔记·学习
qq_366086222 小时前
sql server多字段字符串模糊查询存在字段null值查询失效问题
数据库
无籽西瓜a2 小时前
详解Redis持久化:RDB、AOF与混合持久化
数据库·redis·缓存
人工智能知识库2 小时前
华为HCCDA-GaussDB题库(带详细解析)
数据库·华为·gaussdb·题库·hccda-gaussdb·hccda
齐 飞2 小时前
数据库批量插入耗时过长问题rewriteBatchedStatements=true
数据库·mysql
sg_knight2 小时前
SQL 中的 IFNULL 函数是什么?
数据库·sql·mysql·oracle·database·关系型数据库·db
WLDLSW2 小时前
MobaXterm如何设置鼠标中键或者右键粘贴
linux·服务器
如若1232 小时前
连接远程ARM服务器 (使用 SSH FS)
服务器·arm开发·ssh
m0_737302582 小时前
DPU全卸载技术,NVIDIA BlueField-3释放云服务器算力
服务器