# 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:

- A1:2021- Broken Access Control.

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

    @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 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

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

CWE-601 OWASP-5.1.5