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:

  1. 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").
  2. Użytkownik loguje się pomyślnie.
  3. 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).
  4. 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.

Open Redirection Attack Process

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.