Oracle injection
Poslužite ovaj post kao kopiju izbrisane objave sa https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Korišćenje Oracle-a za izvršavanje HTTP i DNS zahteva van opsega je dobro dokumentovano, ali kao sredstvo za izvlačenje SQL podataka kod ubacivanja. Uvek možemo izmeniti ove tehnike/funkcije da bismo izvršili druge SSRF/XSPA napade.
Instalacija Oracle-a može biti veoma bolna, posebno ako želite da brzo postavite instancu kako biste isprobali komande. Moj prijatelj i kolega sa Appsecco, Abhisek Datta, uputio me je na https://github.com/MaksymBilenko/docker-oracle-12c što mi je omogućilo da postavim instancu na t2.large AWS Ubuntu mašini i Docker-u.
Pokrenuo sam docker komandu sa --network="host"
zastavicom kako bih mogao da imitiram Oracle kao lokalnu instalaciju sa punim pristupom mreži, tokom pisanja ovog blog posta.
Oracle paketi koji podržavaju URL ili specifikaciju Hostname/Port broja
Kako bih pronašao bilo koje pakete i funkcije koje podržavaju specifikaciju hosta i porta, izvršio sam Google pretragu na Oracle Database Online dokumentaciji. Konkretno,
Pretraga je vratila sledeće rezultate (ne svi mogu se koristiti za izvršavanje 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 grublja pretraga očigledno preskače pakete poput DBMS_LDAP
(koji omogućava prosleđivanje imena hosta i broja porta) jer stranica sa dokumentacijom jednostavno vas upućuje na drugom mestu. Dakle, mogu postojati i drugi Oracle paketi koji se mogu zloupotrebiti za izvršavanje izlaznih zahteva koje sam možda propustio.
U svakom slučaju, pogledajmo neke od paketa koje smo otkrili i naveli gore.
DBMS_LDAP.INIT
Paket DBMS_LDAP
omogućava pristup podacima sa LDAP servera. Funkcija init()
inicijalizuje sesiju sa LDAP serverom i kao argument prima ime hosta i broj porta.
Ova funkcija je već dokumentovana kako bi pokazala eksfiltraciju podataka putem DNS-a, kao što je prikazano ispod
Međutim, s obzirom da funkcija prihvata ime hosta i broj porta kao argumente, možete je koristiti i kao skener porta.
Evo nekoliko primera:
ORA-31203: DBMS_LDAP: PL/SQL - Inicijalizacija nije uspela.
pokazuje da je port zatvoren dok vrednost sesije ukazuje na otvoren port.
UTL_SMTP
Paket UTL_SMTP
je dizajniran za slanje e-mailova preko SMTP-a. Primer koji je prikazan na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za slanje e-maila. Za nas, međutim, interesantna stvar je mogućnost pružanja specifikacije hosta i porta.
Jednostavan primer je prikazan ispod sa funkcijom UTL_SMTP.OPEN_CONNECTION
, sa vremenom isteka od 2 sekunde.
ORA-29276: prenos prekinut
pokazuje da je port otvoren, ali nije uspostavljena SMTP veza, dok ORA-29278: SMTP privremena greška: 421 Servis nije dostupan
pokazuje da je port zatvoren.
UTL_TCP
Paket UTL_TCP
i njegove procedure i funkcije omogućavaju komunikaciju zasnovanu na TCP/IP protokolu sa servisima. Ako je programiran za određeni servis, ovaj paket može lako postati put za ulazak u mrežu ili izvršavanje zahteva sa serverske strane, jer se mogu kontrolisati svi aspekti TCP/IP veze.
Primer na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za uspostavljanje sirove TCP veze radi preuzimanja web stranice. Možemo ga jednostavnije koristiti za slanje zahteva ka instanci metapodataka, na primer, ili ka proizvoljnom TCP/IP servisu.
Interesantno je da, zbog mogućnosti oblikovanja sirovih TCP zahteva, ovaj paket takođe može da se koristi za upitivanje usluge meta-podataka instance svih provajdera oblaka, jer se tip metode i dodatni zaglavlja mogu proslediti unutar TCP zahteva.
UTL_HTTP i veb zahtevi
Možda najčešća i najšire dokumentovana tehnika u svakom tutorijalu za Oracle SQL Injection van opsega je UTL_HTTP
paket. Ovaj paket je definisan dokumentacijom kao - Paket UTL_HTTP omogućava izvršavanje HTTP poziva iz SQL i PL/SQL. Možete ga koristiti za pristupanje podacima na internetu preko HTTP protokola.
Možete dodatno koristiti ovo da biste izvršili neke osnovne skeniranje portova koristeći upite poput
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.
Još jedan paket koji sam koristio u prošlosti sa različitim uspehom je GETCLOB()
metoda Oracle apstraktne vrste HTTPURITYPE
koja vam omogućava interakciju sa URL-om i pruža podršku za HTTP protokol. Metoda GETCLOB()
se koristi za dobijanje GET odgovora sa URL-a kao CLOB podatkovnog tipa.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Last updated