Η τεχνική επίθεσης με την ονομασία SQL injection συγκαταλέγεται σε μία γενικότερη γκάμα τεχνικών, οι οποίες θα μπορούσαν να αποδοθούν στην ελληνική γλώσσα ως «τεχνικές εγχύσεως κώδικα».
Παρόλο που η SQL injection είναι μία από τις παλαιότερες τεχνικές εγχύσεως κώδικα, χαρακτηρίζεται ακόμα και σήμερα ως μία από τις πιο «αξιόπιστες», χρησιμοποιείται ακόμα ευρέως (πολύ συχνά μεταξύ αντίπαλων εταιρειών) και θεωρείται μία από τις πλέον καταστροφικές.
Η SQL injection (όπως προκύπτει και από την ονομασία της) σχετίζεται με την επέμβαση σε βάσεις δεδομένων οι οποίες λειτουργούν με την SQL γλώσσα. Η SQL (Structured Query Language) είναι μία γλώσσα διαχείρισης, που αναπτύχθηκε με σκοπό τη διαχείριση δεδομένων σε συσχετιζόμενα συστήματα διαχείρισης βάσεων δεδομένων (Relational Data Base Management Systems). Είναι μία γλώσσα η οποία αναπτύχθηκε τη δεκαετία του 70 και θεωρείται σήμερα από τις διαδεδομένες γλώσσες διαχείρισης βάσεων δεδομένων. Θα σημειώσουμε στο σημείο αυτό ότι η SQL γλώσσα χρησιμοποιείται ευρέως στη διαχείριση και των διαδικτυακών βάσεων δεδομένων.
Σχεδόν κάθε διαδικτυακή εφαρμογή σήμερα χρησιμοποιεί κάποια βάση δεδομένων, στην οποία αποθηκεύει πληροφορίες απαραίτητες για τη λειτουργία της. Για παράδειγμα, μία ιστοσελίδα On line πώλησης προϊόντων (τα λεγόμενα e-stores), χρησιμοποιεί βάσεις δεδομένων προκειμένου να αποθηκεύσει μία πληθώρα πληροφοριών, όπως λογαριασμούς χρηστών μαζί με προσωπικές πληροφορίες και οικονομικά τους στοιχεία (π.χ. αριθμούς πιστωτικών καρτών, διευθύνσεις κατοικιών κ.ά.), τιμές προϊόντων, on line παραγγελίες και άλλα. Η SQL γλώσσα, λοιπόν, χρησιμοποιείται προκειμένου να διαβαστούν, να προστεθούν ή να αφαιρεθούν πληροφορίες οι οποίες διατηρούνται σε αυτές τις βάσεις δεδομένων. Η τεχνική SQL injection σκοπό έχει την πρόσβαση, παραποίηση και τροποποίηση των βάσεων δεδομένων που λειτουργούν με την SQL γλώσσα. Αν η όλη διαχείριση των βάσεων δεδομένων δεν έχει πραγματοποιηθεί με σωστό και ασφαλή τρόπο, κάποιος χρησιμοποιώντας την SQL injection τεχνική, μπορεί να αποκτήσει πλήρη πρόσβαση στο σύνολο των πληροφοριών που είναι αποθηκευμένες στις βάσεις δεδομένων, να έχει τη δυνατότητα επέμβασης σε αυτές τις πληροφορίες (να τις τροποποιήσει, να τις διαγράψει ή να προσθέσει άλλες ψευδείς) ή σε πιο εξεζητημένες περιπτώσεις, να αποκτήσει πλήρη έλεγχο του εξυπηρετητή (server) στον οποίο λειτουργούν οι συγκεκριμένες βάσεις δεδομένων.
Η τεχνική της SQL injection επίθεσης ολοκληρώνεται συνήθως σε τρία στάδια:
- Ανακάλυψη ευπαθών σημείων τα οποία θα επιτρέψουν την SQL injection επίθεση.
- Καθορισμός της δομής του SQL.
- Κατασκευή του κώδικα SQL προκειμένου να ακολουθήσει η έκχυση στο server.
Ας δούμε τώρα τα τρία αυτά στάδια λίγο πιο αναλυτικά.
Ανακάλυψη ευπαθών σημείων τα οποία θα επιτρέψουν την SQL Injection επίθεση
Η ανακάλυψη των τρωτών σημείων σε ένα SQL Server, λαμβάνει χώρα κατά κανόνα μέσω εφαρμογών και υπηρεσιών web (web applications and services). Με άλλα λόγια, τα άτομα που επιθυμούν να επιτεθούν με αυτήν την τεχνική, εισάγουν σε url (Uniform Resource Locator) ιστοσελίδων συγκεκριμένες παραμέτρους και εν συνεχεία ψάχνουν για εμφάνιση λαθών στις on line βάσεις δεδομένων. Αν τα λάθη αυτά δεν υπάρχει πρόβλεψη απόκρυψής τους και εμφανιστούν στους τελικούς χρήστες, αποτελούν το κενό ασφαλείας που χρειάζονται οι επιτιθέμενοι. Προκειμένου τα ανωτέρω να γίνουν πιο κατανοητά, ας δούμε ένα υποθετικό παράδειγμα.
Θεωρούμε λοιπόν μία ιστοσελίδα η οποία έχει κάποιο συγκεκριμένο url. Σε κάποιο Link της, το url καταλήγει σε php?=7 για παράδειγμα. Μπορούμε τώρα, μετά τον αριθμό 7 να εισάγουμε έναν τόνο (΄) – αυτή είναι η παράμετρος που εισάγουμε – και να πατήσουμε enter προκειμένου να δούμε πώς θα «αντιδράσει» ο server. Αν τώρα λάβουμε ως απάντηση από το server της ιστοσελίδας ένα error, τότε ο server της ιστοσελίδας αποδέχεται στην ουσία την παραποίηση του url, συνεπώς η συγκεκριμένη ιστοσελίδα έχει κάποιο κενό ασφαλείας και είναι τρωτή σε SQL injection επιθέσεις.
Θα σημειώσουμε στο σημείο αυτό ότι το συγκεκριμένο παράδειγμα είναι αρκετά απλοϊκό και πλέον ελάχιστες είναι οι ιστοσελίδες στις οποίες είναι τόσο προφανή τα κενά ασφαλείας τους. Σήμερα χρησιμοποιούνται πολύ πιο πολύπλοκες τεχνικές ανεύρεσης ευπαθών σημείων, όπως η λεγόμενη «blind SQL Injection», στην οποία αποστέλλονται στο server δυαδικά αιτήματα προκειμένου να διαφανεί πότε ο server «απαντάει» θετικά ή αρνητικά (error) στα αιτήματα αυτά. Με αυτόν τον τρόπο μπορεί να εξακριβωθεί ακόμα και ο ακριβής αριθμός δεδομένων που περιέχονται στη βάση δεδομένων του server.
Καθορισμός της δομής SQL
Μετά την ανακάλυψη των κενών ασφαλείας σε ένα SQL server, το επόμενο βήμα είναι ο καθορισμός και η χαρτογράφηση της δομής του SQL κώδικα που «βρίσκεται» πίσω από τη διαδικτυακή εφαρμογή. Αυτό μπορεί να πραγματοποιηθεί αρκετά εύκολα μέσω των μηνυμάτων λάθους του server. Ο επιτιθέμενος δηλαδή, θα προσπαθεί να δίνει μηνύματα λάθους στο server και ανάλογα με τις απαντήσεις που θα λαμβάνει θα χαρτογραφήσει τη δομή της βάσης δεδομένων που διατηρεί. Παρόλο που υπάρχουν περιπτώσεις στις οποίες η δομή της SQL βάσης δεδομένων είναι τόσο πολύπλοκη ώστε χρειάζεται ειδικό λογισμικό για τη χαρτογράφησή της με αυτόν τον τρόπο, στην πλειοψηφία των servers ο SQL κώδικας είναι αρκετά απλός, οπότε και η «δουλειά» των επιτιθέμενων αρκετά πιο εύκολη.
Κατασκευή και «έκχυση» του SQL κώδικα
Το τρίτο και τελευταίο στάδιο της SQL injection τεχνικής αφορά στην κατασκευή και έκχυση του κώδικα SQL στη βάση δεδομένων. Αφού πλέον ο επιτιθέμενος έχει μία ιδέα σχετικά με τη δομή της βάσης δεδομένων και του κώδικα SQL, θα προσπαθήσει φυσικά να αποκτήσει πρόσβαση διαχειριστή (admin-log in) στο server. Θα κατασκευάσει λοιπόν έναν κώδικα SQL προσαρμοσμένο στη βάση δεδομένων που έχει στοχοποιήσει, με τελικό σκοπό να αποκτήσει πρόσβαση διαχειριστή. Ένας συνήθης τρόπος τον οποίο χρησιμοποιούν αυτοί που εφαρμόζουν την SQL Injection τεχνική προκειμένου να αποκτήσουν πρόσβαση διαχειριστή στη βάση δεδομένων που έχουν στοχοποιήσει, είναι η χρήση της λέξης-κλειδί «UNION», στον κώδικα που θα εκχύσουν στη βάση δεδομένων.
Αν τώρα με τον κώδικα που θα εκχύσει ο επιτιθέμενος αποκτήσει πρόσβαση διαχειριστή στη στοχοποιημένη βάση δεδομένων, τότε είναι φυσικό πως μπορεί να κάνει ο,τιδήποτε θελήσει σε αυτή. Με τα προνόμια του διαχειριστή είναι σε θέση να εισάγει οποιαδήποτε SQL εντολή επιθυμεί στον SQL Server, ακόμα και να καταστρέψει τελείως τη συγκεκριμένη βάση δεδομένων.
Τα παραπάνω μας δίνουν μία ιδέα για το πόσο επικίνδυνη είναι η συγκεκριμένη τεχνική επίθεσης και τι ζημιά μπορεί να προκαλέσει στις βάσεις δεδομένων που διατηρεί μία εταιρεία ή ένας Οργανισμός. Θα σημειωθεί εδώ βέβαια, πως ως τεχνική θεωρείται αρκετά προχωρημένη (advanced). Η SQL injection δεν είναι μία τεχνική ανάλογη ενός script το οποίο ο επιτιθέμενος θα «κατεβάσει» από το internet, θα το εκτελέσει και ίσως αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε κάποια βάση δεδομένων ή κάποιο portal. Είναι τεχνική που απαιτεί ιδιαίτερες γνώσεις και εμπειρία, ειδικά στον προγραμματισμό SQL. Κατά βάση ο επιτιθέμενος θα χρειαστεί να επέμβει χειροκίνητα στον κώδικα SQL, οπότε γίνεται κατανοητό το γιατί χρειάζεται να το γνωρίζει άριστα. Συνεπώς, ο Οργανισμός ή η εταιρεία που θα δεχτούν μία SQL Injection επίθεση, θα πρέπει να θεωρούν ότι έχουν στοχοποιηθεί από άτομα τα οποία έχουν βαθιά γνώση σε τεχνικές διείσδυσης, έχουν αφιερώσει αρκετό χρόνο μελετώντας το στόχο τους και φυσικά δεν έχουν προβεί σε μία τέτοια ενέργεια από hobby ή για λόγους εντυπωσιασμού. Κατά κανόνα, επιθέσεις τέτοιου είδους είναι είτε αποτέλεσμα αθέμιτου ανταγωνισμού είτε αποσκοπούν στη χρήση των δεδομένων που θα αντληθούν για ίδιον όφελος (συνήθως χρηματικό). Μπορεί να φανταστεί κάποιος τα κέρδη που θα αποκομίσει ο επιτιθέμενος, αν αποκτήσει πρόσβαση σε χιλιάδες αριθμούς πιστωτικών καρτών και λοιπών προσωπικών στοιχείων πελατών ενός On line καταστήματος, για παράδειγμα. Οι επιπτώσεις λοιπόν σε μία εταιρεία ή Οργανισμό ο οποίος θα πέσει θύμα μίας SQL Injection επίθεσης, μπορεί να είναι τεράστιες και να επηρεάσουν ακόμα και τη βιωσιμότητά του. Ας δούμε τώρα κάποια αντίμετρα τα οποία θα μπορούσαν να λάβουν οι διαχειριστές των δικτύων εταιρειών προκειμένου να «δυσκολέψουν» τη ζωή των επιτιθέμενων, με αποτέλεσμα να τους αποτρέψουν από την επίθεσή τους.
Πολιτικές πρόληψης SQL Injection επιθέσεων
Αυτό που κάνει την τεχνική SQL injection ιδιαίτερα επικίνδυνη είναι ότι ευθύς ως διαπιστωθεί η ύπαρξη κενού ασφαλείας το οποίο επιτρέπει την SQL Injection επίθεση, δεν μπορεί να γίνει κάτι άμεσα προκειμένου να αντιμετωπιστεί με επιτυχία αυτή η έλλειψη ασφάλειας. Για παράδειγμα, δεν μπορεί να κατεβάσει κάποιος ένα service pack ή άλλη εφαρμογή από το διαδίκτυο, να το εγκαταστήσει στο server του και με αυτόν τον τρόπο να λύσει το πρόβλημά του. Το καλύτερο ίσως μέτρο πρόληψης είναι ο σωστός σχεδιασμός και η καλή κατασκευή της βάσης δεδομένων και μετά η συνεχής επίβλεψή της. Σαν μόνη ίσως συγκεκριμένη πολιτική αντιμετώπισης, η οποία φυσικά δεν θα πρέπει να θεωρηθεί ότι παρέχει προστασία σε επίπεδο 100%, είναι ο περιορισμός των στοιχείων παραμετροποίησης του server. Με άλλα λόγια, αν περιοριστεί η πρόσβαση σε λάθος παραμέτρους (δηλαδή περιορισμός του 1ου σταδίου της επίθεσης), τότε μπορεί να μειωθεί η πιθανότητα επίθεσης στο συγκεκριμένο server. Παρόλο που κάτι τέτοιο σήμερα δεν παρέχει ασφάλεια σε επίπεδο 100% (λόγω ανάπτυξης ειδικών λογισμικών εξεύρεσης αδυναμιών στους SQL servers) μπορεί να αποτελέσει ίσως το πρώτο βήμα στην εγκατάσταση και διαμόρφωση ενός πλαισίου ασφάλειας γύρω από τις βάσεις δεδομένων μιας εταιρείας ή ενός Οργανισμού.
Πέραν των παραπάνω θα μπορούσαν να υιοθετηθούν και κάποιες περαιτέρω πολιτικές, οι οποίες θα ανεβάσουν το ποσοστό ασφάλειας σε αποδεκτά επίπεδα. Ειδικότερα:
- Οι διαχειριστές θα πρέπει να αποκτήσουν πλήρη γνώση όλων των SQL Server του δικτύου ευθύνης τους. Προκειμένου ο διαχειριστής κάποιας εταιρείας να είναι σε θέση να ασφαλίσει τους SQL Servers του δικτύου της, θα πρέπει να γνωρίζει πόσοι SQL servers υπάρχουν στο δίκτυο ευθύνης του. Θα αναφέρουμε εδώ ότι η διαδικασία εξεύρεσης του συνόλου των SQL servers μπορεί να μην είναι και τόσο εύκολη όσο ακούγεται, καθόσον η πλειοψηφία των servers λειτουργούν σε δυναμικά TCP ports και συνήθως οι servers αυτοί λειτουργούν μόνο όταν ο χρήστης τους «χρειάζεται». Συνεπώς, υπάρχει περίπτωση πολλοί από τους servers να μην είναι ενεργοί. Η εξεύρεση του συνόλου των SQL Servers θα μπορούσε να γίνει για παράδειγμα με SQL ping, SQL scan ή καλύτερα με ειδικά γι’ αυτόν το σκοπό λογισμικά.
- Θα πρέπει να απαγορευτεί η πρόσβαση σε συγκεκριμένα Ports των servers από χρήστες αγνώστου προελεύσεως. Παρόλο που μία τέτοια στρατηγική πάλι δεν θεωρείται ότι παρέχει υψηλό ποσοστό ασφάλειας, ειδικά σε SQL injection επιθέσεις, αποτελεί όμως ένα πρώτο βήμα για τη διαμόρφωση ενός γενικότερου πλέγματος ασφάλειας του πληροφορικού δικτύου μιας εταιρείας ή Οργανισμού. Για παράδειγμα, το κλείσιμο του UDP Port 1434 [το port αυτό χρησιμοποιείται για χαρτογράφηση των SQL βάσεων δεδομένων της Microsoft (Microsoft SQL monitor database)] και φυσικά όλων των TCP ports στα οποία «ακούει» ο SQL Server, μπορεί να ενισχύσει την ασφάλειά του.
- Συνεχή Updates. Ένα άλλο βασικό μέτρο είναι η άμεση εγκατάσταση των updates που αναρτώνται από τις εταιρείες σχεδίασης των λογισμικών που χρησιμοποιούνται. Αυτό μπορεί να γίνεται είτε χειροκίνητα (εγκατάσταση από το διαχειριστή του update) είτε αυτόματα αν το λογισμικό που χρησιμοποιείται παρέχει τέτοια δυνατότητα.
- Υιοθέτηση ισχυρών admin-passwords και συχνή εναλλαγή τους. Η τοποθέτηση ενός ισχυρού κωδικού πρόσβασης είναι δυνατό να εξασφαλίσει το server από brute force attacks, ενώ καλό είναι ως επιπλέον μέτρο ασφάλειας ο ισχυρός αυτός κωδικός πρόσβασης να αλλάζει ανά τακτά χρονικά διαστήματα.
Συμπερασματικά
Τα παραπάνω, φυσικά και δεν καλύπτουν σε βάθος το θέμα της SQL Injection επίθεσης (πόσο μάλλον τις τεχνικές αντιμετώπισής της). Για την πλήρη ανάπτυξη της επίθεσης και των τεχνικών αντιμετώπισής της, θα χρειαζόντουσαν δεκάδες σελίδες και όχι οι λίγες γραμμές ενός άρθρου. Σκοπός όμως αυτών των λίγων γραμμών ήταν η ανάδυση μίας πραγματικά ασύμμετρης απειλής για τα πληροφορικά δίκτυα, αφού η SQL Injection τεχνική εύκολα θα μπορούσε να παραλληλιστεί με τις τακτικές ανταρτοπόλεμου, καθόσον θεωρείται αρκετά ανορθόδοξη. Επίσης θεωρείται και ιδιαίτερα advanced τεχνική (ειδικά με τις σημερινές προεκτάσεις της) πράγμα που σημαίνει ότι οι Οργανισμοί και οι εταιρείες που θα δεχτούν μία SQL Injection επίθεση, έχουν να κάνουν όχι με κάποιο μοναχικό hacker αλλά με κάποιον ή κάποιους που έχουν στοχοποιήσει το δίκτυό τους με συγκεκριμένο σκοπό και για να αντλήσουν συγκεκριμένα δεδομένα, τα οποία θα χρησιμοποιήσουν προφανώς για δικό τους όφελος ή στα πλαίσια αθέμιτου ανταγωνισμού.
Οι στρατηγικές άμυνας που αναφέρθηκαν ακροθιγώς παραπάνω παρέχουν μία βασική ασφάλεια, πλην όμως προκειμένου κάποιος διαχειριστής να εξασφαλίσει το δίκτυο του Οργανισμού στον οποίο εργάζεται, με αρκετές αξιώσεις, θα πρέπει να μελετήσει και να κατανοήσει σε βάθος τη συγκεκριμένη τεχνική, να προσαρμόσει τις τεχνικές άμυνας στο συγκεκριμένο δίκτυο που διαχειρίζεται, να βρίσκεται σε συνεχή επαγρύπνηση και κυρίως να επιτηρεί συνεχώς το δίκτυό του, προκειμένου να είναι σε θέση να αντιληφθεί άμεσα κάποια δυσλειτουργία του. Τέλος, αν μιλάμε για Οργανισμούς μεγάλου βεληνεκούς, οι οποίοι θεωρείται δεδομένο ότι συνιστούν πρώτης τάξεως στόχο, θα πρέπει οι διαχειριστές τους να αποκτήσουν μία νοοτροπία διατήρησης συνεχούς κατάστασης συναγερμού και να λειτουργούν υπό το σκεπτικό πως ακόμα και η ελάχιστη δυσλειτουργία που θα παρατηρηθεί, θα πρέπει να αντιμετωπίζεται ως μία ενδεχόμενη γενικευμένη επίθεση.
Πηγές
. Dafydd Stuttard, Marcus Pinto «The web application hackers handbook» (Indiana, 2008,Wiley Publishing Inc).
. Joel Scambray, Stuart McClure «Hacking exposed -windows-windows security secrets and solutions» (New York, 2008, McGraw-Hill books).
. Stuart McClure, Joel Scambray, George Kurtz «Hacking exposed -6-network security secrets and solutions» (New York, 2009, McGraw-Hill books).
Του Παναγιώτη Κικίλια
Στέλεχος της Υπηρεσίας Δίωξης Ηλεκτρονικού Εγκλήματος