Wymagania: Niedawno przeczytałem dokument Microsoftu ASP.NET Core "Preventing Open Redirect Attacks in ASP.NET Core", co mniej więcej oznaczaDeweloperzy powinni zwracać uwagę na trasę lokalnej strony podczas przechodzenia na adres callback, aby zapobiec nieuczciwemu fałszowaniu adresu callback w celu ataków phishingowych。 Przeanalizuj kod i przygotuj się do przeniesienia go do projektu ASP.NET MVC.
Pamiętam, że duży producent miał wcześniej taką lukę i niektórzy używali jej do odprowadzania ruchu z QQ i WeChat, w następujący sposób:
Wykorzystując tę lukę, niektóre narzędzia czatu nie były w stanie powstrzymać użytkowników przed klikaniem w linki w celu dostępu do złośliwych treści stron internetowych ze względu na zaufanie do domen dużych firm.
Czym jest otwarty atak przekierowany?
Aplikacje internetowe często przekierowują użytkowników na strony logowania, gdy uzyskują dostęp do zasobów wymagających uwierzytelnienia. Przekierowania zazwyczaj zawierają parametr querystring returnUrl, dzięki czemu użytkownicy mogą wrócić do pierwotnie żądanego adresu URL po pomyślnym zalogowaniu. Po uwierzytelnieniu użytkownik jest przekierowywany do pierwotnie żądanego adresu URL.
Przykład ataku
Złośliwy użytkownik może opracować atak mający na celu zapewnienie mu dostępu do danych uwierzytelniających lub wrażliwych informacji. Aby rozpocząć atak, złośliwy użytkownik oszukałby go, by kliknął link do strony docelowej Twojej witryny i dodał do tego adresu wartość querystring returnUrl. abycontoso.comNa przykład aplikacja jest whttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutZawiera stronę docelową. Atak przebiega zgodnie z następującymi krokami:
- Użytkownik klika w złośliwy link dohttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Drugi adres URL to "contoso1.com", zamiast "contoso.com”) 。
- Użytkownik pomyślnie się loguje.
- Użytkownik zostaje przekierowany na stronęhttp://contoso1.com/Account/LogOn(Złośliwa strona, która wygląda dokładnie jak ta prawdziwa).
- Użytkownik loguje się ponownie (podając dane uwierzytelniające do złośliwej strony) i zostaje przekierowany z powrotem na prawdziwą stronę.
- Użytkownicy mogą myśleć, że pierwsza próba logowania się nie powiodła, a druga zakończyła się sukcesem.Prawdopodobnie użytkownicy nadal nie wiedzą, że ich dane uwierzytelniające zostały naruszone。
Oprócz stron docelowych, niektóre serwisy oferują strony przekierowujące lub endpointy. Załóżmy, że Twoja aplikacja ma stronę z otwartym przekierowaniem, /Home/Redirect. Na przykład atakujący może utworzyć punkt w e-mailu[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginłącze. Zwykli użytkownicy zauważą, że adres URL zaczyna się od nazwy Twojej strony. Z zaufania klikają w link. Otwieraj przekierowania, a następnie kieruj użytkowników na strony phishingowe, które wyglądają identycznie jak Twoje, a użytkownicy mogą logować się na strony, które uważają za Twoje.
Zapobieganie otwartym atakom przekierowaniowym
Podczas tworzenia aplikacji webowych wszystkie dane dostarczane przez użytkowników są traktowane jako niewiarygodne. Jeśli Twoja aplikacja ma możliwość przekierowywania użytkowników na podstawie treści URL, upewnij się, że takie przekierowania są wykonywane tylko lokalnie w aplikacji (lub przekierowują do znanych URL, a nie do tych, które mogą być podane w ciągu zapytania).
LocalRedirect
Używając metody pomocniczej kontrolera w klasie bazowej LocalRedirect:
Jeśli podano adres URL nielokalny, LocalRedirect wyrzuca wyjątek. W przeciwnym razie zachowuje się tak samo jak metoda przekierowania. Informacje o wyjątku są następujące:
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. Kod źródłowy przedstawia się następująco:
Proces wykonania: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, a ostatecznie IsLocalUrl zostanie wywołany do oceny (UrlHelperFactory domyślnie implementuje interfejs IUrlHelperFactory. )。
Adres kodu źródłowego:Logowanie do linku jest widoczne.
IsLocalUrl
IsLocalUrl przed przekierowaniem sprawdź adres URL tą metodą:
Kod jest następujący:
Kod testu jest następujący:
Jeśli możesz przejść na inne strony z nazwami domen, możesz zaimplementować interfejs IUrlHelperFactory i zmodyfikować IServiceCollection, aby zastąpić domyślną klasę implementacji podczas uruchamiania programu.
Odniesienie:Logowanie do linku jest widoczne.
(Koniec)
|