Вход в MAX без пароля, СМС и QR: две команды в консоли. Разбираемся, почему это работает

Начну не с инструкции, а с наблюдения. В веб-версии MAX вход устроен так, что одна длинная строка из хранилища браузера заменяет собой пароль, СМС и QR разом. Строка называется токен. Скопировал в другой браузер — и он войдёт. Без подтверждений. Я это проделывал руками, показываю по шагам.

Дальше любопытнее. Это не дыра, которую кто-то нашёл и обошёл защиту. Это код самого MAX. Функции, которые читают и пишут токен, лежат в продакшене и доступны через обычный DevTools — тот, что открывается по Ctrl+Shift+J в любом Chrome. Никаких сторонних инструментов. Десять секунд и две команды.

И ещё одна деталь, к которой я вернусь в конце. Токен — не «логин с устройства». Для сервера два браузера на одном токене — это одна сессия. Не две. Одна на всех.

Дисклеймер. Всё, что ниже, опубликовано в познавательных целях. Взлома и эксплойтов тут нет, и автор ничего не изобретал. Команды, которые вы увидите, — штатные операторы самого MAX, спокойно живущие в продакшене. Зачем их там оставили — вопрос отдельный. Если у вас есть версия, напишите в комментариях, интересно собрать гипотезы. Делайте это только со своим аккаунтом. За то, что вы творите со своими же ключами, отвечаете вы, а не я.

Ниже — как это повторить на своём аккаунте. Сначала механика, потом сам разбор, почему так.

Что вообще происходит

Когда вы один раз вошли в web.max.ru, браузер сохраняет токен — длинную строку-пропуск, по которой MAX вас узнаёт. Лежит он в localStorage — это локальное хранилище страницы прямо в вашем браузере, к нему есть доступ через консоль разработчика (DevTools). Ключ, под которым лежит токен, — __oneme_auth. Этот токен можно скопировать и подсунуть в другой браузер. Он войдёт. Без пароля, без СМС, без QR.

Это не дыра и не магия — это ровно то, на чём работает обычный вход, просто увиденное с изнанки. Для тех, кто не пишет код: localStorage — маленькое хранилище внутри браузера для конкретного сайта. DevTools — встроенная панель разработчика, в любом Chrome она уже есть. Ставить ничего не надо.

Дальше по шагам.

Часть 1. Браузер, где вы уже вошли: берём токен

Нужен только токен — одна длинная строка. Больше ничего копировать не надо.

1. Откройте web.max.ru, где видны ваши чаты.

2. Нажмите Ctrl+Shift+J. Откроется чёрное окно консоли.

3. Первый раз в этом браузере консоль не даст вставить команду — наберите руками allow pasting и Enter (один раз на браузер, потом не нужно). Без этого будет ошибка.

4. Вставьте строчку и нажмите Enter — она копирует только токен в буфер:

copy(JSON.parse(localStorage.__oneme_auth).token)

5. Внизу появится undefined — это нормально. Токен уже в буфере обмена, на экран он не выводится.

Хотите увидеть токен своими глазами и скопировать руками — выполните вместо этого:

console.log(JSON.parse(localStorage.__oneme_auth).token)

В консоли появится просто длинная строка без кавычек — это и есть токен целиком, его и копируйте.

Если же вы открыли всё хранилище (console.log(localStorage.__oneme_auth)), то увидите такую строку (пример выдуманный):

{"token":"AbCd3Fg...очень длинная строка...Xy9Z","viewerId":123456789}

Отсюда копируйте только токен — то, что стоит в кавычках сразу после token. В примере это AbCd3Fg...очень длинная строка...Xy9Z. Фигурные скобки, слова token и viewerId и число — НЕ копируйте.

Консоль открыта; в строке ввода команда копирования токена.
Консоль открыта; в строке ввода команда копирования токена.
После Enter внизу появляется undefined — токен уже в буфере.
После Enter внизу появляется undefined — токен уже в буфере.

Часть 2. Браузер, в который нужно войти: вставляем токен

Главное правило: сначала команда и Enter, и только потом — токен в появившееся окошко. В саму команду токен не вставляется.

1. Откройте web.max.ru. Будет экран с QR. Так и нужно: значит, вы не залогинены.

2. Нажмите Ctrl+Shift+J.

3. Если в этом браузере ещё не разрешали вставку — allow pasting и Enter (как в Части 1).

4. Вставьте команду и нажмите Enter (токен пока не трогайте):

m=prompt('Вставьте токен');if(m){localStorage.setItem('__oneme_auth',JSON.stringify({token:m.trim()}));location.reload()}

5. Выскочит окошко. В него вставьте токен из Части 1 и нажмите OK.

6. Страница перезагрузится и войдёт.

Экран с QR; в консоли команда вставки токена.
Экран с QR; в консоли команда вставки токена.
Всплывающее окошко — сюда вставляется токен, дальше OK.
Всплывающее окошко — сюда вставляется токен, дальше OK.
Готово: вход без пароля, чаты загрузились.
Готово: вход без пароля, чаты загрузились.

Одна сессия на всех — вот что тут интересно

Теперь разбор, ради которого всё затевалось. Вход по токену с другого компьютера или браузера — для сервера это, по сути, тот же самый вход, что и по QR. Не новый, а тот же: оба браузера сидят на одном токене. Отсюда два следствия.

Первое: пока никто не нажимает «Выйти», сессия живёт и работает сразу везде, где вставлен токен.

Второе: как только кто-то один выйдет из аккаунта (или завершит сессию в настройках устройств) — токен становится недействительным сразу для всех браузеров, а не только у того, кто вышел.

Практический вывод простой. Закрыть вкладку — безопасно, токен живёт дальше. А «Выйти из аккаунта» рвёт вход всем, кто сидит на этом токене.

Если не сработало

— Снова QR или вообще не вошло — токен устарел. Возьмите свежий в Части 1. Токены живут недолго.

— Красная ошибка в Части 1 — вы не вошли в MAX на исходном браузере. Сначала войдите, чтобы были видны чаты.

— Не вставляется в строку консоли — повторите allow pasting.

— Красные строчки про apptracer или ERR_BLOCKED_BY_CLIENT — это блокировщик рекламы, к входу отношения не имеют.

По безопасности коротко. Токен — это ключ от аккаунта, никому не показывайте. Берите свежий перед входом. Вход с нового устройства MAX может счесть подозрительным.

Никакого волшебства тут нет. Это то, что MAX держит у себя сам, и любой DevTools показывает за десять секунд. Функции остались в проде, токен один на все браузеры, выход рвёт сессию у всех. Что делать с этим знанием — решайте сами.

1