[Из песочницы] «Особенности» Тиндера
Informative
Бывают такие баги, которые, вроде как и угрозу безопасности не несут, но вред все-таки могут причинить. Интереснее всего, когда их и править никто не хочет, но и открыто о них нам не говорят. Часто в таких случаях разработчики утверждают, что это не баг, а фича. Именно о двух таких фичах в Тиндере и пойдет речь в посте.
Внимание! Перед тем, как рассказать аудитории Хабра об этих проблемах, мной были предприняты попытки сообщить о них разработчикам через платформу HackerOne. Разработчики посчитали это все «не багами», а репорты были закрыты в статусе «informative», дважды!
Случайности не случайны
Если пользоваться Тиндером так, как раньше пользовался я — не регулярно, то можно заметить следующую штуку: если вы давненько не открывали Тиндер, а потом открыли и поставили несколько лайков, вам обязательно прилетит »MATCH! ».
Замечали? Или я один такой? Может это совпадение и всего лишь очередной когнитивный баг моего мозга, а не приложения? Давайте проверим!
Открыв веб-версию сервиса в Burp, посмотрев запросы и несколько раз их повторив, закономерность была найдена. Допустим у вас есть профиль, которому уже поставили сколько-нибудь лайков люди вокруг вас. Когда вы запускаете приложение заново (не из фона), или когда вы меняете настройки вашего поиска (границы возраста или расстояния) приложение выполняет update запрос — GET /v2/recs/core? locale=ru.
Этот запрос возвращает нам список из 30 барышень/молодых людей (на ваш вкус). В этом списке их имена, возраст, описание профиля и конечно же фотки. Именно эти профили и будут нам далее показаны по очереди приложением, но нам интересен лишь один из этих 30 профилей. Профиль №2! Нет, нет, не из-за фотки. Я ее даже еще не открывал. Тут дело в том, что именно человек со второго профиля вас лайкнул.
Алгоритм Тиндера ВСЕГДА ставит человека который вас лайкнул на второе место в ответе на update запрос, если такой человек в ответе сервера есть.
Получается, чтобы получить максимум »MATCH! » на все лайки, нам всего-то нужно:
- Сделать Update запрос GET /v2/recs/core? locale=ru
- Лайкнуть профиль №2 в списке POST /like/{ SECOND_USER _ID}? locale=ru с параметрами {«s_number»:{ID}, «liked_content_id»:»{SECOND_USER_PHOTO_ID}», «liked_content_type»: «photo»}
- MATCH!
- Повторить пункты 1–3 до истощения лайков
- PROFIT!
Вы великолепны, у вас куча пар. Когда получите еще лайки, не забудьте повторить.
Возможное решение — генерировать случайную позицию, например от 1 до 7.
Не алгоритм, так фото
Когда вас лайкнули, вам показывают крайне размытое фото профиля этого человека. Мой товарищ VVarlock заметил, что размываются фотки лишь на клиенте, а сервер отдает их в исходном виде, что само по себе уже не хорошо. Фотки можно выводить для сравнения глазами или нейросетью. Я решил копнуть глубже, и сразу стало ясно, что все гораздо проще.
Вот пример ссылки на фото из раздела лайков, я вам его немного замаскировал URL, чтоб не смущать девушку:
А вот пример ее же фото из ответа на Update запрос, о котором мы говорили ранее:
ID фотографии неизменен, по нему строковым поиском и можем мы найти профиль вне зависимости от того на каком месте он стоит.
Использование этой «фичи» также легко автоматизируется:
- Запрос с обновлением раздела лайков.
- Собираем ID всех фоток профилей.
- Update запрос.
- Поиск наших ID по списку.
- Если нашли, то лайкаем.
- Повторяем пункты 3–5, пока не найдем всех девушек.
- PROFIT!
Это приносит нам точно такой же профит, как и предыдущий баг.
Возможное решение — генерировать отдельные идентификаторы для фоток «превью» и накладывать «размытие» на сервере.
Резюме
Почему эти фичи плохи для Тиндера? Тиндер живет тем, что мы много лайкаем, гораздо больше, чем лайкают нас. Чтобы видеть свои лайки и отвечать взаимностью только им, нужно покупать Тиндер Голд по подписке 600р в месяц. А с этими фичами он не нужен, что и несет прямой ущерб прибыли компании. Жаль что в самом Тиндере так не посчитали, когда я попытался до них это донести. Может после этого поста хоть закроют?
Для желающих попользоваться — это очень легко автоматизируется, проверено мной на Питоне. Хотя я бы рекомендовал использовать Javascript, чтоб не получать лишних токенов.
Если захотите повторить на Питоне, то обязательно ставьте заголовок «persistent-device-id:» без него сервер не захочет принимать ваши запросы, сгенерировать его можете сами или изменить уже выданный ID сервисом.
Для эксплуатации багов желательно выставить максимальное расстояние и широкие границы по возрасту. Ведь вам показывают лишь тех, кто подходит под ваши параметры. Если вы набрали лайков на Бали, а пытаетесь их превратить в пары в Москве, у вас не получится, ведь этих девушек сервис вам уже не покажет в любом случае. Для подобных экспериментов я советую вам пересоздать профиль с нуля и не менять локацию в пределах 100 км. Баги проверены были в мае, тогда же и отправлены в Тиндер.
P.S. Если кто-то, используя эти баги, найдет свою любовь, отпишитесь мне в личные сообщения — хоть порадуюсь за вас.