Oracle injection
Σερβίρετε αυτήν την ανάρτηση ως αντίγραφο από τον wayback machine της διαγραμμένης ανάρτησης από https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Η χρήση του Oracle για την εκτέλεση αιτημάτων HTTP και DNS εκτός του περιβάλλοντος είναι καλά τεκμηριωμένη, αλλά ως μέσο για την εξαγωγή δεδομένων SQL σε εισχώρηση. Μπορούμε πάντα να τροποποιήσουμε αυτές τις τεχνικές/συναρτήσεις για να κάνουμε άλλες SSRF/XSPA.
Η εγκατάσταση του Oracle μπορεί να είναι πολύ επώδυνη, ειδικά αν θέλετε να δημιουργήσετε γρήγορα μια περίπτωση για να δοκιμάσετε εντολές. Ο φίλος μου και συνάδελφος στην Appsecco, Abhisek Datta, με έστειλε στο https://github.com/MaksymBilenko/docker-oracle-12c που μου επέτρεψε να δημιουργήσω μια περίπτωση σε μια μηχανή Ubuntu της AWS τύπου t2.large και με τη χρήση του Docker.
Εκτέλεσα την εντολή του Docker με τη σημαία --network="host"
έτσι ώστε να μπορώ να προσομοιώσω το Oracle ως μια εγκατάσταση native με πλήρη πρόσβαση στο δίκτυο, για τη διάρκεια αυτής της ανάρτησης στο blog.
Πακέτα Oracle που υποστηρίζουν προδιαγραφή URL ή Όνομα Υπολογιστή/Αριθμό Θύρας
Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν προδιαγραφή για όνομα υπολογιστή και θύρα, έκανα μια αναζήτηση στην Διαδικτυακή Τεκμηρίωση της Oracle Database. Συγκεκριμένα,
Η αναζήτηση επέστρεψε τα παρακάτω αποτελέσματα (όχι όλα μπορούν να χρησιμοποιηθούν για εξερχόμενο δίκτυο):
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, όπως παρακάτω
Ωστόσο, δεδομένου ότι η συνάρτηση δέχεται ένα όνομα κεντρικού υπολογιστή και έναν αριθμό θύρας ως ορίσματα, μπορείτε να τη χρησιμοποιήσετε για να λειτουργήσει ως ένα εργαλείο σάρωσης θυρών επίσης.
Εδώ υπάρχουν μερικά παραδείγματα
Ένα ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
δείχνει ότι η θύρα είναι κλειστή ενώ μια τιμή συνεδρίας δείχνει ότι η θύρα είναι ανοιχτή.
UTL_SMTP
Το πακέτο UTL_SMTP
σχεδιάστηκε για την αποστολή ηλεκτρονικών μηνυμάτων μέσω του πρωτοκόλλου SMTP. Το παράδειγμα που παρέχεται στην ιστοσελίδα της Oracle documentation δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email. Για εμάς, όμως, το ενδιαφέρον είναι η δυνατότητα να παρέχουμε έναν κεντρικό υπολογιστή (host) και μια προδιαγραφή θύρας (port).
Ένα απλό παράδειγμα παρουσιάζεται παρακάτω με τη χρήση της συνάρτησης UTL_SMTP.OPEN_CONNECTION
, με ένα χρονικό όριο 2 δευτερολέπτων.
Ένα 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.
Ενδιαφέροντος, λόγω της δυνατότητας δημιουργίας ακατέργαστων αιτημάτων TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για το ερώτημα της υπηρεσίας μεταδεδομένων της παροχής υπηρεσιών σε όλους τους παρόχους cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσω του αιτήματος TCP.
UTL_HTTP και αιτήματα Web
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε οδηγό για το Oracle SQL Injection είναι το πακέτο UTL_HTTP
. Αυτό το πακέτο καθορίζεται από την τεκμηρίωση ως - Το πακέτο UTL_HTTP πραγματοποιεί κλήσεις Hypertext Transfer Protocol (HTTP) από το SQL και το PL/SQL. Μπορείτε να το χρησιμοποιήσετε για να έχετε πρόσβαση σε δεδομένα στο Internet μέσω του πρωτοκόλλου HTTP.
Μπορείτε επιπλέον να χρησιμοποιήσετε αυτό για να εκτελέσετε και μια αρχική σάρωση θυρών με ερωτήματα όπως:
Ένα ORA-12541: TNS:no listener
ή ένα TNS:operation timed out
είναι ένα σημάδι ότι ο θύρα TCP είναι κλειστή, ενώ ένα ORA-29263: HTTP protocol error
ή δεδομένα είναι ένα σημάδι ότι η θύρα είναι ανοιχτή.
Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με μεταβλητή επιτυχία είναι η GETCLOB()
μέθοδος του αφηρημένου τύπου Oracle HTTPURITYPE
που σας επιτρέπει να αλληλεπιδράτε με ένα URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος GETCLOB()
χρησιμοποιείται για να ανακτήσει την απόκριση GET από ένα URL ως τύπος δεδομένων CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Last updated