SQL Injection Tutorial: How to Learn with Example
Τι είναι η ένεση SQL;
Το SQL Injection είναι μια επίθεση που δηλητηριάζει δυναμικές δηλώσεις SQL για να σχολιάσει ορισμένα μέρη της πρότασης ή προσθέτοντας μια συνθήκη που θα είναι πάντα αληθής. Εκμεταλλεύεται τα ελαττώματα σχεδιασμού σε κακοσχεδιασμένες εφαρμογές Ιστού για να εκμεταλλευτεί δηλώσεις SQL για την εκτέλεση κακόβουλου κώδικα SQL.
Τα δεδομένα είναι ένα από τα πιο ζωτικά στοιχεία των πληροφοριακών συστημάτων. Οι εφαρμογές Ιστού που υποστηρίζονται από βάση δεδομένων χρησιμοποιούνται από τον οργανισμό για τη λήψη δεδομένων από πελάτες. SQL είναι το ακρωνύμιο του Structured Query Language. Χρησιμοποιείται για την ανάκτηση και το χειρισμό δεδομένων στη βάση δεδομένων.
Πώς λειτουργεί το SQL Injection Attack;
Οι τύποι επιθέσεων που μπορούν να εκτελεστούν χρησιμοποιώντας την έγχυση SQL ποικίλλουν ανάλογα με τον τύπο του μηχανισμού βάσης δεδομένων. Η επίθεση λειτουργεί σε δυναμικές δηλώσεις SQL. Μια δυναμική δήλωση είναι μια δήλωση που δημιουργείται κατά το χρόνο εκτέλεσης χρησιμοποιώντας τον κωδικό πρόσβασης παραμέτρων από μια φόρμα ιστού ή μια συμβολοσειρά ερωτήματος URI.
Παράδειγμα SQL Injection
Ας εξετάσουμε μια απλή διαδικτυακή εφαρμογή με φόρμα σύνδεσης. Ο κώδικας για τη φόρμα HTML φαίνεται παρακάτω.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
ΕΔΩ,
- Η παραπάνω φόρμα αποδέχεται τη διεύθυνση email και τον κωδικό πρόσβασης στη συνέχεια τις υποβάλλει στο a PHP αρχείο με όνομα index.php.
- Έχει την επιλογή αποθήκευσης της περιόδου σύνδεσης σε ένα cookie. Αυτό το συμπεράνουμε από το πλαίσιο ελέγχου memory_me. Χρησιμοποιεί τη μέθοδο ανάρτησης για την υποβολή δεδομένων. Αυτό σημαίνει ότι οι τιμές δεν εμφανίζονται στη διεύθυνση URL.
Ας υποθέσουμε ότι η δήλωση στο backend για τον έλεγχο του ID χρήστη είναι η εξής
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ΕΔΩ,
- Η παραπάνω πρόταση χρησιμοποιεί τις τιμές του
$_POST[]
συστοιχία απευθείας χωρίς να τα απολυμάνετε. - Ο κωδικός πρόσβασης είναι κρυπτογραφημένος χρησιμοποιώντας τον αλγόριθμο MD5.
Θα παρουσιάσουμε την επίθεση SQL injection χρησιμοποιώντας το sqlfiddle. Ανοίξτε τη διεύθυνση URL http://sqlfiddle.com/ στο πρόγραμμα περιήγησής σας. Θα εμφανιστεί το παρακάτω παράθυρο.
Σημείωση: θα πρέπει να γράψετε τις εντολές SQL
Βήμα 1) Εισαγάγετε αυτόν τον κωδικό στο αριστερό παράθυρο
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Βήμα 2) Κάντε κλικ στην επιλογή Δημιουργία σχήματος
Βήμα 3) Εισαγάγετε αυτόν τον κωδικό στο δεξιό παράθυρο
select * from users;
Βήμα 4) Κάντε κλικ στην επιλογή Εκτέλεση SQL. Θα δείτε το παρακάτω αποτέλεσμα
Ας υποθέσουμε ότι προμήθειες χρήστη admin@admin.sys και 1234 ως κωδικός πρόσβασης. Η δήλωση που θα εκτελεστεί έναντι της βάσης δεδομένων θα είναι
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Ο παραπάνω κώδικας μπορεί να αξιοποιηθεί σχολιάζοντας το τμήμα κωδικού πρόσβασης και προσθέτοντας μια συνθήκη που θα είναι πάντα αληθής. Ας υποθέσουμε ότι ένας εισβολέας παρέχει την ακόλουθη είσοδο στο πεδίο διεύθυνσης email.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx για τον κωδικό πρόσβασης.
Η παραγόμενη δυναμική δήλωση θα είναι η εξής.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
ΕΔΩ,
- xxx@xxx.xxx τελειώνει με ένα μόνο εισαγωγικό που συμπληρώνει το εισαγωγικό συμβολοσειράς
OR 1 = 1
Το LIMIT 1 είναι μια συνθήκη που θα ισχύει πάντα και περιορίζει τα επιστρεφόμενα αποτελέσματα σε μία μόνο εγγραφή.- — ' ΚΑΙ … είναι ένα σχόλιο SQL που καταργεί το τμήμα κωδικού πρόσβασης.
Αντιγράψτε την παραπάνω δήλωση SQL και επικολλήστε την SQL FiddleΕκτελέστε το πλαίσιο κειμένου SQL όπως φαίνεται παρακάτω
Δραστηριότητα Hacking: SQL Inject a Web Application
Έχουμε μια απλή διαδικτυακή εφαρμογή στο http://www.techpanda.org/ που είναι ευάλωτο σε επιθέσεις SQL Injection μόνο για σκοπούς επίδειξης. Ο παραπάνω κώδικας φόρμας HTML λαμβάνεται από τη σελίδα σύνδεσης. Η εφαρμογή παρέχει βασική ασφάλεια, όπως απολύμανση του πεδίου email. Αυτό σημαίνει ότι ο παραπάνω κωδικός μας δεν μπορεί να χρησιμοποιηθεί για παράκαμψη της σύνδεσης.
Για να το ξεπεράσουμε, μπορούμε να εκμεταλλευτούμε το πεδίο κωδικού πρόσβασης. Το παρακάτω διάγραμμα δείχνει τα βήματα που πρέπει να ακολουθήσετε
Ας υποθέσουμε ότι ένας εισβολέας παρέχει την ακόλουθη είσοδο
- Βήμα 1: Εισαγάγετε xxx@xxx.xxx ως διεύθυνση email
- Βήμα 2: Εισαγάγετε xxx') Ή 1 = 1 — ]
- Κάντε κλικ στο κουμπί Υποβολή
- Θα κατευθυνθείτε στον πίνακα ελέγχου
Η δήλωση SQL που δημιουργείται θα είναι η εξής
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Το παρακάτω διάγραμμα δείχνει ότι η δήλωση έχει δημιουργηθεί.
ΕΔΩ,
- Η δήλωση υποθέτει έξυπνα ότι χρησιμοποιείται κρυπτογράφηση md5
- Ολοκληρώνει το μεμονωμένο εισαγωγικό και την αγκύλη κλεισίματος
- Προσθέτει μια συνθήκη στη δήλωση που θα είναι πάντα αληθής
Γενικά, μια επιτυχημένη επίθεση SQL Injection επιχειρεί μια σειρά από διαφορετικές τεχνικές, όπως αυτές που παρουσιάστηκαν παραπάνω, για να πραγματοποιήσει μια επιτυχημένη επίθεση.
Άλλοι τύποι επίθεσης SQL Injection
Οι ενέσεις SQL μπορούν να κάνουν περισσότερο κακό από το να περάσουν απλώς τους αλγόριθμους σύνδεσης. Μερικές από τις επιθέσεις περιλαμβάνουν
- Διαγραφή δεδομένων
- Ενημέρωση δεδομένων
- Εισαγωγή δεδομένων
- Εκτέλεση εντολών στον διακομιστή που μπορεί να κατεβάσει και να εγκαταστήσει κακόβουλα προγράμματα όπως Trojans
- Εξαγωγή πολύτιμων δεδομένων, όπως στοιχεία πιστωτικής κάρτας, email και κωδικοί πρόσβασης στον απομακρυσμένο διακομιστή του εισβολέα
- Λήψη στοιχείων σύνδεσης χρήστη κ.λπ
- Έγχυση SQL με βάση τα cookies
- Έγχυση SQL βάσει σφαλμάτων
- Blind SQL Injection
Η παραπάνω λίστα δεν είναι εξαντλητική. απλά σας δίνει μια ιδέα για το τι SQL Injection
Εργαλεία αυτοματισμού για SQL Injection
Στο παραπάνω παράδειγμα, χρησιμοποιήσαμε τεχνικές χειροκίνητης επίθεσης με βάση την τεράστια γνώση μας για την SQL. Υπάρχουν αυτοματοποιημένα εργαλεία που μπορούν να σας βοηθήσουν να εκτελέσετε τις επιθέσεις πιο αποτελεσματικά και στο συντομότερο δυνατό χρονικό διάστημα. Αυτά τα εργαλεία περιλαμβάνουν
- SQLMap – http://sqlmap.org/
- JSQL Injection – https://tools.kali.org/vulnerability-analysis/jsql
Πώς να αποτρέψετε τις επιθέσεις SQL Injection
Ένας οργανισμός μπορεί να υιοθετήσει την ακόλουθη πολιτική για να προστατευτεί από επιθέσεις SQL Injection.
- Η εισαγωγή του χρήστη δεν πρέπει ποτέ να είναι αξιόπιστη – Πρέπει πάντα να απολυμαίνεται πριν χρησιμοποιηθεί σε δυναμικές δηλώσεις SQL.
- Αποθηκευμένες διαδικασίες – Αυτά μπορούν να ενσωματώσουν τις δηλώσεις SQL και να αντιμετωπίζουν όλες τις εισόδους ως παραμέτρους.
- Έτοιμες δηλώσεις – προετοίμασε τις δηλώσεις για να λειτουργήσει δημιουργώντας πρώτα τη δήλωση SQL και στη συνέχεια αντιμετωπίζοντας όλα τα υποβληθέντα δεδομένα χρήστη ως παραμέτρους. Αυτό δεν έχει καμία επίδραση στη σύνταξη της πρότασης SQL.
- Κανονικές εκφράσεις - Αυτά μπορούν να χρησιμοποιηθούν για τον εντοπισμό πιθανού επιβλαβούς κώδικα και την κατάργησή του πριν από την εκτέλεση των εντολών SQL.
- Δικαιώματα πρόσβασης χρήστη σύνδεσης βάσης δεδομένων – θα πρέπει να παρέχονται μόνο τα απαραίτητα δικαιώματα πρόσβασης σε λογαριασμούς που χρησιμοποιούνται συνδεθείτε στη βάση δεδομένων. Αυτό μπορεί να βοηθήσει στη μείωση της απόδοσης των δηλώσεων SQL στον διακομιστή.
- Μηνύματα σφάλματος - Αυτά δεν πρέπει να αποκαλύπτουν ευαίσθητες πληροφορίες και πού ακριβώς συνέβη ένα σφάλμα. Απλά προσαρμοσμένα μηνύματα σφάλματος, όπως "Λυπούμαστε, αντιμετωπίζουμε τεχνικά σφάλματα. Επικοινώνησε με την τεχνική ομάδα. Δοκιμάστε ξανά αργότερα» μπορεί να χρησιμοποιηθεί αντί για την εμφάνιση των δηλώσεων SQL που προκάλεσαν το σφάλμα.
Δραστηριότητα Hacking: Χρησιμοποιήστε το Havij για SQL Injection
Σε αυτό το πρακτικό σενάριο, πρόκειται να χρησιμοποιήσουμε το πρόγραμμα Havij Advanced SQL Injection για να σαρώσουμε έναν ιστότοπο για τρωτά σημεία.
Σημείωση: σας πρόγραμμα κατά των ιών μπορεί να το επισημάνει λόγω της φύσης του. Θα πρέπει να το προσθέσετε στη λίστα εξαιρέσεων ή να θέσετε σε παύση το λογισμικό προστασίας από ιούς.
Η παρακάτω εικόνα δείχνει το κύριο παράθυρο για το Havij
Το παραπάνω εργαλείο μπορεί να χρησιμοποιηθεί για την αξιολόγηση της ευπάθειας ενός ιστότοπου/εφαρμογής.
Περίληψη
- Το SQL Injection είναι ένας τύπος επίθεσης που εκμεταλλεύεται κακές δηλώσεις SQL
- Η ένεση SQL μπορεί να χρησιμοποιηθεί για παράκαμψη αλγορίθμων σύνδεσης, ανάκτηση, εισαγωγή και ενημέρωση και διαγραφή δεδομένων.
- Τα εργαλεία SQL injection περιλαμβάνουν SQLMap, SQLPing και SQLSmack κ.λπ.
- Μια καλή πολιτική ασφαλείας κατά τη σύνταξη δήλωσης SQL μπορεί να βοηθήσει στη μείωση των επιθέσεων SQL injection.