Οι βάσεις δεδομένων NoSQL (γνωστές και ως non-relational = μη σχετικές) δεν χρησιμοποιούν SQL για ερωτήματα. Υπάρχει μια ποικιλία διαφορετικών τύπων βάσεων δεδομένων NoSQL, όπως:
- Key-Value
- Key-Document
- Column-Family
- Graph
Το NoSQL σχεδιάστηκε ως απάντηση για ευέλικτες μεθοδολογίες σχεδιασμού. Οι relational βάσεις δεδομένων (SQL) απαιτούν καθορισμό των σχημάτων εκ των προτέρων και δεν επιτρέπουν την ενημέρωσή τους όταν τα δεδομένα βρίσκονται ήδη στη βάση δεδομένων. Η προσθήκη νέων πεδίων απαιτεί τη μετεγκατάσταση της βάσης δεδομένων σε ένα νέο σχήμα, το οποίο μπορεί να είναι χρονοβόρο.
Table of Contents
Επίθεση NoSQL
Ενώ οι βάσεις δεδομένων NoSQL, όπως το MongoDB, δεν χρησιμοποιούν SQL για ερωτήματα, εξακολουθούν να κάνουν ερωτήματα με βάση την είσοδο του χρήστη.
Η κύρια διαφορά μεταξύ SQL και NoSQL injection είναι η γραμματική και η σύνταξη του ερωτήματος. Οι βάσεις δεδομένων NoSQL δεν έχουν τυποποιημένη γλώσσα. Ωστόσο, η σύνταξη των γλωσσών τους είναι παρόμοια (αφού έχουν σχεδιαστεί για να κάνουν το ίδιο πράγμα).
Μία εφαρμογή NoSQL injection είναι η επίθεση σε εφαρμογές web που έχουν δημιουργηθεί στη στοίβα MEAN (MongoDB, Express, Angular και Node). Κατά τη διαβίβαση δεδομένων, οι εφαρμογές MEAN χρησιμοποιούν το JSON, το οποίο είναι το ίδιο πράγμα που χρησιμοποιείται από το MongoDB. Η διείσδυση κώδικα JSON σε μια εφαρμογή MEAN μπορεί να επιτρέψει επιθέσεις injection σε μια βάση δεδομένων MongoDB.
Για παράδειγμα, το παραπάνω στιγμιότυπο οθόνης (από το NullSweep ) δείχνει μια εφαρμογή που είναι ευάλωτη σε NoSQL. Από ένα αίτημα, ο κώδικας τραβά ένα όνομα χρήστη και έναν κωδικό πρόσβασης και τον τοποθετεί σε ένα ερώτημα MongoDB. Περνώντας το JSON {“username”: “myaccount”, “password”: {“$ ne”: 1}} , ένας εισβολέας θα μπορούσε να πραγματοποιήσει έλεγχο ταυτότητας στην υπηρεσία χωρίς κωδικό πρόσβασης.
Το MongoDB και άλλες βάσεις δεδομένων NoSQL χρησιμοποιούνται συνήθως σε εφαρμογές ιστού. Για παράδειγμα, μια ιστοσελίδα μπορεί να ζητήσει διαπιστευτήρια λογαριασμού χρήστη σε μία φόρμα ιστού, να αποθηκεύσει πληροφορίες ελέγχου ταυτότητας σε μια βάση δεδομένων MongoDB και να πραγματοποιήσει ελέγχους διαπιστευτηρίων χρησιμοποιώντας JavaScript.
Η αυστηρή ενσωμάτωση του MongoDB σε JavaScript και σε άλλες γλώσσες προγραμματισμού σημαίνει ότι οι επιθέσεις NoSQL μπορούν να χρησιμοποιηθούν για την εκτέλεση επιθέσεων σε άλλα επίπεδα. Μια επίθεση με ένεση NoSQL που περιλαμβάνει κώδικα JavaScript, θα επιτρέψει την εκτέλεση αυτού του κώδικα εντός της εφαρμογής ιστού.
Προστασία από επιθέσεις NoSQL injection
Οι επιθέσεις injection NoSQL είναι πολύ παρόμοιες με τις επιθέσεις injection SQL: εκμεταλλεύονται την κακή εξυγίανση της εισόδου χρήστη κατά τη δημιουργία ερωτημάτων βάσης δεδομένων. Αυτό σημαίνει ότι τα ίδια εργαλεία για την προστασία από επιθέσεις injection SQL λειτουργούν επίσης για το NoSQL, όπως:
Οι βάσεις δεδομένων NoSQL είναι ακόμα βάσεις δεδομένων, πράγμα που σημαίνει ότι είναι συχνά σημαντικό να εκτελείτε ερωτήματα χρησιμοποιώντας δεδομένα που παρέχονται από τον χρήστη. Όπως και με τις βάσεις δεδομένων SQL, είναι σημαντικό να διασφαλιστεί ότι οι πληροφορίες απολυμαίνονται σωστά πριν τις χρησιμοποιήσετε σε ένα ερώτημα για να ελαχιστοποιήσετε την ευπάθεια μιας εφαρμογής σε επιθέσεις με ένεση (injection).
Πηγές
- Foreword, OWASP
- 2019 CWE Top 25 Most Dangerous Software Errors, Common Weakness Enumeration
- NoSQL Databases Explained, MongoDB
- NoSQL Injection, RangeForce (Medium)
- A NoSQL Injection Primer (with Mongo), NullSweep