【Web实战】Oracle注入专题——注入注意点+排序注入绕过实战之踩坑篇
字数 1525 2025-08-10 08:28:37

Oracle注入专题:注入注意点与排序注入绕过实战

一、Oracle注入基础

1. Oracle数据库注入特点

Oracle数据库在注入过程中有以下重要特点:

  • 数据类型敏感:必须在字符型字段使用字符型数据,整型字段使用整型数据
  • 语法严格:相比MySQL更为严格,注释和函数使用有特殊要求
  • 系统表结构特殊:需要了解Oracle特有的系统表和视图

2. Oracle与MySQL注入关键区别

特性 Oracle MySQL
注释 -- 可用,# 不可用 #-- 都可用
数据类型 严格区分字符型和整型 类型转换较灵活
系统表 v$version, user_tables information_schema
虚拟表 需要 from dual 不需要虚拟表
延时函数 dbms_pipe.receive_message() sleep()

二、Oracle注入实战技巧

1. 数据类型判断与利用

判断字段类型方法

' union select 1,2 from dual--  -- 如果报错提示类型不匹配
' union select '1','2' from dual--  -- 如果成功则说明是字符型字段

实际案例

6340d33754bf402798a6051733698a3c'+union+select+'1','2'+from+dual--

2. 常用Oracle注入函数

获取数据库信息

-- 获取版本信息
select banner from sys.v_$version where rownum=1

-- 获取当前数据库
select instance_name from V$INSTANCE

-- 获取第一个表名
select table_name from user_tables where rownum=1

延时注入

dbms_pipe.receive_message('RDS',5)  -- 延时5秒

3. 报错注入利用

-- 使用exp函数(数值大于709会报错)
asc,exp(710)

-- 使用updatexml报错
desc,updatexml(1,concat(0x7e,(database()),0x7e),1)

三、Oracle排序注入实战

1. 排序注入原理

Web应用中排序功能通常使用SQL的ORDER BY实现:

SELECT * FROM users ORDER BY 1 desc/asc

当排序参数可控时,可在desc/asc位置注入恶意代码。

2. 排序注入检测流程

第一步:判断注入点

  • 测试参数对'"/0/1的响应
  • 观察是否影响返回结果

第二步:判断数据库类型

  • 测试#--哪个能作为注释
  • Java站点+#不可用+--可用 → 可能是Oracle

第三步:验证注入

  • 使用Oracle特有函数验证:
asc,exp(710)  -- 测试报错
asc,DBMS_PIPE.RECEIVE_MESSAGE('RDS',1)  -- 测试延时

3. 绕过WAF技巧

Oracle与MySQL绕过差异

  • MySQL中可使用多行注释加垃圾字符绕过:
sleep/*大量垃圾字符*/(1)
  • Oracle中这种绕过方式通常无效,语法要求更严格

有效绕过方法

  • 使用Oracle特有函数如DBMS_PIPE.RECEIVE_MESSAGE
  • 避免使用被拦截的关键字,寻找替代方案

四、实战踩坑与解决方案

1. 常见错误

  1. 数据库类型误判

    • 误将Oracle当作MySQL进行注入
    • 解决方案:通过注释符和特有函数准确判断
  2. 数据类型不匹配

    • 在字符型字段使用整型数据
    • 解决方案:添加引号转为字符型
  3. WAF绕过方法不当

    • 使用MySQL的绕过技巧在Oracle中无效
    • 解决方案:使用Oracle特有的函数和方法

2. 有效解决方案

  1. 准确判断数据库类型

    • 测试#--哪个能作为注释
    • 测试特有函数如dbms_pipe.receive_message
  2. 正确处理数据类型

    • union select 1,2报错时尝试union select '1','2'
  3. 使用Oracle特有注入技术

    • 延时注入:DBMS_PIPE.RECEIVE_MESSAGE('RDS',5)
    • 报错注入:exp(710)updatexml

