Oracle injection
Serve questo post una copia della wayback machine del post eliminato da 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 veloce per provare comandi. Il mio amico e collega di Appsecco, Abhisek Datta, mi ha indirizzato a https://github.com/MaksymBilenko/docker-oracle-12c che mi ha permesso di impostare 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 imitare Oracle come un'installazione nativa con accesso completo alla rete, per il corso di questo blogpost.
Pacchetti Oracle che supportano una specifica di URL o di Nome Host/Numero di Porta
Per trovare eventuali pacchetti e funzioni che supportano una specifica di host e porta, ho eseguito una ricerca su Google nella Documentazione Online di Oracle Database. In particolare,
I risultati della ricerca hanno restituito i seguenti risultati (non tutti possono essere utilizzati per eseguire una rete in uscita)
DBMS_NETWORK_ACL_ADMIN
UTL_SMTP
DBMS_XDB
DBMS_SCHEDULER
DBMS_XDB_CONFIG
DBMS_AQ
UTL_MAIL
DBMS_AQELM
DBMS_NETWORK_ACL_UTILITY
DBMS_MGD_ID_UTL
UTL_TCP
DBMS_MGWADM
DBMS_STREAMS_ADM
UTL_HTTP
Questa ricerca grossolana ovviamente salta pacchetti come DBMS_LDAP
(che consente di passare un nome host e un numero di porta) poiché la pagina di documentazione ti indirizza semplicemente a un'altra posizione. Pertanto, potrebbero esserci altri pacchetti Oracle che possono essere abusati per effettuare richieste in uscita che potrei aver perso.
In ogni caso, diamo un'occhiata ad alcuni dei pacchetti che abbiamo scoperto e elencato sopra.
DBMS_LDAP.INIT
Il pacchetto DBMS_LDAP
consente l'accesso ai dati dai server LDAP. La funzione init()
inizializza una sessione con un server LDAP e prende un nome host e un numero di porta come argomento.
Questa funzione è stata documentata in precedenza per mostrare l'exfiltrazione di dati tramite DNS, come di seguito
Tuttavia, dato che la funzione accetta un nome host e un numero di porta come argomenti, puoi utilizzare questo per funzionare anche come uno scanner di porte.
Ecco alcuni esempi
Un ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
indica che la porta è chiusa mentre un valore di sessione indica che la porta è aperta.
UTL_SMTP
Il pacchetto UTL_SMTP
è progettato per inviare e-mail tramite SMTP. L'esempio fornito sul sito di documentazione Oracle mostra come puoi utilizzare questo pacchetto per inviare un'email. Per noi, tuttavia, la cosa interessante è la possibilità di fornire una specifica di host e porta.
Un esempio rudimentale è mostrato di seguito con la funzione UTL_SMTP.OPEN_CONNECTION
, con un timeout di 2 secondi.
Un ORA-29276: transfer timeout
mostra che la porta è aperta ma non è stata stabilita alcuna connessione SMTP, mentre un ORA-29278: SMTP transient error: 421 Service not available
mostra che la porta è chiusa.
UTL_TCP
Il pacchetto UTL_TCP
e le sue procedure e funzioni consentono la comunicazione basata su TCP/IP con i servizi. 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. Possiamo semplificarlo ulteriormente e usarlo per effettuare richieste all'istanza dei metadati, ad esempio, o a un servizio TCP/IP arbitrario.
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. 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.
Potresti inoltre utilizzare questo per eseguire alcune scansioni di porte rudimentali con query come
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()
metodo del tipo astratto HTTPURITYPE
di Oracle 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 tipo di dato CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Last updated