Поделиться через


Предотвращение открытых атак перенаправления в 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. Пользователь снова входит в систему (предоставляя свои учетные данные вредоносному сайту) и перенаправляется обратно на реальный сайт.

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

Процесс атаки с открытым перенаправлением

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

Защита от атак посредством открытых перенаправлений

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

Локальное перенаправление

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

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

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

IUrlHelper.IsLocalUrl

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

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

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

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

Определение локального URL-адреса с помощью RedirectHttpResult.IsLocalUrl

Вспомогательный RedirectHttpResult.IsLocalUrl(url) метод определяет, является ли URL-адрес локальным. URL-адрес считается локальным, если выполняются следующие условия:

URL-адреса с виртуальными путями "~/" также являются локальными.

IsLocalUrl полезно для проверки URL-адресов перед перенаправлением на них, чтобы предотвратить атаки открытого перенаправления.

if (RedirectHttpResult.IsLocalUrl(url))
{
    return Results.LocalRedirect(url);
}