Zapobieganie otwartym atakom przekierowania w programie ASP.NET Core
Aplikacja internetowa, która przekierowuje do adresu URL określonego za pośrednictwem żądania, takiego jak ciąg zapytania lub dane formularza, może zostać naruszona w celu przekierowania użytkowników do zewnętrznego, złośliwego adresu URL. Ta manipulacja jest nazywana otwartym atakiem przekierowania.
Za każdym razem, gdy logika aplikacji przekierowuje do określonego adresu URL, musisz sprawdzić, czy adres URL przekierowania nie został naruszony. ASP.NET Core ma wbudowane funkcje ułatwiające ochronę aplikacji przed otwartym przekierowaniem (znanym także jako otwarte przekierowanie).
Co to jest otwarty atak przekierowania?
Aplikacje internetowe często przekierowują użytkowników do strony logowania, gdy uzyskują dostęp do zasobów wymagających uwierzytelniania. Przekierowanie zwykle zawiera returnUrl
parametr ciągu zapytania, dzięki czemu użytkownik może zostać zwrócony do pierwotnie żądanego adresu URL po pomyślnym zalogowaniu. Po uwierzytelnieniu użytkownika nastąpi przekierowanie do adresu URL, którego pierwotnie zażądał.
Ponieważ docelowy adres URL jest określony w ciągu zapytania żądania, złośliwy użytkownik może manipulować ciągiem zapytania. Naruszone ciągi zapytań mogą umożliwić witrynie przekierowanie użytkownika do zewnętrznej, złośliwej witryny. Ta technika jest nazywana atakiem otwartego przekierowania (lub przekierowania).
Przykładowy atak
Złośliwy użytkownik może opracować atak przeznaczony do umożliwienia złośliwemu użytkownikowi dostępu do poświadczeń użytkownika lub poufnych informacji. Aby rozpocząć atak, złośliwy użytkownik przekona użytkownika do kliknięcia linku do strony logowania witryny z wartością returnUrl
ciągu zapytania dodaną do adresu URL. Rozważmy na przykład aplikację zawierającą contoso.com
stronę logowania pod adresem http://contoso.com/Account/LogOn?returnUrl=/Home/About
. Atak jest zgodny z następującymi krokami:
- Użytkownik klika złośliwy link (
http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn
drugi adres URL to "contoso1.com", a nie "contoso.com"). - Użytkownik loguje się pomyślnie.
- Użytkownik jest przekierowywany (przez witrynę) do
http://contoso1.com/Account/LogOn
witryny (złośliwa witryna, która wygląda dokładnie tak jak rzeczywista witryna). - Użytkownik zaloguje się ponownie (dając złośliwą witrynę swoje poświadczenia) i zostanie przekierowany z powrotem do rzeczywistej witryny.
Użytkownik prawdopodobnie uważa, że ich pierwsza próba zalogowania się nie powiodła się i że druga próba zakończy się pomyślnie. Użytkownik najprawdopodobniej nie wie, że jego poświadczenia zostały naruszone.
Oprócz stron logowania niektóre witryny udostępniają strony przekierowania lub punkty końcowe. Załóżmy, że aplikacja ma stronę z otwartym przekierowaniem. /Home/Redirect
Osoba atakująca może na przykład utworzyć link w wiadomości e-mail, która przechodzi do adresu [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login
. Typowy użytkownik przyjrzy się adresowi URL i zobaczy, że zaczyna się od nazwy witryny. Ufając, że klikną link. Otwarte przekierowanie spowoduje wysłanie użytkownika do witryny wyłudzania informacji, która wygląda identycznie z Twoimi danymi, a użytkownik prawdopodobnie zaloguje się do twojej witryny.
Ochrona przed otwartymi atakami przekierowania
Podczas tworzenia aplikacji internetowych należy traktować wszystkie dane dostarczone przez użytkownika jako niezaufane. Jeśli aplikacja ma funkcję, która przekierowuje użytkownika na podstawie zawartości adresu URL, upewnij się, że takie przekierowania są wykonywane tylko lokalnie w aplikacji (lub do znanego adresu URL, a nie żadnego adresu URL, który może zostać podany w ciągu zapytania).
LocalRedirect
Użyj metody pomocniczej LocalRedirect
z klasy bazowej Controller
:
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}
LocalRedirect
wyrzuci wyjątek, jeśli określono adres URL inny niż lokalny. W przeciwnym razie zachowuje się tak samo jak metoda Redirect
.
IsLocalUrl
IsLocalUrl Użyj metody , aby przetestować adresy URL przed przekierowaniem:
W poniższym przykładzie pokazano, jak sprawdzić, czy adres URL jest lokalny przed przekierowaniem.
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
Metoda IsLocalUrl
chroni użytkowników przed przypadkowo przekierowaniem do złośliwej witryny. Możesz zarejestrować szczegóły adresu URL, który został podany, gdy adres URL inny niż lokalny jest dostarczany w sytuacji, w której oczekiwano lokalnego adresu URL. Rejestrowanie adresów URL przekierowania może pomóc w diagnozowaniu ataków przekierowania.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla