PVS-Studio.com logo
>
>
>
V5324. OWASP. Possible open redirect vu…


V5324. OWASP. Possible open redirect vulnerability. Potentially tainted data is used in the URL.

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

Уязвимости типа open redirect относятся к категории рисков OWASP Top 10 Application Security Risks 2021:

Приведём пример:

@GetMapping("/redirectExample")
public RedirectView redirect(@RequestParam("url") String url) {
  return new RedirectView(url);
}

В этом примере url может содержать заражённые данные, так как они получены из внешнего источника. Эти данные используются для перенаправления клиента на адрес, который записан в url. Подобная логика работы программы упрощает проведение фишинговых атак для кражи данных пользователя.

Пример скомпрометированного адреса:

URL: http://mySite.com/login?url=http://attacker.com/

Возможный сценарий проведения атаки:

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

Главная опасность open redirect состоит в том, что ссылка, полученная от злоумышленника, фактически ведёт на сайт, которому пользователь доверяет. Следовательно, жертва с большей вероятностью перейдёт по ней.

Для защиты от open redirect стоит проверять, что перенаправление осуществляется на локальный адрес или на адрес из белого списка.

Исправленный пример:

private static final List<String> ALLOWED_SITES = List.of(
            "https://goodsite.com",
            "https://verygoodsite.com"
    );

@GetMapping("/redirectExample")
public RedirectView redirect(@RequestParam("url") String url) {
  if (ALLOWED_SITES.contains(url)) {
    return new RedirectView(url);
  }
  // ....
}

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как: