Около месяца назад я наткнулся на форму приглашения друзей через почту и/или номер мобильного телефона (который в добровольно-принудительном порядке требуют при регистрации). Я не долго думаю вставил в форму 1500 случайных номеров, по 500 в каждом формате (89*********, +79*********, 9*********). Поле «Сообщение» оставил пустым. На следующее утро меня ждал сюрприз: пара десятков новых диалогов, в которых я начинал разговор с сообщения «Optional message». Не долго думая я отправил отчет через форму на Facebook. Но после недельного ожидания и повторного отчета мне пришёл ответ: «This is not a bug. It's a core Facebook feature.».
Что мы имеем
- В России 52 кода мобильных операторов, зато Украина имеет только 16, а у Белоруссии их всего 4.
- После каждого кода идет семизначный номер. То есть 10 000 000 возможных комбинаций.
- По разным, неподтвержденным, данным в России как минимум 7 миллионов пользователей Facebook, у Украины 2.5 миллиона, а у Белоруссии более 400 тысяч.
- Итого 520 / 7 ≈ 74 номеров на пользователя в России, 160 / 2.5 = 64 в/на Украине и 40 / 0.4 = 100 в Белоруссии.
Таким образом выгодней всего подбирать номера телефонов украинцев.
Алгоритм действий
Для начала необходимо сгенерировать все возможные номера. Возьмем 16 кодов и для каждого подставим числа от 0 до 10 миллионов. Так как плотность пользователей на один номер телефона достаточна высока, то можно смело делить список на группы по 50 номеров. В итоге мы получим 160 000 000 / 50 = 3 200 000 блоков.
Запрос на сервер Facebook занимает в среднем до 200 мс (зависит от канала). Таким образом один клиент может генерировать в один поток 5 запросов в секунду. 3.2М / 5 / 60сек / 60мин ≈ 177.7 часов, что есть чуть дольше недели. Удвоение потоков и/или клиентов будет сокращать временные затраты вдвое.
Поиск совпадений достаточно прост:
- Отправить запрос (приглашение) через форму одному блоку номеров, указав в сообщении случайную последовательность букв (возможно хэш блока).
- После отправки запроса Facebook в течении нескольких часов пройдется по списку и отправит запросы в друзья тем, кто уже есть на Facebook, а также уведомит их отправив личное сообщение с указанным хэшем. Плюс Facebook в том, что пока пользователь не добавил в друзья (и если стоят базовые настройки приватности), то отправленное сообщение попадет в папку «Другие», а пользователь не получит уведомления.
- Нам достаточно проверить диалоги клиента и сравнить хэш из сообщения с сохраненными хэшами.
- В случае совпадения, блок можно разбить на меньшие куски и повторить запрос.
Из явных недостатков: кол-во запросов и сообщений слишком велико чтобы Facebook не заметил подвоха. Это легко решается дополнительными аккаунтами и прокси серверами. Также пользователь может понять что его номер кто-то использовал в форме приглашения: он получит приглашение в друзья и сообщение. Это можно решить моментальной отменой приглашения (уведомление на почту пользователь все-же получит) или добавлением пользователя в черный список сразу после нахождения номера.
Из плюсов: по дефолту у всех совершеннолетних пользователей включена возможность найти их по номеру телефона (можно отключить в настройках приватности) и обычно привязанный номер также подключен к онлайн банкам, киви, WebMoney кошелькам и т.д.
P.S. Для защиты, в настройках приватности можно выбрать тех кто сможет искать вас по адресу электронной почты и номеру телефона.
Автор: xeos