ORM Injection
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Django ORM (Python)
Στο αυτό το άρθρο εξηγείται πώς είναι δυνατόν να γίνει ευάλωτο ένα Django ORM χρησιμοποιώντας για παράδειγμα έναν κώδικα όπως:
Σημειώστε πώς όλα τα request.data (τα οποία θα είναι ένα json) περνάνε απευθείας για φιλτράρισμα αντικειμένων από τη βάση δεδομένων. Ένας επιτιθέμενος θα μπορούσε να στείλει απροσδόκητα φίλτρα προκειμένου να διαρρεύσουν περισσότερα δεδομένα από ό,τι αναμενόταν.
Παραδείγματα:
Σύνδεση: Σε μια απλή σύνδεση προσπαθήστε να διαρρεύσετε τους κωδικούς πρόσβασης των χρηστών που είναι εγγεγραμμένοι σε αυτήν.
Είναι δυνατόν να γίνει brute-force στον κωδικό πρόσβασης μέχρι να διαρρεύσει.
Σχεσιακή φιλτράρισμα: Είναι δυνατόν να διασχίσουμε σχέσεις προκειμένου να διαρρεύσει πληροφορίες από στήλες που δεν αναμένονταν καν να χρησιμοποιηθούν στην επιχείρηση. Για παράδειγμα, αν είναι δυνατόν να διαρρεύσουν άρθρα που δημιουργήθηκαν από έναν χρήστη με αυτές τις σχέσεις: Article(
created_by
) -[1..1]-> Author (user
) -[1..1]-> User(password
).
Είναι δυνατόν να βρείτε τον κωδικό πρόσβασης όλων των χρηστών που έχουν δημιουργήσει ένα άρθρο
Πολλών προς πολλούς σχεσιακός φιλτράρισμα: Στο προηγούμενο παράδειγμα δεν μπορέσαμε να βρούμε τους κωδικούς πρόσβασης χρηστών που δεν έχουν δημιουργήσει ένα άρθρο. Ωστόσο, ακολουθώντας άλλες σχέσεις αυτό είναι δυνατό. Για παράδειγμα: Article(
created_by
) -[1..1]-> Author(departments
) -[0..*]-> Department(employees
) -[0..*]-> Author(user
) -[1..1]-> User(password
).
Σε αυτή την περίπτωση μπορούμε να βρούμε όλους τους χρήστες στα τμήματα χρηστών που έχουν δημιουργήσει άρθρα και στη συνέχεια να διαρρεύσουμε τους κωδικούς πρόσβασής τους (στο προηγούμενο json διαρρέουμε μόνο τα ονόματα χρηστών αλλά στη συνέχεια είναι δυνατό να διαρρεύσουμε τους κωδικούς πρόσβασης).
Κατάχρηση των σχέσεων πολλών προς πολλούς του Django Group και Permission με τους χρήστες: Επιπλέον, το μοντέλο AbstractUser χρησιμοποιείται για τη δημιουργία χρηστών στο Django και από προεπιλογή αυτό το μοντέλο έχει κάποιες πολλές προς πολλές σχέσεις με τους πίνακες Permission και Group. Που βασικά είναι ένας προεπιλεγμένος τρόπος για να αποκτήσετε πρόσβαση σε άλλους χρήστες από έναν χρήστη αν είναι στην ίδια ομάδα ή μοιράζονται την ίδια άδεια.
Παράκαμψη περιορισμών φίλτρου: Η ίδια ανάρτηση πρότεινε να παρακαμφθεί η χρήση κάποιου φίλτρου όπως
articles = Article.objects.filter(is_secret=False, **request.data)
. Είναι δυνατόν να εξάγουμε άρθρα που έχουν is_secret=True επειδή μπορούμε να επαναλάβουμε από μια σχέση πίσω στον πίνακα Article και να διαρρεύσουμε μυστικά άρθρα από μη μυστικά άρθρα επειδή τα αποτελέσματα είναι συνδεδεμένα και το πεδίο is_secret ελέγχεται στο μη μυστικό άρθρο ενώ τα δεδομένα διαρρέουν από το μυστικό άρθρο.
Καταχρώντας τις σχέσεις, είναι δυνατόν να παρακαμφθούν ακόμη και τα φίλτρα που προορίζονται για την προστασία των δεδομένων που εμφανίζονται.
Error/Time based via ReDoS: Στα προηγούμενα παραδείγματα αναμενόταν να έχουμε διαφορετικές απαντήσεις αν το φίλτρο λειτουργούσε ή όχι για να το χρησιμοποιήσουμε ως όρακα. Αλλά θα μπορούσε να είναι δυνατόν να γίνει κάποια ενέργεια στη βάση δεδομένων και η απάντηση να είναι πάντα η ίδια. Σε αυτό το σενάριο, θα μπορούσε να είναι δυνατόν να προκαλέσουμε σφάλμα στη βάση δεδομένων για να αποκτήσουμε έναν νέο όρακα.
Από την ίδια ανάρτηση σχετικά με αυτό το vector:
SQLite: Δεν έχει έναν κανονικό εκφραστή (regexp) από προεπιλογή (απαιτεί φόρτωση τρίτου μέρους επέκτασης)
PostgreSQL: Δεν έχει προεπιλεγμένο χρονικό όριο regex και είναι λιγότερο επιρρεπές σε backtracking
MariaDB: Δεν έχει χρονικό όριο regex
Prisma ORM (NodeJS)
Τα παρακάτω είναι κόλπα που εξάγονται από αυτή την ανάρτηση.
Πλήρης έλεγχος εύρεσης:
Είναι δυνατόν να δούμε ότι ολόκληρο το σώμα javascript περνάει στο prisma για να εκτελέσει ερωτήματα.
Στο παράδειγμα από την αρχική ανάρτηση, αυτό θα ελέγξει όλες τις αναρτήσεις που έχουν δημιουργηθεί από κάποιον (κάθε ανάρτηση δημιουργείται από κάποιον) επιστρέφοντας επίσης τις πληροφορίες χρήστη αυτού του κάποιου (όνομα χρήστη, κωδικός πρόσβασης...)
Ο παρακάτω επιλέγει όλες τις αναρτήσεις που έχουν δημιουργηθεί από κάποιον με κωδικό πρόσβασης και θα επιστρέψει τον κωδικό πρόσβασης:
Πλήρης έλεγχος της ρήτρας where:
Ας ρίξουμε μια ματιά σε αυτό όπου η επίθεση μπορεί να ελέγξει τη ρήτρα where
:
Είναι δυνατόν να φιλτράρουμε τον κωδικό πρόσβασης των χρηστών απευθείας όπως:
Χρησιμοποιώντας λειτουργίες όπως το startsWith
, είναι δυνατόν να διαρρεύσει πληροφορία.
Παράκαμψη φιλτραρίσματος πολλαπλών σχέσεων:
Είναι δυνατόν να διαρρεύσουν μη δημοσιευμένα άρθρα επιστρέφοντας στις πολλές-προς-πολλές σχέσεις μεταξύ Category
-[*..*]-> Article
:
Είναι επίσης δυνατό να διαρρεύσουν όλοι οι χρήστες εκμεταλλευόμενοι κάποιες σχέσεις many-to-many με loop back:
Error/Timed queries: Στην αρχική ανάρτηση μπορείτε να διαβάσετε ένα πολύ εκτενές σύνολο δοκιμών που πραγματοποιήθηκαν προκειμένου να βρεθεί το βέλτιστο payload για να διαρρεύσει πληροφορίες με ένα payload βασισμένο στον χρόνο. Αυτό είναι:
Όπου το {CONTAINS_LIST}
είναι μια λίστα με 1000 συμβολοσειρές για να διασφαλιστεί ότι η απάντηση καθυστερεί όταν βρεθεί η σωστή διαρροή.
Ransack (Ruby)
Αυτές οι τεχνικές βρέθηκαν σε αυτήν την ανάρτηση.
Σημειώστε ότι το Ransack 4.0.0.0 επιβάλλει πλέον τη χρήση ρητής λίστας επιτρεπόμενων για αναζητήσιμα χαρακτηριστικά και συσχετίσεις.
Ευάλωτο παράδειγμα:
Σημειώστε πώς το ερώτημα θα καθοριστεί από τις παραμέτρους που θα στείλει ο επιτιθέμενος. Ήταν δυνατόν, για παράδειγμα, να γίνει brute-force το token επαναφοράς με:
Με brute-forcing και πιθανές σχέσεις, ήταν δυνατό να διαρρεύσουν περισσότερα δεδομένα από μια βάση δεδομένων.
Αναφορές
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated