Предотвращение открытых атак перенаправления в ASP.NET Core

Веб-приложение, которое перенаправляется по URL-адресу, указанному через запрос, например данные строки запросов или формы, могут быть изменены для перенаправления пользователей на внешний, вредоносный URL-адрес. Это изменение называется атакой открытого перенаправления.

Всякий раз, когда логика приложения перенаправляется на указанный URL-адрес, необходимо убедиться, что URL-адрес перенаправления не был изменен. ASP.NET Core имеет встроенные функции для защиты приложений от открытых атак перенаправления (также известных как открытый перенаправлений).

Что такое атака открытого перенаправления?

Веб-приложения часто перенаправляют пользователей на страницу входа при доступе к ресурсам, которым требуется проверка подлинности. Перенаправление обычно включает returnUrl параметр запроса, чтобы пользователь смог вернуться к исходно запрошенному URL-адресу после успешного входа. После проверки подлинности пользователя он перенаправляется по URL-адресу, который он первоначально запрашивал.

Так как целевой URL-адрес указан в запросе, злоумышленник может изменить строку запроса. Измененная строка запроса может позволить сайту перенаправлять пользователя на внешний вредоносный сайт. Этот метод называется атакой открытого перенаправления (или перенаправления).

Пример атаки

Злоумышленник может разработать атаку, предназначенную для предоставления злоумышленнику доступа к учетным данным пользователя или конфиденциальной информации. Чтобы начать атаку, злоумышленник убеждает пользователя щелкнуть ссылку на страницу входа сайта со значением returnUrl запроса, добавленным в URL-адрес. Например, рассмотрим приложение, contoso.com включающее страницу входа.http://contoso.com/Account/LogOn?returnUrl=/Home/About Атака выполняет следующие действия:

  1. Пользователь щелкает вредоносную ссылку http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (второй URL-адрес — contoso1.com, а не "contoso.com").
  2. Пользователь успешно входит в систему.
  3. Пользователь перенаправляется (сайтом) http://contoso1.com/Account/LogOn на (вредоносный сайт, который выглядит точно так же, как реальный сайт).
  4. Пользователь снова входит в систему (предоставляя вредоносный сайт свои учетные данные) и перенаправляется обратно на реальный сайт.

Пользователь, скорее всего, считает, что первая попытка войти в систему завершилась неудачно, и что их вторая попытка выполнена успешно. Пользователь, скорее всего, не знает, что их учетные данные скомпрометируются.

Open Redirection Attack Process

Помимо страниц входа некоторые сайты предоставляют страницы перенаправления или конечные точки. Представьте, что приложение имеет страницу с открытым перенаправлением. /Home/Redirect Злоумышленник может создать, например, ссылку на сообщение электронной почты.[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login Типичный пользователь будет просматривать URL-адрес и видеть его начало с вашего имени сайта. Доверяя тому, они щелкнут ссылку. После этого открытое перенаправление отправит пользователя на фишинговый сайт, который выглядит идентично вашему, и пользователь, скорее всего, войдет в то, что они считают вашим сайтом.

Защита от атак на открытые перенаправления

При разработке веб-приложений следует рассматривать все предоставленные пользователем данные как ненадежные. Если приложение имеет функциональные возможности, которые перенаправляют пользователя на основе содержимого URL-адреса, убедитесь, что такие перенаправления выполняются только локально в приложении (или на известный URL-адрес, а не любой URL-адрес, который может быть предоставлен в запросе).

LocalRedirect

Используйте вспомогательный LocalRedirect метод из базового Controller класса:

public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl);
}

LocalRedirect вызовет исключение, если указан не локальный URL-адрес. В противном случае он ведет себя так же, как Redirect метод.

IsLocalUrl

IsLocalUrl Используйте метод для проверки URL-адресов перед перенаправлением:

В следующем примере показано, как проверка, является ли URL-адрес локальным перед перенаправлением.

private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}

Метод IsLocalUrl защищает пользователей от непреднамеренного перенаправления на вредоносный сайт. Вы можете записать сведения о URL-адресе, предоставленном при указании не локального URL-адреса в ситуации, когда вы ожидали локальный URL-адрес. URL-адреса перенаправления ведения журнала могут помочь в диагностике атак перенаправления.