0x01 测试环境


操作系统:window server 2008 x64 oracle:oracle 11.2.0.1.0

0x02 oracle权限介绍


  1. oracle一个实例就是一个数据库,创建一个新的数据库会产生一个新的实例,并且一个实例独立运行一个进程。
  2. 一个用户对应一个方案,当用户新建一个数据对象(比如表)之后会在此方案下面。自己访问可以直接访问,其他用户访问需通过“方案名.对象名”的方式。
  3. 用户默认拥有自己方案下面的数据对象的权限,其他用户无相应权限。sys,system默认拥有所有方案的权限。
  4. 当一个用户登录oracle实例时,首先需要判断用户是有否登录权限,如果没有,直接不能登录,如果有,则登录成功。登录成功之后,会根据用户拥有的权限来决定能做的事情,在进行一项操作时,如果有权限,则操作成功,如果没有权限,则操作失败。
  5. oracle主要有两个核心进程,一个是oracle的服务进程,一个是监听进程,当外部连接oracle时,首先是访问的监听进程,由监听进程根据你访问的数据库实例来转发到相应的oracle实例进程处理。

0x03 oracle系统服务


在window server 2008中安装的oracle 11g总共会有七个服务,这七个服务的含义分别为:

a. Oracle ORCL VSS Writer Service:

Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy)。它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的系统能。(非必须启动)

b. OracleDBConsoleorcl:

Oracle数据库控制台服务,orcl是Oracle的实例标识,默认的实例为orcl。在运行Enterprise Manager(企业管理器OEM)的时候,需要启动这个服务。(非必须启动)

c. OracleJobSchedulerORCL:

Oracle作业调度(定时器)服务,ORCL是Oracle实例标识。(非必须启动)

d. OracleMTSRecoveryService:

服务端控制。该服务允许数据库充当一个微软事务服务器MTS、COM/COM+对象和分布式环境下的事务的资源管理器。(非必须启动)

e. OracleOraDb11g_home1ClrAgent:

Oracle数据库.NET扩展服务的一部分。 (非必须启动)

f. OracleOraDb11g_home1TNSListener:

监听器服务,服务只有在数据库需要远程访问的时候才需要。(非必须启动,但是供外部访问则必须启动)。

g. OracleServiceORCL:

数据库服务(数据库实例),是Oracle核心服务该服务,是数据库启动的基础, 只有该服务启动,Oracle数据库才能正常启动。(必须启动)

那么在开发的时候到底需要启动哪些服务呢?

对新手来说,要是只用Oracle自带的sql*plus的话,只要启动OracleServiceORCL即可,要是使用PL/SQL Developer等第三方工具的话,OracleOraDb11g_home1TNSListener服务也要开启。OracleDBConsoleorcl是进入基于web的EM必须开启的,其余服务很少用。

0x04 oracle默认账户


在oracle11g安装后,会有很多系统默认账号,除了4个外,其他的都处于锁定状态,如无特殊用途,请不要打开。另外4个分别为:

  1. SYS用户 SYS,当创建一个数据库时,SYS用户将被默认创建并授予DBA角色,所有数据库数据字典中的基本表和视图都存储在名为SYS的方案中,这些基本表和视图对于Oracle数据库的操作是非常重要的。为了维护数据字典的真实性,SYS方案中的表只能由系统来维护,他们不能被任何用户或数据库管理员修改,而且任何用户不能在SYS方案中创建表。

  2. SYSTEM用户 SYSTEM,与SYS一样,在创建Oracle数据库时,SYSTEM用户被默认创建并被授予DBA角色,用于创建显示管理信息的表或视图,以及被各种Oracle数据库应用和工具使用的内容表 或视图。

  3. DBSNMP用户 DBSNMP是Oracle数据库中用于智能代理(Intelligent Agent)的用户,用来监控和管理数据库相关性能的用户,如果停止该用户,则无法提取相关的数据信息。

  4. SYSMAN用户 SYSMAN是Oracle数据库中用于EM管理的用户,如果你不用该用户,也可以删除或者锁定。

以上4个账户的密码均为安装时候设置的密码,由于一般情况下,DBSNMP和SYSMAN用户不会被使用而被遗漏,建议锁定。

0x05 oracle权限和角色


a.权限

oracle权限分为系统权限和对象权限,当刚刚建立用户时,用户没有任何权限,也不能执行任何操作。如果要执行某种特定的数据库操作,则必须为其授予系统的权限。如果用户要访问其他方案的对象,则必须为其授予对象的权限。

系统权限是指执行特定类型Sql命令的权利,它用于控制用户可以执行的一个或是一组数据库操作。比如当用户具有create table权限是,可以在其方案中建表,当用户具有create any table权限时,可以在任何方案中建表。Oracle提供了100多种系统权限。

常见的系统权限见下表:

create session

连接数据库

create view

创建视图

create procedure

创建过程、函数、包

create cluster

建簇

create table

创建表

create public synonym

创建同义词

create trigger

创建触发器

常见的对象权限见下表:

alter

修改表结构

delete

删除数据

select

查询数据

insert

添加数据

update

修改数据

index

在表上建立索引

