απαιτήσεις: Πρόσφατα διάβασα το έγγραφο ASP.NET Core της Microsoft "Αποτροπή επιθέσεων ανοιχτής ανακατεύθυνσης στο ASP.NET Core", που σημαίνει περίπουΟι προγραμματιστές θα πρέπει να δώσουν προσοχή στη διαδρομή του τοπικού ιστότοπου όταν μεταβαίνουν στη διεύθυνση επανάκλησης για να αποτρέψουν ορισμένα άτομα από το να πλαστογραφήσουν κακόβουλα τη διεύθυνση επανάκλησης για επιθέσεις phishing。 Μελετήστε τον κώδικα και προετοιμαστείτε να τον μεταφέρετε στο έργο ASP.NET MVC.
Θυμάμαι ότι ένας μεγάλος κατασκευαστής είχε αυτήν την ευπάθεια στο παρελθόν και μερικοί άνθρωποι τη χρησιμοποίησαν για να αποστραγγίσουν την κίνηση από το QQ και το WeChat, ως εξής:
Εκμεταλλευόμενοι την ευπάθεια, ορισμένα εργαλεία συνομιλίας δεν μπόρεσαν να εμποδίσουν τους χρήστες να κάνουν κλικ σε συνδέσμους για πρόσβαση σε κακόβουλο περιεχόμενο ιστότοπου λόγω της εμπιστοσύνης τους σε τομείς μεγάλων εταιρειών.
Τι είναι η επίθεση ανοιχτής ανακατεύθυνσης;
Οι εφαρμογές Ιστού συχνά ανακατευθύνουν τους χρήστες σε σελίδες σύνδεσης όταν έχουν πρόσβαση σε πόρους που απαιτούν έλεγχο ταυτότητας. Οι ανακατευθύνσεις συνήθως περιλαμβάνουν μια παράμετρο querystring returnUrl, έτσι ώστε οι χρήστες να μπορούν να επιστρέψουν στη διεύθυνση URL που ζητήθηκε αρχικά μετά από μια επιτυχημένη σύνδεση. Μετά τον έλεγχο ταυτότητας του χρήστη, ανακατευθύνεται στη διεύθυνση URL που ζήτησε αρχικά.
Παράδειγμα επίθεσης
Ένας κακόβουλος χρήστης μπορεί να αναπτύξει μια επίθεση που έχει σχεδιαστεί για να δώσει σε έναν κακόβουλο χρήστη πρόσβαση στα διαπιστευτήρια ή σε ευαίσθητες πληροφορίες ενός χρήστη. Για να ξεκινήσει μια επίθεση, ένας κακόβουλος χρήστης θα εξαπατήσει τον χρήστη ώστε να κάνει κλικ σε έναν σύνδεσμο προς τη σελίδα προορισμού του ιστότοπού σας και να προσθέσει την τιμή querystring returnUrl σε αυτήν τη διεύθυνση URL. προκειμένου ναcontoso.comΓια παράδειγμα, η εφαρμογή βρίσκεται σεhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutΠεριέχει μια σελίδα προορισμού. Η επίθεση ακολουθεί τα εξής βήματα:
- Ο χρήστης κάνει κλικ σε έναν κακόβουλο σύνδεσμο για ναhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Η δεύτερη διεύθυνση URL είναι "contoso1.com", αντί για "contoso.com”) 。
- Ο χρήστης συνδέεται με επιτυχία.
- Ο χρήστης ανακατευθύνεται στον ιστότοποhttp://contoso1.com/Account/LogOn(Ένας κακόβουλος ιστότοπος που μοιάζει ακριβώς με τον πραγματικό).
- Ο χρήστης συνδέεται ξανά (παρέχοντας διαπιστευτήρια στον κακόβουλο ιστότοπο) και ανακατευθύνεται πίσω στον πραγματικό ιστότοπο.
- Οι χρήστες μπορεί να πιστεύουν ότι η πρώτη τους προσπάθεια σύνδεσης απέτυχε και η δεύτερη προσπάθεια πέτυχε.Είναι πιθανό οι χρήστες να μην γνωρίζουν ακόμα ότι τα διαπιστευτήριά τους έχουν παραβιαστεί。
Εκτός από τις σελίδες προορισμού, ορισμένοι ιστότοποι προσφέρουν σελίδες ανακατεύθυνσης ή τελικά σημεία. Ας υποθέσουμε ότι η εφαρμογή σας έχει μια σελίδα που περιλαμβάνει μια ανοιχτή ανακατεύθυνση, /Home/Redirect. Για παράδειγμα, ένας εισβολέας θα μπορούσε να δημιουργήσει ένα σημείο σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginσύνδεση. Οι τακτικοί χρήστες θα δουν ότι η διεύθυνση URL ξεκινά με το όνομα του ιστότοπού σας. Από εμπιστοσύνη, κάνουν κλικ στον σύνδεσμο. Στη συνέχεια, οι ανοιχτές ανακατευθύνσεις στέλνουν τους χρήστες σε ιστότοπους ηλεκτρονικού ψαρέματος που μοιάζουν με τους δικούς σας και οι χρήστες μπορούν να συνδεθούν σε ιστότοπους που πιστεύουν ότι είναι δικοί σας.
Αποτροπή ανοικτών επιθέσεων ανακατεύθυνσης
Κατά την ανάπτυξη διαδικτυακών εφαρμογών, όλα τα δεδομένα που παρέχονται από τους χρήστες αντιμετωπίζονται ως αναξιόπιστα. Εάν η εφαρμογή σας έχει τη δυνατότητα να ανακατευθύνει χρήστες με βάση το περιεχόμενο URL, βεβαιωθείτε ότι αυτές οι ανακατευθύνσεις πραγματοποιούνται μόνο τοπικά στην εφαρμογή σας (ή ανακατευθύνετε σε γνωστά URL και όχι σε URL που ενδέχεται να παρέχονται στη συμβολοσειρά ερωτήματος).
Τοπικήανακατεύθυνση
Χρησιμοποιώντας τη μέθοδο Controller helper στη βασική κλάση LocalRedirect:
Εάν έχει καθοριστεί μια μη τοπική διεύθυνση URL, η Τοπική ανακατεύθυνση δημιουργεί μια εξαίρεση. Διαφορετικά, συμπεριφέρεται το ίδιο με τη μέθοδο ανακατεύθυνσης. Οι πληροφορίες εξαίρεσης είναι οι εξής:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. Ο πηγαίος κώδικας έχει ως εξής:
Διαδικασία εκτέλεσης: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl και στο τέλος, το IsLocalUrl θα κληθεί να κρίνει (το UrlHelperFactory υλοποιεί τη διεπαφή IUrlHelperFactory από προεπιλογή. )。
Διεύθυνση πηγαίου κώδικα:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
IsLocalUrl
IsLocalUrl πριν από την ανακατεύθυνση, δοκιμάστε τη διεύθυνση URL χρησιμοποιώντας αυτήν τη μέθοδο:
Ο κωδικός έχει ως εξής:
Ο κωδικός δοκιμής έχει ως εξής:
Εάν σας επιτρέπεται να μεταβείτε σε άλλες τοποθεσίες ονομάτων τομέα, μπορείτε να υλοποιήσετε τη διασύνδεση IUrlHelperFactory και να τροποποιήσετε το IServiceCollection για να αντικαταστήσετε την προεπιλεγμένη κλάση υλοποίησης κατά την εκκίνηση του προγράμματος.
Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
(Τέλος)
|