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);
}
// ....
}
Данная диагностика классифицируется как:
|