references

引用

execute

执行

注:可以用all代替select, update, insert, alter, index, delete

b. 角色

oracle角色分为系统角色和自定义角色,自定义角色可以根据需要指定相应的权限,系统角色主要介绍下面3个:

DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。

RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。

CONNECT:拥有Connect权限的用户只可以登录,不可以创建实体和数据库结构。

对于普通用户:授予connect, resource角色。

对于DBA管理用户:授予connect,resource, dba角色。

0x06 oracle如何建立网站连接用户


方案一:

  1. 使用system新建一个用户名,给予connect,resource 的角色

  2. 使用新建的用户登录,然后创建需要的表

  3. 使用system登录,revoke新建用户的connect,resource角色

  4. 使用system登录,grant新建用户create session 权限

  5. 使用system登录,给予新建用户在USERS表空间的权限

方案二:

  1. 使用system登录,创建网站需要的表

  2. 使用system登录,创建一个用户名

  3. 使用system登录,grant新建用户create session的系统权限,然后根据网站的需要给予所建表的相应的对象权限。

  4. 使用system登录,给予新建用户在USERS表空间的权限

  5. 网站访问数据库的时候使用“system.表名”的形式。

0x07 oracle安全配置方案


1. 限制访问ip

方法一:

防火墙指定,windows中通过windows防火墙中指定监听端口的访问ip,linux中通过iptables指定监听端口的访问ip。

方法二:

windows中可通过ipsec指定监听端口的访问ip。

方法三:

可通过oracle的监听器中指定可访问的ip 在服务器上的文件$ORACLE_HOME/network/admin/sqlnet.ora中设置以下行:

tcp.validnode_checking = yes

允许访问的ip

tcp.invited_nodes = (ip1,ip2…)

不允许访问的ip

tcp.excluded_nodes=(ip1,ip2,……)
  1. 修改端口 可以修改监听器的端口,减少扫描量

  2. 关闭不必要的服务 可以关闭不必要的服务来减少对外访问,除了OracleServiceORCL和OracleOraDb11g_home1TNSListener是必须开启的之外,其他的均可以关闭。特别是OracleDBConsoleorcl服务的开启会启用web版的EM,访问端口在1158,如不需要请关闭此服务。

  3. 所有的用户均需设置强密码 在设置密码的时候均需要设置8位以上的强密码,且包含大小写,数字,特殊字符。

  4. 关闭不需要的用户 oracle默认会有4个不锁定的账户,建议锁定DBSNMP和SYSMAN。

  5. 特权账户的处理 限制数据库超级管理员远程登录。 a. 在spfile中设置 REMOTE_LOGIN_PASSWORDFILE=NONE b.在sqlnet.ora中设置 SQLNET.AUTHENTICATION_SERVICES=NONE 禁用SYSDBA角色的自动登录

  6. 开启日志 可以开启日志对数据库进行审计,但是也会消耗资源,可根据实际情况操作。

  7. 网站使用的数据库账号权限最小化 可以根据上面写的网站连接数据库账户推荐的方案建立。

  8. 合理使用数据库进程账户 数据库进程账户使用较低权限账户,新建一个新用户,添加数据目录的写权限,如果配置之后跑不起来,可以退而求其次,给予整个数据库目录的完全控制权限。

  9. 合理配置数据库进程账户对磁盘的权限 不要给予数据库目录以外的特殊权限,最好是读取权限都不给,可以根据实际情况来安排,原则就是数据库目录给的权限能保证正常运行,其他的目录能不给就不给。

0x08 oracle提权及防御点


1. 通过PL/SQL提权

create or replace library exec_shell as '$ORACLE_HOME\bin\msvcrt.dll';  
create or replace procedure execmd (command in char) is external name "system" library exec_shell language c; / exec execmd('net user >netaaa.txt');

2. 使用java提权

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*; import java.io.*; public class JAVACMD { public static void execCommand (String command) throws IOException { Runtime.getRuntime().exec(command); } }; / CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME 'JAVACMD.execCommand (java.lang.String)'; / exec javacmdproc('cmd.exe /c net user > netaaa.txt');

以上两种方法如果使用sys均可以提权成功,而普通权限用户是无法完成上面的操作的。所以防御源头还是只能对sys特权账户的管理,但是如果真的特权账户被黑客获取,此时的方法也只有使用低权限的数据库进程账户,以及控制进程账户对磁盘的权限,这样操作能将黑客能够操作的权限降到最低。 至于先对低权限的oracle账户提升为dba权限,然后进行系统提权的操作本文不讨论,也请大牛提供更好的方法。

0x09 oracle常见操作命令


1. 连接数据库

conn [email protected] as sysdba;

2. 新建用户

create user yonghuming identified by mima;

3. 给用户授权

grant connect, resource to yonghuming; grant create session to yonghuming; alter user yonghuming quota unlimited on USERS; grant unlimited tablespace to yonghuming; grant select on testable to yonghuming;

4. 取消授权

revoke connect , resource from yonghuming;

5. 删除锁定(解锁)账号

alter user yonghuming lock; alter user yonghuming unlock; drop user yonghuming cascade;