Olá, amigos!
Uma das táticas mais “sujas”, diga-se de passagem, é a alteração de senha do usuário sem a sua permissão, pois pode ocorrer em diversos momentos do dia-a-dia, por exemplo:
- O cara saiu de férias e deixou algum objeto no owner dele.
- Preciso pegar algumas informações da tabela do FULANO.
- É necessário fornecer algumas permissões do usuário X para Y.
- Ou a MELHOR! Existe um owner na aplicação que foi criado em 1900 e bolinhas e, agora, precisa de manutenção e ninguém tem acesso a esse usuário, porque ninguém sabe a senha.
Bom, para resolver esses “probleminhas”, existe uma técnica no Oracle que podemos utilizar para ter acesso completo a um específico usuário, um pequeno “hack” no dicionário Oracle, mas para conseguir a façanha, é necessário que tenha acesso a view DBA_USERS, que foi utilizado nesse exemplo.
LEMBRANDO
Logicamente todos os exemplos que citei acima poderiam ser feitos pelo DBA da empresa ou alguém que tenha acesso a usuários gerenciais do banco de dados, como SYSTEM, usuários com role de DBA e etc. Isso é apenas um exemplo de como se aplicar a técnica.
Agora, vou passar o exemplo prático de como funciona.
1) Vamos criar um usuário.
SQL> @id
HORA EXECUTADA
-------------------
09-09-2008 11:45:57
INSTANCE_NAME HOST_NAME STATUS
--------------- -------------------- ----------
xe DBARODRIGO OPEN
USER IS "SYS"
SQL> create user RODRIGO
2 identified by rodrigo;
Usuário criado.
SQL> grant create session to RODRIGO;
Concessão bem-sucedida.
SQL> disco
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
2) Teste a conexão do novo usuário no banco de dados.
SQL> conn rodrigo/rodrigo
Conectado.
SQL> disco
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
3) Conectado com um usuário administrativo, faça um select básico na view DBA_USERS.
SQL> conn system
Informe a senha:
Conectado.
SQL> select username, account_status, password
2 from dba_users
3 where username = ´RODRIGO´;
USERNAME ACCOUNT_STATUS PASSWORD
------------------------------ -------------------------------- ------------------------------
RODRIGO OPEN F697FBF0BB2DA2EC
4) Altere a senha do usuário desejado, no exemplo, vou alterar a senha para FERNANDA.
SQL> alter user RODRIGO identified by FERNANDA;
Usuário alterado.
5) Pegue o valor gerado para a nova senha.
SQL> select username, account_status, password
2 from dba_users
3 where username = ´RODRIGO´;
USERNAME ACCOUNT_STATUS PASSWORD
-------------------- --------------------- --------------------
RODRIGO OPEN FB34D454E9FFDE18
[cor1][b]Observação[/b][/cor1]
Pode parecer confuso, mas vamos recapitular os valores que são equivalentes às senhas:
F697FBF0BB2DA2EC = RODRIGO
FB34D454E9FFDE18 = FERNANDA
6) Para voltar à senha anterior, apenas utilize a opção VALUES junto com IDENTIFIED BYcom o valor da coluna password.
SQL> conn system
Informe a senha:
Conectado.
SQL> alter user RODRIGO identified by values ´F697FBF0BB2DA2EC´;
O valor F697FBF0BB2DA2EC (gerado por um algoritmo HASH) é equivalente ao valor RODRIGO.
Agora, veja os testes.
SQL> conn rodrigo/fernanda
Conectado.
SQL> disco
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> conn system
Informe a senha:
Conectado.
SQL> alter user RODRIGO identified by values ´F697FBF0BB2DA2EC´;
Usuário alterado.
SQL> disco
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> conn rodrigo/rodrigo
Conectado.
SQL> disco
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Como eu não alterei o valor para a senha FERNANDA, se eu tentar logar com essa senha, terei erros, veja.
SQL> conn rodrigo/fernanda
ERROR:
ORA-01017: invalid username/password; logon denied
FINISH! Uma técnica de hack bem conhecida entre os DBAS, que até a versão 10gR2 (no Patchset 10.2.0.4) ainda continua, eu não sei ainda se nas versões 11g já possui algum tipo de segurança nesse ponto, então aprecie com moderação.
Abraços!