А вы уверены, что вы не робот? Капча это проверит!
Здравствуйте, дорогие хабровчане. Это вторая часть статьи про уязвимость Open Redirect страницы аутентификации Яндекса. Первая часть здесь.
На этот раз я расскажу, как получилось сделать честный редирект на внешний ресурс.
Важное примечание: я спросил разрешения у службы информационной безопасности Яндекса на описание этой потенциальной уязвимости, и получил на это разрешение.
Яндекс всё таки признал, что этот метод можно использовать в зловредных целях. Однако решил, что с точки зрения безопасности подобный баг не представляет большой угрозы. Про аргументы и причины можно прочитать под катом, также как и про доводы автора. По этому поводу добавил опрос в конце поста, любопытно узнать мнение сообщества.
Вкратце напомню, что было в первой части. Я исследовал на уязвимости редирект страницы аутентификации https://passport.yandex.ru/auth/welcome?retpath=...
и заметил, что переменную retpath
можно использовать для редиректа на внешний ресурс, если проксировать запрос через яндекс-переводчик.
Суть в том, что retpath
реагирует только на доменные имена Яндекса — yandex.ru
, dzen.ru
, kinopoisk.ru
и т.д., однако это ограничение можно обойти, если использовать переход на страницу с капчей, которая как раз находится в нужном нам домене https://translate.yandex.ru/showcaptcha?mt=...
. Таким образом, мне удалось добиться перехода на домен translated.turbopages.org
, который и является прокси-сервером через переводчик, retpath
его также отбраковывает как внешний ресурс.
Хорошо заметен баннер переводчика сверху и отличная от загруженной ссылки адресная строка в браузере.
После того, как я описал это службе безопасности Яндекса, получил ответ, что переход на translated.turbopages.org
это не круто и Open Redirect не входит в скоуп программы bug bounty. Денег мы вам не заплатим, но если сможете сделать честный редирект на внешний ресурс, то так уж и быть, добавим вас в зал славы.
Тут нужно сделать небольшое отступление. Не так давно, буквально полмесяца назад от публикации этой статьи, злоумышленники взломали телеграм известного дизайнера и блогера Артемия Лебедева, о чём он сам и сообщил в своём видео (осторожно, ненормативная лексика!).
Самое примечательное, это как он описывает сам процесс, а именно:
- Сперва пришла ссылка в письме с просьбой выгрузить статистику канала;
- Он её проверил(!) и посмотрел, что ссылка с известного и правильного домена, который он хорошо знал;
- Далее, уже после перехода по этой ссылке, его попросили ввести логин/пароль, мобильный телефон, код из смс и т.д.
Не то, чтобы я точно знал, но можно предположить с большой долей уверенности, что это и был фишинг. А теперь представьте на секунду, что вам приходит ссылка с предложением чего-нибудь с домена passport.yandex.ru
и просьбой аутентификации… дальше продолжать не буду, как видно, это вполне рабочий метод. Вот тут у меня и возникает вопрос, почему в Яндексе подобную уязвимость не считают существенной (текст ответного письма будет опубликован далее).
И так продолжу разбирать саму уязвимость. То, что было описано в первой части — это по сути первый шаг, т.е. возможность с домена yandex.ru
перейти на прокси-сервер переводчика.
Оставалось ещё сделать второй и третий шаги, т.е. — выйти за пределы переводчика (прокси-сервера) и связать переход со страницы аутентификации с этим выходом.
Второй шаг решился довольно просто, как известно в интернете есть очень популярный сайт, который делает честный редирект, это google.com.
Обратите внимание, что в ссылке домен google.com
, но ведёт она на ru.wikipedia.org
Шаг третий — оказался очень простым. В сущности, всё, что описывается в первой части статьи нужно проделать, только в качестве внешнего ресурса — использовать нашу google ссылку.
В итоге получаем чистый переход на внешний ресурс!
Итак, как это можно использовать? Будь я чёрной шляпой, скорее всего, создал бы клон страницы аутентификации. После того, как жертва ввела бы правильные логин/пароль, retpath
перевёл бы пользователя на мою фейковую страницу, на которой красными буквами было бы написано — “пароль не правильный, пожалуйста, введите его снова”. Частенько такое бывает, что пароль или логин не вводят правильно, думаю, что это не вызовет сильного подозрения.
Первый бонус: через какое-то время, примерно сутки, вводить капчу не требуется, т.е. можно сразу перевести пользователя на сайт злоумышленника.
Второй бонус: есть случай, когда регистрация на самом деле не нужна, т.к. на нашей странице аутентификации появляется ссылка “стрелочка назад”, которая сразу делает редирект.
Причём, эта стрелка появляется только тогда, года в retpath
подставлен домен Яндекса.
Третий бонус: как только пользователь прошёл по Open Redirect ссылке, как бы он не регистрировался, любым из множества способов, он будет перенаправлен на сайт злоумышленника.
Более подробное описание шагов можно посмотреть в этом видео:
Письмо с ответом из Яндекса:
Мы решили добавить Вас в Зал Славы за этот месяц. Нас вдохновил Ваш исследовательский дух, однако стоит уточнить, что полноценным Open Redirect мы данную уязвимость всё ещё не считаем, и добавляем в зал славы Вас в качестве исключения. На это есть несколько причин.
Во-первых, для реализации этого сценария требуется 3 клика от пользователя (1 по самой ссылке, 1 на экране регистрации и 1 на капче), в то время как Open Redirect — это почти всегда 1 клик (иногда бывает и 0). Чем больше требуется user-interaction с пользователем, тем меньше значимость это уязвимости. Возвращаясь к текущему функционалу злоумышленнику будет проще воспользоваться укротителем ссылок и убедить пользователя, что он сделал это для его удобства, чем объяснять как и зачем ему нужно тыкать в текущем сценарии.
Во-вторых, этот функционал мы не будем исправлять. По крайней мере пока не понятно, как это сделать. Наша команда смогла придумать ещё один способ выхода за пределы домена translated.turbopages.org. А именно, использовать простенький javascipt-код, который бы делалdocument.location = “https://attacker.com/“
.
Тем не менее, благодарим Вас за проделанное исследование и ждём от Вас ещё репортов!
P.S. меня добавили в зал славы за июль 2023 года, и на том спасибо.