五、防御建议

  1. 使用预编译语句

    • 避免SQL拼接,使用参数化查询
  2. 严格过滤输入

    • 对排序参数进行白名单验证(只允许asc/desc)
  3. 最小权限原则

    • 数据库用户只赋予必要权限
  4. WAF规则优化

    • 拦截dbms_pipe.receive_message等危险函数
    • 监控异常的延时请求
  5. 错误信息处理

    • 避免将数据库错误信息直接返回给用户

通过掌握Oracle注入的特性和技巧,结合实战中的经验教训,可以有效进行Oracle数据库的安全测试和防护。

Oracle注入专题:注入注意点与排序注入绕过实战 一、Oracle注入基础 1. Oracle数据库注入特点 Oracle数据库在注入过程中有以下重要特点: 数据类型敏感 :必须在字符型字段使用字符型数据,整型字段使用整型数据 语法严格 :相比MySQL更为严格,注释和函数使用有特殊要求 系统表结构特殊 :需要了解Oracle特有的系统表和视图 2. Oracle与MySQL注入关键区别 | 特性 | Oracle | MySQL | |------|--------|-------| | 注释 | -- 可用, # 不可用 | # 和 -- 都可用 | | 数据类型 | 严格区分字符型和整型 | 类型转换较灵活 | | 系统表 | v$version , user_tables 等 | information_schema | | 虚拟表 | 需要 from dual | 不需要虚拟表 | | 延时函数 | dbms_pipe.receive_message() | sleep() | 二、Oracle注入实战技巧 1. 数据类型判断与利用 判断字段类型方法 : 实际案例 : 2. 常用Oracle注入函数 获取数据库信息 : 延时注入 : 3. 报错注入利用 三、Oracle排序注入实战 1. 排序注入原理 Web应用中排序功能通常使用SQL的 ORDER BY 实现: 当排序参数可控时,可在 desc/asc 位置注入恶意代码。 2. 排序注入检测流程 第一步:判断注入点 测试参数对 ' 、 " 、 /0 、 /1 的响应 观察是否影响返回结果 第二步:判断数据库类型 测试 # 和 -- 哪个能作为注释 Java站点+ # 不可用+ -- 可用 → 可能是Oracle 第三步:验证注入 使用Oracle特有函数验证: 3. 绕过WAF技巧 Oracle与MySQL绕过差异 : MySQL中可使用多行注释加垃圾字符绕过: Oracle中这种绕过方式通常无效,语法要求更严格 有效绕过方法 : 使用Oracle特有函数如 DBMS_PIPE.RECEIVE_MESSAGE 避免使用被拦截的关键字,寻找替代方案 四、实战踩坑与解决方案 1. 常见错误 数据库类型误判 误将Oracle当作MySQL进行注入 解决方案:通过注释符和特有函数准确判断 数据类型不匹配 在字符型字段使用整型数据 解决方案:添加引号转为字符型 WAF绕过方法不当 使用MySQL的绕过技巧在Oracle中无效 解决方案:使用Oracle特有的函数和方法 2. 有效解决方案 准确判断数据库类型 测试 # 和 -- 哪个能作为注释 测试特有函数如 dbms_pipe.receive_message 正确处理数据类型 当 union select 1,2 报错时尝试 union select '1','2' 使用Oracle特有注入技术 延时注入: DBMS_PIPE.RECEIVE_MESSAGE('RDS',5) 报错注入: exp(710) 或 updatexml 五、防御建议 使用预编译语句 避免SQL拼接,使用参数化查询 严格过滤输入 对排序参数进行白名单验证(只允许asc/desc) 最小权限原则 数据库用户只赋予必要权限 WAF规则优化 拦截 dbms_pipe.receive_message 等危险函数 监控异常的延时请求 错误信息处理 避免将数据库错误信息直接返回给用户 通过掌握Oracle注入的特性和技巧,结合实战中的经验教训,可以有效进行Oracle数据库的安全测试和防护。