Πρόσφατα, έχουμε γράψει για ασφάλεια εφαρμογών ιστού όσον αφορά την ευπάθεια XSS. Αυτή τη φορά θέλουμε να δώσουμε την προσοχή σας σε έναν άλλο κίνδυνο.
Η ευπάθεια που εξετάζεται σε αυτό το έγγραφο μας απασχολεί εδώ και πολύ καιρό και λόγω της απλότητάς της, συχνά υποτιμάται ή είναι ακόμη και άγνωστη από ορισμένους προγραμματιστές εφαρμογών ιστού.
Σχεδόν κάθε διαδικτυακή εφαρμογή περιέχει συνδέσμους οι οποίοι, όταν πατηθούν, ανοίγουν σε νέα καρτέλα, ώστε να μην κλείσει η καρτέλα με την αρχική σελίδα. Αυτή είναι μια προτιμώμενη συμπεριφορά επειδή οι δημιουργοί θέλουν ο χρήστης να περνάει όσο το δυνατόν περισσότερο χρόνο στην εφαρμογή.
Μια επίθεση που εκμεταλλεύεται αυτή την ευπάθεια είναι το λεγόμενο "reverse tabnabbing". Πρόκειται για μια επίθεση κατά την οποία μια σελίδα που συνδέεται από τη σελίδα-στόχο είναι σε θέση να αντικαταστήσει τη σελίδα αυτή με, για παράδειγμα, έναν ιστότοπο phishing.
Σενάριο επίθεσης
- Ας υποθέσουμε ότι το θύμα χρησιμοποιεί το Facebook, το οποίο είναι γνωστό για το άνοιγμα συνδέσμων μέσω target="_blank",
- Δημιουργήστε μια ψεύτικη viral σελίδα,
- Δημιουργήστε έναν ιστότοπο phishing που μοιάζει με σελίδα σύνδεσης στο Facebook,
- Βάλτε το παρακάτω κωδικός στη σελίδα του ιού, π.χ., μέσω ευπάθειας XSS που βρέθηκε
window.opener.location = 'https://phishing-website/facebook.com',
- Το θύμα κάνει κλικ στο σύνδεσμο στο Facebook για τη ιογενή σελίδα,
- Η ιογενής σελίδα ανακατευθύνει την καρτέλα του Facebook στην ιστοσελίδα phishing ζητώντας από τον χρήστη να συνδεθεί ξανά.
Έτσι, μπορούμε να αλλάξουμε τη γονική καρτέλα από τη μολυσμένη σελίδα-στόχο με αντικείμενο παραθύρου από το API Web. Συνήθως, μια επίθεση περιλαμβάνει τη χρήση πολλών ανακαλυφθέντων ευπαθειών και απάτης phishing παράλληλα.
Το πρόβλημα
Όταν ανοίγουμε μια νέα καρτέλα στο πρόγραμμα περιήγησης χρησιμοποιώντας έναν σύνδεσμο με το target="_blank"
χαρακτηριστικό, έχουμε πρόσβαση στον "παραπέμποντα" μας από τη νέα καρτέλα. Πιο συγκεκριμένα, στο ανοιχτήρι
ιδιότητα του Παράθυρο
αντικείμενο, το οποίο επιστρέφει μια αναφορά στο παράθυρο που το άνοιξε, τη γονική μας σελίδα.
Αυτό οφείλεται στη συμπεριφορά του Window.open()
λειτουργία. Με πρόσβαση σε αυτό το χαρακτηριστικό, μπορούμε εύκολα να αντικαταστήσουμε τη σελίδα γονέα μας. Σημειώστε ότι ορισμένα σύγχρονα προγράμματα περιήγησης μπορούν να κάνουν window.opener
λειτουργία στην καρτέλα στόχου ως null
για να αποτρέψετε αυτή τη συμπεριφορά.
Παράδειγμα κώδικα
<code> <a href="https://github.com" target="_blank">Μετάβαση στο GitHub - μολυσμένος σύνδεσμος</a>
const if (link) link[0].onclick = () => { if (window) window.opener.location = 'https://stackoverflow.com' }
Παραπάνω μπορείτε να δείτε τον μολυσμένο σύνδεσμο, ο οποίος αρχικά ανοίγει μια νέα καρτέλα με μια σελίδα του GitHub, αλλά εν τω μεταξύ αλλάζει τη "γονική" μας σελίδα στην τοποθεσία Stackoverflow.
Ζωντανό παράδειγμα
1. Σύνδεσμοι HTML
Προσθέστε rel="noopener noreferrer"
στο <a>
ετικέτα.
Το rel
καθορίζει τη σχέση μεταξύ ενός συνδεδεμένου πόρου και του τρέχοντος εγγράφου.
noopener
λέει στο πρόγραμμα περιήγησης να πλοηγηθεί στον στόχο χωρίς να παραχωρήσει πρόσβαση στον γονέα που τον άνοιξε. Καρτέλα στόχου Window.opener
θα είναι null
.
noreferrer
εμποδίζει το πρόγραμμα περιήγησης, κατά την πλοήγηση στο στόχο, να στείλει στο γονέα τη διεύθυνση ή οποιαδήποτε άλλη τιμή ως referrer μέσω της διεύθυνσης referer
Κεφαλίδα HTTP. Σημειώστε ότι το όνομα αυτής της επικεφαλίδας HTTP είναι σκόπιμα ανορθόγραφο ως "referrer".
2. JavaScript σύνδεσμοι
Για το JavaScript Window.open
συνάρτηση, μπορείτε να προσθέσετε τις τιμές noopener
και noreferrer
στο windowFeatures
παράμετρος του Window.open
λειτουργία, αλλά διαφορετικά προγράμματα περιήγησης μπορεί να αντιδράσουν διαφορετικά, οπότε συνιστάται να κάνετε Window.opener
ως null
μετά τη χρήση Window.open()
λειτουργία.
Διαβάστε περισσότερα:
Rails API & CORS. Μια πινελιά συνείδησης
Στρατηγικές άντλησης δεδομένων στο NextJS
7 λόγοι για τους οποίους το ηλεκτρονικό σας κατάστημα χρειάζεται το Magento
Αν βρήκατε αυτό το άρθρο ενδιαφέρον, ακολουθήστε τον Lukasz στο Github: https://github.com/twistezo