Η χρήση διαδικτυακών εφαρμογών έχει γίνει κοινός τόπος για κάθε κοινωνία. Τις αντιμετωπίζουμε καθημερινά. Μπορούμε να πούμε ότι μας περιβάλλουν. Τις χρησιμοποιούμε στην εργασία, για ψυχαγωγία και ως εργαλεία επικοινωνίας με άλλους. Συχνά, ως χρήστες και ως προγραμματιστές, δεν συνειδητοποιούμε πόσα τρωτά σημεία ασφαλείας ανακαλύπτονται καθημερινά σε τέτοιες εφαρμογές.
Η ευπάθεια που εξετάζεται σε αυτό το έγγραφο μας απασχολεί εδώ και πολύ καιρό και λόγω της απλότητάς της, συχνά υποτιμάται ή είναι ακόμη και άγνωστη από ορισμένους προγραμματιστές εφαρμογών ιστού.
Σχεδόν κάθε διαδικτυακή εφαρμογή περιέχει συνδέσμους οι οποίοι, όταν πατηθούν, ανοίγουν σε νέα καρτέλα, ώστε να μην κλείσει η καρτέλα με την αρχική σελίδα. Αυτή είναι μια προτιμώμενη συμπεριφορά επειδή οι δημιουργοί θέλουν ο χρήστης να περνάει όσο το δυνατόν περισσότερο χρόνο στην εφαρμογή.
Μια επίθεση που εκμεταλλεύεται αυτή την ευπάθεια είναι το λεγόμενο "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".
Για το JavaScript Window.open συνάρτηση, μπορείτε να προσθέσετε τις τιμές noopener και noreferrer στο windowFeatures παράμετρος του Window.open λειτουργία, αλλά διαφορετικά προγράμματα περιήγησης μπορεί να αντιδράσουν διαφορετικά, οπότε συνιστάται να κάνετε Window.opener ως null μετά τη χρήση Window.open() λειτουργία.