Έγχυση SQL

Η έγχυση SQL (SQL Injection) χρησιμοποιείται στο πλαίσιο μιας επίθεσης σε εφαρμογές που αποθηκεύουν και διαχειρίζονται τα δεδομένα τους μέσω ενός Συστήματος Διαχείρισης Βάσης Δεδομένων. Χρησιμοποιώντας αυτή την τεχνική ο επιτιθέμενος εκμεταλλεύται μια ευπάθεια της εφαρμογής και εισάγει κακόβουλο SQL κώδικα σε σημεία όπου η εφαρμογή περιμένει θεμιτά δεδομένα από τον χρήστη. Μια τέτοια ευπάθεια προκύπτει στην περίπτωση που η εφαρμογή δεν διαθέτει έναν μηχανισμό που να φιλτράρει σωστά τα δεδομένα εισόδου του χρήστη. Λ.χ. δεν ψάχνει για τυχόν χαρακτήρες διαφυγής εμφωλευμένους μέσα στο αίτημα ενός χρήστη ή δεν υπάρχει αυστηρός έλεγχος των τύπων των δεδομένων που εισάγει ο χρήστης. Οι επιθέσεις έγχυσης SQL επιτρέπουν σε έναν επιτιθέμενο να έχει πρόσβαση σε απόρρητα δεδομένα, να μπορεί επεξεργαστεί διαβαθμισμένα δεδομένα, να διαγράψει δεδομένα, να γίνει διαχειριστής του εξυπηρετητή της βάσης δεδομένων αλλά και να αποκτήσει πρόσβαση σε υπολογιστικούς πόρους με προνόμια διαχειριστή.

 Οι πρώτες δημόσιες συζητήσεις για επιθέσεις έγχυσης SQL ξεκίνησαν από το 1998. Οι επιθέσεις έγχυσης (με την έγχυση SQL να είναι εκ των σημαντικότερων) θεωρούνται επί σειρά ετών ως οι κρισιμότερες για την ασφάλεια των διαδικτυακών εφαρμογών με βάση το Open Web Application Security Project (OWASP). Υπάρχουν τέσσερις (4) υποκατηγορίες έγχυσης SQL: Κλασική έγχυση SQL Τυφλή έγχυση SQL Έγχυση SQL με βάση το Σύστημα Διαχείρισης Βάσης Δεδομένων (ΣΔΒΔ) Σύνθετη έγχυση SQL Έγχυση SQL + ανεπαρκής αυθεντικοποίηση Έγχυση SQL + επιθέσεις άρνησης υπηρεσιών Έγχυση SQL + DNS hijacking Έγχυση SQL + Cross-site scriptingΤο Storm Worm αποτελεί παράδειγμα σύνθετης έγχυσης SQL. Αυτή η μορφή προκύπτει όταν η είσοδος του χρήστη δεν φιλτράρεται έτσι ώστε να εντοπιστούν χαρακτήρες διαφυγής σε ένα αίτημα SQL. Αυτό έχει ως αποτέλεσμα την πιθανή χειραγώγηση των αιτημάτων που τελικά εκτελούνται στην βάση δεδομένων. Η ακόλουθη γραμμή κώδικα απεικονίζει αυτήν την ευπάθεια: statement = "SELECT * FROM users WHERE name = '" + userName + "';" Ο παραπάνω SQL κώδικας είναι σχεδιασμένος ώστε να επιστρέφει τις εγγραφές που έχουν ένα καθορισμένο όνομα χρήστη (όπως αυτό ορίζεται από την μεταβλητή “userName”) από τον πίνακα “users” της βάσης. Ωστόσο, εάν η μεταβλητή “userName” λάβει μία κακόβουλη τιμή από τον χρήστη, τότε το εν λόγω SQL αίτημα μπορεί να εκτελέσει παραπάνω λειτουργίες απ’ ό,τι αρχικά προοριζόταν από τον συγγραφέα του κώδικα. Για παράδειγμα, δίνοντας στην μεταβλητή “userName” την τιμή:' OR '1'='1ή κάνοντας χρήση σχολίων για να παραβλεφθεί το υπόλοιπο του SQL αιτήματος. Να σημειωθεί πως υπάρχουν τρεις τρόποι για να χρηση σχολίων στην SQL όπως παρατηρούμε παρακάτω (όλες οι παρακάτω γραμμές έχουν κενό στο τέλος):' OR '1'='1' -- ' OR '1'='1' { ' OR '1'='1' /* Οι παραπάνω τιμές δημιουργούν τα ακόλουθα SQL αιτήματα:Εάν αυτός ο κώδικας επρόκειτο να χρησιμοποιηθεί κατά την διαδικασία αυθεντικοποίησης, τότε το παράδειγμα αυτό θα μπορούσε να χρησιμοποιηθεί ώστε να επιβάλλει την επιλογή κάθε πεδίου δεδομένων (*) κάθε χρήστη και όχι ενός χρήστη όπως προβλεπόταν αρχικά από τον προγραμματιστή, διότι η συνθήκη ‘1’ = ‘1’ είναι πάντα αληθής. Η ακόλουθη τιμή της μεταβλητής “userName” θα προκαλούσε την διαγραφή του πίνακα “users”, καθώς και την επιλογή όλων των δεδομένων του πίνακα “userinfo” (ουσιαστικά αποκαλύπτοντας τις πληροφορίες κάθε χρήστη), κάνοντας χρήση μίας Διεπαφής Προγραμματισμού Εφαρμογών (API) που επιτρέπει την εκτέλεση πολλαπλών αιτημάτων: a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't Η παραπάνω είσοδος, οδηγεί στην κατασκευή του ακόλουθου SQL αιτήματος: Ενώ οι περισσότεροι SQL εξυπηρετητές επιτρέπουν την εκτέλεση πολλαπλών SQL αιτημάτων με μία κληση, ορισμένες Διεπαφές Προγραμματισμού Εφαρμογών SQL, όπως η συνάρτηση mysql_query()της PHP δεν το επιτρέπουν για λόγους ασφάλειας. Αυτό, αποτρέπει την έγχυση ολόκληρων ξεχωριστών αιτημάτων, αλλά όχι και την τροποποίηση ενός αιτήματος. Μία επίθεση τυφλής έγχυσης SQL μπορεί να πραγματοποιηθεί όταν η εφαρμογή είναι μεν ευάλωτη σε επιθέσεις έγχυσης SQL, αλλά τα αποτελέσματα αυτής δεν είναι ορατά στον επιτιθέμενο. Συγκεκριμένα, η ευάλωτη σελίδα, ανάλογα με το λογικό αίτημα που θα εισαχθεί στην SQL επερώτηση, θα μπορεί να έχει διαφορετική μορφή (λ.χ. διαφορετικό περιεχόμενο) ή να μην αλλάζει καθόλου. Αυτό θα συμβεί γιατί το επερώτημα που θα εκτελεστεί στην βάση θα έχει ως αποτέλεσμα μια λογική τιμή αληθής η ψευδής. Αυτό το είδος επίθεσης θεωρείται χρονοβόρο, καθώς για κάθε νέο bit πληροφορίας απαιτείται η κατασκευή ενός νέου SQL αιτήματος. Επιπλέον, στο πλαίσιο της επίθεσης, μπορεί να γίνουν πολλά ανεπιτυχή αιτήματα χωρίς αποτέλεσμα. Με τη χρήση μερικών νέων τεχνικών, ο επιτιθέμενος μπορεί με ένα αίτημα να ανακτά πολλαπλά bits, χωρίς ανεπιτυχή αιτήματα. Μάλιστα, υπάρχουν ορισμένα εργαλεία που μπορούν να αυτοματοποιήσουν τέτοιες εξελιγμένες επιθέσεις μόλις εντοπιστεί το σημείο ευπάθειας. Απόκριση υπό όρους Ένα είδος τυφλής έγχυσης SQL αναγκάζει την βάση δεδομένων να αξιολογήσει ένα λογικό αίτημα. Για παράδειγμα, ένας ιστότοπος αξιολόγησης βιβλίων χρησιμοποιεί μία συμβολοσειρά ερωτήματος (query string) για να αποφασίσει ποια αξιολόγηση βιβλίου θα προβληθεί. Έτσι, το URL https://books.example.com/review?id=5 θα οδηγούσε τον εξυπηρετητή στην εκτέλεση του ερωτήματος: από το οποίο θα λάμβανε τα δεδομένα που προορίζονται για χρήση στην σελίδα που θα προβληθεί και η οποία αφορά την αξιολόγηση με ID ίσο με 5. Το ερώτημα εκτελείται στον εξυπηρετητή και ο χρήστης δεν γνωρίζει το όνομα της βάσης δεδομένων, των πινάκων ή των πεδίων, αλλά ούτε και την συμβολοσειρά ερωτήματος. Το μόνο που γνωρίζει είναι πως το παραπάνω URL οδηγεί στην εμφάνιση της αξιολόγησης ενός βιβλίου. Ένας επιτιθέμενος μπορεί να φορτώσει τα παρακάτω URL: https://books.example.com/review?id=5 OR 1=1 και https://books.example.com/review?id=5 AND 1=2, τα οποία οδηγούν στην κατασκευή των παρακάτω ερωτημάτων αντίστοιχα: Εάν, (1) η αρχική αξιολόγηση προβληθεί με το πρώτο (“1=1”) URL και (2) μία κενή σελίδα ή σελίδα λάθους εμφανιστεί από το δεύτερο (“1=2”) και η επιστρεφόμενη σελίδα δεν έχει δημιουργηθεί ούτως ώστε να ενημερώνει τον χρήστη για μη έγκυρη είσοδο δεδομένων, τότε τα ερωτήματα έχουν εκτελεστεί με επιτυχία και ο ιστότοπος είναι ενδεχομένως ευάλωτος σε επιθέσεις έγχυσης SQL. Σε μια τέτοια περίπτωση, ο επιτιθέμενος μπορεί να προχωρήσει στην κατασκευή μίας συμβολοσειράς ερωτήματος που αποκαλύπτει την έκδοση της MySQL που χρησιμοποιείται στον εξυπηρετητή, όπως το παρακάτω: https://books.example.com/review?id=5 AND substring(@@version, 1, INSTR(@@version, '.') - 1)=4. Σε μια τέτοια περίπτωση, ο ιστότοπος θα εμφάνιζε την αξιολόγηση του βιβλίου σε έναν εξυπηρετητή που έχει την MySQL 4 και μία κενή σελίδα ή σελίδα λάθους διαφορετικά. Ο επιτιθέμενος μπορεί να συνεχίσει να χρησιμοποιεί κώδικα μέσα στις συμβολοσειρές ερωτήματος, ούτως ώστε να επιτύχει τον σκοπό του ή να αποσπάσει περισσότερες πληροφορίες αναφορικά με τον εξυπηρετητή. Αυτού του είδους οι επιθέσεις συμβαίνουν όταν οι τιμές που υποβάλλονται περιέχουν κακόβουλες εντολές, οι οποίες αποθηκεύονται αντί να εκτελούνται άμεσα. Σε ορισμένες περιπτώσεις, η εφαρμογή μπορεί να κωδικοποιήσει ένα αίτημα SQL και να το αποθηκεύσει ως έγκυρη SQL. Έπειτα, ένα άλλο μέρος της ίδιας εφαρμογής, δίχως ελέγχους προστασίας έναντι σε επιθέσεις έγχυσης SQL, μπορεί να εκτελέσει αυτό το αποθηκευμένο SQL αίτημα. Αυτή η επίθεση απαιτεί περαιτέρω γνώση αναφορικά με τον τρόπο με τον οποίο οι τιμές που έχουν υποβληθεί χρησιμοποιούνται αργότερα. Τα αυτοματοποιημένα εργαλεία περιήγησης και ανεύρεσης ευπαθειών που χρησιμοποιούνται, δεν είναι σε θέση να εντοπίσουν εύκολα αυτού του είδους τις επιθέσεις και είναι πιθανό να απαιτείται η χειροκίνητη καθοδήγηση τους από μηχανικούς ασφάλειας. Οι επιθέσεις έγχυσης SQL είναι ιδιαίτερα διαδεδομένες επιθέσεις που μπορούν να αποφευχθούν σχετικά εύκολα. Να σημειωθεί πως μετά από μία επίθεση τέτοιου τύπου το 2015 ενάντια της εταιρείας TalkTalk, το BBC ανέφερε πως οι ειδικοί ασφάλειας ήταν έκπληκτοι που μία εταιρεία τέτοιου βεληνεκούς ήταν ευάλωτη σε τέτοιες επιθέσεις. Το φιλτράρισμα ενέσεων SQL λειτουργεί με παρόμοιο τρόπο με εκείνο που χρησιμοποιείται για spam emails. Τα τείχη προστασίας των βάσεων δεδομένων εντοπίσουν ενέσεις SQL βάσει του αριθμού των μη έγκυρων ερωτημάτων που προέρχονται από έναν host. Να σημειωθεί πως τα φίλτρα λαμβάνουν υπόψη την ύπαρξη και τον αριθμό των OR ή UNION blocks μέσα στον κώδικα του ερωτήματος. Με τις περισσότερες πλατφόρμες ανάπτυξης, είναι εφικτή η χρήση παραμετροποιημένων αιτημάτων, τα οποία κάνουν χρήση παραμέτρων (γνωστές και ως placeholders) αντί να ενσωματώνουν την είσοδο του χρήστη (μεταβλητή) εντός του αιτήματος. Μία τέτοια παράμετρος μπορεί να αποθηκεύσει μόνο μία τιμή ενός δεδομένου τύπου και όχι αυθαίρετα τμήματα SQL. Ως εκ τούτου, η έγχυση SQL αντιμετωπίζεται απλώς ως παράξενη (και πιθανώς μη έγκυρη) τιμή παραμέτρου. Η χρήση παραμετροποιημένων αιτημάτων απαιτεί από τον προγραμματιστή να καθορίσει όλον τον SQL κώδικα και κατόπιν, να περάσει κάθε παράμετρο στο SQL ερώτημα. Υπάρχει, έτσι, ξεκάθαρη διάκριση μεταξύ κώδικα και δεδομένων και δεν μπορεί κανείς να εισάγει «πραγματικές» SQL εντολές, προκειμένου να αλλάξει τον σκοπό του ερωτήματος αυτού. Έστω, για παράδειγμα, το παρακάτω ερώτημα: Ο χαρακτήρας “?” αντιπροσωπεύει μία παράμετρο της οποίας ο τύπος έχει καθοριστεί από τον προγραμματιστή. Εάν, κάποιος επιτιθέμενος δώσει (με κάποιον τρόπο) ως είσοδο την τιμή: jdoe’ or ‘1’=1’ , τότε το ερώτημα θα αναζητήσει κυριολεκτικά έναν χρήστη με username ίδιο με την είσοδο. Συνεπώς, τα παραμετροποιημένα αιτήματα δεν είναι ευάλωτα σε επιθέσεις έγχυσης SQL κώδικα. Επιβολή σε επίπεδο κώδικα Κάνοντας χρήση αντικειμενοσχεσιακών βιβλιοθηκών απεικόνισης δεν υπάρχει ανάγκη για συγγραφή SQL κώδικα. Η βιβλιοθήκη αυτή θα αναλάβει τον ρόλο της παραγωγής των SQL αιτημάτων με βάση τον αντικειμενοστρεφή κώδικα. Ένας ευθύς, αν και επιρρεπής σε λάθη, τρόπος αποτροπής ενέσεων είναι η διαφυγή χαρακτήρων που έχουν ιδιαίτερη σημασία στην SQL. Ο οδηγός κάθε Συστήματος Διαχείρισης Βάσης Δεδομένων επεξηγεί ποιοι είναι οι χαρακτήρες αυτοί. Για παράδειγμα, η εμφάνιση της αποστρόφου (single quote) σε μία παράμετρο πρέπει να αντικατασταθεί από δύο single quotes για την διαμόρφωση ενός έγκυρου SQL αιτήματος. Στην γλώσσα προγραμματισμού PHP, για παράδειγμα, χρησιμοποιείται συνήθως η συνάρτηση mysqli_real_escape_string() προτού σταλθεί το αίτημα στην βάση:Αυτή η συνάρτηση προσθέτει μία ανάποδη κάθετο (backslash) στην αρχή των ακόλουθων χαρακτήρων: \x00, \n, \r, \, ', " και \x1a. Χρησιμοποιείται, κυρίως, για να καταστήσει τα δεδομένα ασφαλή προτού σταλθεί ένα αίτημα σε βάση δεδομένων MySQL. Η PHP έχει παρόμοιες συναρτήσεις και για λοιπά συστήματα βάσεων δεδομένων, όπως η pg_escape_string() που χρησιμοποιείται για PostgreSQL βάσεις δεδομένων. Η συνάρτηση addslashes(string $str) έχει ως σκοπό την διαφυγή χαρακτήρων και χρησιμοποιείται συνήθως για ερωτήματα σε βάσεις δεδομένων που δεν διαθέτουν την δική τους συνάρτηση διαφυγής στην γλώσσα PHP. Επιστρέφει μια συμβολοσειρά με ανάποδη κάθετο στην αρχή των χαρακτήρων που πρέπει να υποβληθούν σε διαδικασία διαφυγής προτού εκτελεστεί το ερώτημα. Αυτοί οι χαρακτήρες είναι η απόστροφος (‘), η διπλή απόστροφος (“), η κάθετος (\) και το NUL (NULL byte). Ορισμένοι τύποι μεταβλητών (ακέραιοι, κινητής υποδιαστολής, boolean, συμβολοσειρές) είναι δυνατό να ελεγχθούν ως προς την εγκυρότητα τους σύμφωνα με τον τύπο που αναπαριστούν. Οι συμβολοσειρές που ακολουθούν ένα αυστηρό μοτίβο (ημερομηνία, αλφαριθμητικό κτλ) μπορούν να ελεγχθούν ως προς την τήρηση αυτού. Ο περιορισμός των αδειών στην σύνδεση με την βάση δεδομένων που χρησιμοποιείται από την εφαρμογή στα απολύτως απαραίτητα δύναται να περιορίσει την αποτελεσματικότητα μίας πιθανής επίθεσης έγχυσης SQL. Για παράδειγμα, στο Σύστημα Διαχείρισης Βάσεων Δεδομένων Microsoft SQL Server, μία σύνδεση στην βάση δεδομένων θα μπορούσε να μην έχει την δυνατότητα επιλογής ορισμένων πινάκων, το οποίο θα περιόριζε προσπάθειες εισαγωγής JavaScript σε όλες τις στήλες κειμένου στην βάση δεδομένων. Τον Φεβρουάριο του 2002, ανακαλύφθηκε πως η Guess.com είναι ευάλωτη σε επίθεση έγχυσης SQL, δίνοντας την δυνατότητα απόκτησης πρόσβασης σε περισσότερα από 200 χιλιάδες ονόματα, χρεωστικές κάρτες και ημερομηνίες λήξης αυτών σε οποιονδήποτε ήταν ικανός να κατασκευάσει το απαραίτητο URL για την επίθεση στην βάση δεδομένων των πελατών του ιστότοπου. Την 1η Νοεμβρίου του 2005, ένας έφηβος χάκερ κατάφερε να εισβάλλει στον ιστότοπο ενός Ταϊβανέζικου περιοδικού ασφάλειας πληροφοριών, κάνοντας χρήση έγχυσης SQL. Ως αποτέλεσμα, απέσπασε δεδομένα των πελατών του εν λόγω περιοδικού. Τον Μάρτιο του 2006, ένας χάκερ ανακάλυψε μία ευπάθεια έγχυσης SQL σε έναν επίσημο τουριστικό ιστότοπο της Ινδικής κυβέρνησης. Στις 29 Ιουνίου του 2007, ένας χάκερ παραμόρφωσε τον ιστότοπο της Microsoft του Ηνωμένου Βασιλείου, χρησιμοποιώντας έγχυση SQL. Τον Ιούλιο του 2008, ο Μαλαισιανός ιστότοπος της εταιρείας Kaspersky έπεσε θύμα επίθεσης έγχυσης SQL. Το 2008, μία σειρά επιθέσεων ξεκίνησε να εκμεταλλεύεται ευπάθειες εφαρμογών που χρησιμοποιούσαν τον εξυπηρετητή ιστού IIS και τον εξυπηρετητή βάσης δεδομένων SQL Server της Microsoft. Πιο συγκεκριμένα, μία HTML συμβολοσειρά που δείχνει σε ένα κακόβουλο αρχείο JavaScript προστίθεται στο τέλος κάποιας ή κάποιων τιμών κειμένου στην βάση δεδομένων. Έπειτα, όταν η τιμή αυτή προβάλλεται από την βάση στον χρήστη, το script επιχειρεί να αποκτήσει τον έλεγχο στο σύστημα του χρήστη. Ο αριθμός των "μολυσμένων" ιστοσελίδων εκτιμάται σε 500 χιλιάδες. Στις 17 Αυγούστου του 2009, το Υπουργείο Δικαιοσύνης των Η.Π.Α κατηγόρησε έναν Αμερικανό πολίτη, καθώς και δύο Ρώσους για την κλοπή 130 εκατομμυρίων αριθμών πιστωτικών καρτών με την χρήση επίθεσης έγχυσης SQL. Η επίθεση στόχευε τα συστήματα πληρωμών εμπόρων λιανικής, ανάμεσα στις οποίες συγκαταλέγεται η αλυσίδα 7-Eleven και Hannaford Brothers. Τον Ιούλιο του 2010, ένας Αργεντίνος χάκερ ονόματι "Ch Russo" κατάφερε να αποκτήσει πρόσβαση στην βάση δεδομένων χρηστών του The Pirate Bay, κάνοντας χρήση επίθεσης έγχυσης SQL. Τα δεδομένα που εκτέθηκαν περιλάμβαναν usernames, MD5 αποτυπώματα κωδικών, διευθύνσεις IP, καθώς και αρχείο των torrents που οι χρήστες είχαν μεταφορτώσει. Τον Νοέμβριου του 2010, ο ιστότοπος του Βασιλικού Ναυτικού του Ηνωμένου Βασιλείου παραβιάστηκε από έναν Ρουμάνο χάκερ ονόματι TinKode με την χρήση έγχυσης SQL. Στις 27 Μαρτίου του 2011, ο ιστότοπος της MySQL παραβιάστηκε από έναν χάκερ με την χρήση έγχυσης SQL. Την 1η Ιουνίου του 2011, χάκερς της ομάδας LulzSec κατηγορήθηκαν για την χρήση έγχυσης SQL, προκειμένου να υποκλέψουν κουπόνια, download keys και κωδικούς ενός εκατομμυρίου χρηστών της εταιρείας Sony. Στις 4 Νοεμβρίου του 2013, η ομάδα hackers "RaptorSwag" σε συνεργασία με τους Anonymous παραβίασε 71 βάσεις δεδομένων της Κινεζικής Κυβέρνησης κάνοντας χρήση έγχυσης SQL. Στις 7 Μαρτίου του 2014, αξιωματούχοι του Πανεπιστημίου Johns Hopkins ανακοίνωσαν πως οι διακομιστές της Βιοϊατρικής Μηχανικής είχαν δεχθεί επίθεση έγχυσης SQL, με αποτέλεσμα να υποκλαπούν προσωπικά στοιχεία 878 μαθητών και προσωπικού. To 2014, ο ιστότοπος ξενοδοχειακών κρατήσεων Worldview έπεσε θύμα επίθεσης έγχυσης SQL, με αποτέλεσμα να υποκλαπούν τα στοιχεία των καρτών 3.814 πελατών. Μάλιστα, παρά το γεγονός ότι τα στοιχεία των καρτών ήταν κρυπτογραφημένα, το κλειδί αποκρυπτογράφησης αποθηκευόταν μαζί με τα δεδομένα. Το 2017, δεκάδες πανεπιστήμια τόσο του Ηνωμένου Βασιλείου όσο και των Ηνωμένων Πολιτειών, καθώς και κυβερνητικά ιδρύματα των Ηνωμένων Πολιτειών, αποτέλεσαν τον στόχο ενός χάκερ που χρησιμοποίησε έγχυση SQL, προκειμένου να αποκτήσει πρόσβαση στις βάσεις δεδομένων τους. Έπειτα, η πρόσβαση αυτή πουλήθηκε σε άλλα κακόβουλα άτομα. Τον Άυγουστο του 2020, μία επίθεση έγχυσης SQL χρησιμοποιήθηκε προκειμένου να υποκλαπούν δεδομένα μαθητών του Stanford που είχαν χρησιμοποιήσει τον ιστότοπο Link.