Open redirection

Что такое открытая переадресация?

Уязвимость открытой переадресации на основе DOM возникает, когда скрипт записывает контролируемые атакующим данные в приёмник, который может инициировать навигацию между доменами. Например, следующий код уязвим из‑за небезопасной обработки свойства location.hash:

let url = /https?:\/\/.+/.exec(location.hash);
if (url) {
  location = url[0];
}

Атакующий может использовать эту уязвимость, чтобы сконструировать URL, который при посещении вызовет переадресацию на произвольный внешний домен.

Каковы последствия открытой переадресации?

Такое поведение можно использовать, например, для облегчения фишинговых атак против пользователей веб‑сайта. Возможность использовать подлинный URL приложения, нацеленный на корректный домен и с действительным TLS‑сертификатом (если используется TLS), придаёт достоверность фишинговой атаке, поскольку многие пользователи, даже если они проверяют эти признаки, не заметят последующую переадресацию на другой домен. Если атакующий может контролировать начало строки, передаваемой в API переадресации, то потенциально можно эскалировать эту уязвимость до инъекции JavaScript. Атакующий мог бы сконструировать URL с псевдопротоколом javascript:, чтобы выполнить произвольный код при обработке URL браузером.

Какие приёмники могут привести к открытой переадресации?

Ниже приведены некоторые из основных приёмников, которые могут приводить к уязвимостям открытой переадресации на основе DOM:

location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
element.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()

Как предотвратить открытую переадресацию

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

Last updated