Открытые редиректы: когда настоящая надёжная ссылка ведёт к злоумышленнику
Наводишь курсор на ссылку, видишь google.com или название хорошо знакомого сайта — и переходишь по ней без опаски. Однако попадаешь на фишинговую страницу. Это не ошибка отображения и не подделка адреса: ссылка действительно изначально вела на настоящий сайт. Это механика открытого редиректа (open redirect).
Что такое открытый редирект?
Многие сайты предлагают совершенно легитимную функцию: перенаправлять посетителя на другой адрес после какого-либо действия, например после входа в систему, клика по спонсорской ссылке или через сокращатель ссылок. Сайт получает в своём URL адрес назначения, а затем отправляет браузер по этому адресу.
Уязвимость возникает, когда сайт принимает любой адрес назначения, не проверяя, входит ли он в список разрешённых. Разработчики создали полезный сервис редиректов; они просто забыли закрыть чёрный ход. Тогда кто угодно может сделать ссылку, которая начинается с имени доверенного сайта, но в итоге ведёт совсем в другое место — к злоумышленнику.
Анатомия ловушки в ссылке
Возьмём намеренно упрощённый пример структуры:
https://www.google.com/url?q=https://site-pirate.example
Эта ссылка действительно открывается на серверах Google: доменное имя google.com подлинное, и в адресной строке об этом ничего не лжёт. Но параметр ?q= несёт второй адрес, который становится настоящим пунктом назначения после срабатывания редиректа. Тот же приём встречается и с другими не менее распространёнными именами параметров: ?dest=, ?redirect=, ?target=, ?next=, или же ?url=. Заметить одно из этих ключевых слов сразу после знака вопроса, за которым следует второй веб-адрес, — самый простой сигнал, за которым стоит следить.
Почему злоумышленники обожают эту технику
Этот метод решает для злоумышленника сразу две проблемы.
- Обход спам-фильтров. Шлюзы безопасности почты (Secure Email Gateways) присваивают оценку доверия доменам, присутствующим в письме. Ссылка, начинающаяся с чрезвычайно репутационного домена, например поисковика или крупной социальной сети, часто получает отличную оценку, даже если фильтр никогда не смотрит на скрытую часть ссылки.
- Манипуляция человеческим восприятием. Осторожный человек привык проверять доменное имя перед тем, как кликнуть. Столкнувшись с такой ссылкой, эта проверка играет против него: он ясно видит название официального бренда в самом начале адреса и на этом останавливается, не читая дальше.
Таким образом, приём пользуется доверием — как техническим (оценка спам-фильтра), так и человеческим (рефлекс чтения), — не имитируя при этом ни домен, ни серверы доверенного сайта.
Под капотом: коды 301, 302 и цепочки редиректов
Технически редирект разыгрывается в очень коротком ответе сервера браузеру. Сервер отвечает кодом состояния HTTP, не показывая никакой видимой страницы: 302 — для временного редиректа, 301 — для постоянного. Браузер немедленно подчиняется и загружает следующий адрес, а пользователь ничего не видит.
Ничто не мешает выстроить цепочку из нескольких редиректов подряд: очень репутационный домен A ведёт к более скромному и, в свою очередь, уязвимому домену B, а тот — к финальной фишинговой странице. Каждое дополнительное звено ещё больше запутывает след и усложняет работу тому, кто захотел бы проследить ссылку до её источника, просто взглянув на неё.
Как распознать ловушку и отреагировать
Правильный метод состоит в том, чтобы читать полный адрес слева направо, не останавливаясь на первом узнанном имени. Сигнал, который нужно искать, прост: второй http:// или https://, спрятанный дальше в той же строке, почти всегда сигнализирует об открытом редиректе, как и наличие параметра вроде ?q= или ?url= прямо перед ним. Эта бдительность перекликается с той, что нужна для чтения обманчивого доменного имени другими способами, например через похожие буквы: см. руководство Punycode и омографы.
Чтобы проверить пункт назначения без всякого риска, можно вставить адрес в онлайн-резолвер ссылок или запустить команду curl -I из терминала: сервер ответит кодом редиректа и конечным пунктом назначения, ни разу не загрузив страницу в браузере.
Полезны два сообщения, касающиеся двух разных сторон. Сначала уведомляют компанию, чей домен служит отправной точкой (например, через её форму безопасности или адрес, посвящённый уязвимостям), чтобы она исправила непроверяемый параметр в своём коде. Затем уведомляют хостинг-провайдера конечной страницы, точно так же, как в случае с любой фишинговой страницей (см. как найти нужный адрес abuse@ у хостинг-провайдера), поскольку именно он может заставить её исчезнуть.
Письмо, содержащее подобную ссылку, остаётся, помимо прочего, письмом, отправленным настоящим сервером, со своим собственным следом: см. руководство Анализ фишинга: от сообщения до инфраструктуры. Вставив полное письмо в Baitback, инструмент сам проследит всю цепочку редиректов вплоть до финальной страницы, без необходимости кликать или открывать терминал.
- Открытый редирект — это легитимная функция, использованная не по назначению: исходный сайт настоящий, пункт назначения — не обязательно.
- Параметры, за которыми стоит следить, выглядят как
?q=,?url=,?redirect=,?dest=,?target=или?next=. - Эта техника обманывает как спам-фильтры, благодаря репутации первого домена, так и человеческое восприятие, которое часто останавливается слишком рано.
- Коды 301 и 302 позволяют выстроить цепочку из нескольких невидимых редиректов перед тем, как попасть на ловушку.
- Нужно читать ссылку целиком и уведомлять как исходный сайт (чтобы он исправил уязвимость), так и хостинг-провайдера конечной страницы.