PortSwigger SQL注入LAB3

📅 2026/6/24 9:43:21
PortSwigger SQL注入LAB3
库类型与版本信息并在页面中回显版本字符串。通过该实验可以理解UNION 注入攻击的基本流程——包括判断注入点、探测原始查询的列数、使用 NULL 占位符对齐列数以及如何针对 Oracle 数据库的系统视图如v$version构造查询语句以获取系统信息。【实验目标】该实验的产品类别过滤器中存在 SQL 注入漏洞。利用该漏洞使用 UNION 攻击获取数据库版本字符串。1. 启动实验环境与 Burp Suite启动实验环境后可以看到与前几个 LAB 相似的购物页面。本次实验的注入点位于页面中的产品类别过滤器。接下来启动 Burp Suite进入Proxy模块下的HTTP history子页面。当浏览器中的代理配置生效后此处将开始记录所有 HTTP 流量。确认注入点位于过滤器后就可以直接开始抓取并分析请求。2. 开启代理并抓取过滤请求启用浏览器中已配置好的 Burp Suite 代理准备捕获过滤器请求。先随意点击一个分类选项观察 Burp Suite 中捕获到的数据根据路径特征/filter?category...可以快速锁定产品类别过滤器对应的请求记录。接下来我们右键将它发送至Repeater模块以便后续进行重放与修改测试。3. 分析请求数据并推测后端 SQL 逻辑该请求是 GET 参数注入场景核心请求行为可概括为GET /filter?categoryPets HTTP/2。据此可推测后端可能执行类似查询SELECT * FROM products WHERE category Pets4. 构造注入攻击4.1 定位注入点要破坏上述查询语句的原有逻辑可先像之前一样利用单引号测试字符串边界。尝试在Pets后追加一个单引号则查询可能变为SELECT * FROM products WHERE category Pets这会触发 SQL 语法错误。我们在 Repeater 中将category的值改为Pets并发送请求服务器返回500 Internal Server Error说明单引号被带入 SQL 语句并破坏语法注入点得到确认。4.2 为什么不能直接写 UNION题目已给出目标数据库为Oracle因此我们需要注入类似SELECT banner FROM v$version的查询。但不能直接写成 UNION SELECT banner FROM v$version --原因是UNION 两侧 SELECT 的列数必须一致。若列数不一致数据库会报错。4.3 什么是“列”在数据库表中列column就是字段。比如下面这个建表示例中id、name、age就是 3 列CREATE TABLE student ( id INT, name VARCHAR(20), age INT );回到本实验后端查询里使用了SELECT *表示取出该表的所有列。UNION 注入时右侧SELECT必须返回相同列数否则会报错。4.4 使用 ORDER BY 探测列数由于无法直接看到后端查询列数我们可以用ORDER BY n逐步探测先尝试 ORDER BY 1--再尝试 ORDER BY 2--继续尝试 ORDER BY 3--...当某个 n 导致报错时说明该位置超出列范围列数即为n-1。在本实验中当ORDER BY 3报错说明原查询共有2 列。因此 UNION 语句也必须返回 2 列。4.5 对齐列数并读取版本信息既然目标查询需要 2 列那么可以用NULL作为占位构造如下 UNION 语句SELECT * FROM products WHERE category UNION SELECT NULL, banner FROM v$version --4.6 构造最终 Payload各组成部分的作用如下闭合原 SQL 字符串。UNION SELECT拼接注入查询结果。NULL, banner对齐 2 列并让版本信息出现在可回显列中。FROM v$version读取 Oracle 版本信息。--注释掉原查询后续内容。最终可使用的请求示例GET /filter?category UNION SELECT NULL,banner FROM v$version-- HTTP/24.7 执行攻击请求在 Repeater 中将category参数修改为 UNION SELECT NULL,banner FROM v$version--点击Send发送返回200 OK说明语法层面可执行。随后切换到浏览器访问对应 URL可以看到页面成功回显数据库版本字符串右上角也显示LAB Solved实验目标达成。【本题最终 Payload】 UNION SELECT NULL,banner FROM v$version--5. 总结与防御建议本实验是一次典型的基于 UNION 联合查询的 SQL 注入攻击。其根本成因包括产品类别过滤器参数被直接拼接到 SQL 语句中未做安全处理应用将数据库错误直接回显给客户端为列数探测提供反馈未采用参数化查询Prepared Statement或 ORM 安全接口。防御措施参数化查询—— 将 SQL 代码与用户数据彻底分离