Вход в MAX без пароля, СМС и QR — две команды в консоли браузера
СМС не приходит, пароль я не помнил, наводить камеру на QR было лень. И вот сижу я перед веб-версией MAX и думаю: а ведь браузер уже всё про меня знает. Знает. В web.max.ru можно зайти вообще без пароля, СМС и QR — тем, что браузер хранит у себя сам. Проверял руками, работает. Показываю по шагам, так что повторит даже бабушка.
Сразу оговорюсь, чтобы потом не было вопросов.
Всё, что ниже, выложено в познавательных целях. Никакого взлома и никаких эксплойтов тут нет, и я ничего не изобретал. Команды, которые вы увидите, — штатные операторы самого MAX, спокойно живущие в продакшене. Зачем их там оставили — вопрос отдельный. Есть версия — пишите в комментах, интересно собрать гипотезы. Делайте это только со своим аккаунтом. За то, что вы творите со своими же ключами, отвечаете вы, а не я.
Что вообще происходит
Когда вы один раз вошли в web.max.ru, браузер сохраняет токен. Это длинная строка-пропуск, по ней MAX вас и узнаёт. Лежит она в localStorage — это маленькое локальное хранилище страницы прямо внутри вашего браузера, отдельное на каждый сайт. Добраться до него можно через консоль разработчика. Та самая чёрная панель, которая в любом Chrome уже встроена. Ставить ничего не надо.
Так вот, этот токен можно скопировать и подсунуть в другой браузер. И он войдёт. Без пароля, без СМС, без QR. Это не дыра и не магия — это ровно то, на чём держится обычный вход, просто увиденное с изнанки.
Дальше по шагам. Две части: в первой берём токен там, где вы уже вошли, во второй вставляем его туда, куда хотим попасть.
Часть 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":. То есть от первого символа после "token":" и до кавычки перед ,"viewerId". В примере это AbCd3Fg...очень длинная строка...Xy9Z. Фигурные скобки, слово token, viewerId и число — НЕ копируйте.
Часть 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 или вообще не пускает — токен устарел. Возьмите свежий по Части 1, живут они недолго.
— Красная ошибка в Части 1 — вы не вошли в MAX на исходном браузере. Сначала залогиньтесь, чтобы были видны чаты.
— Не вставляется в строку консоли — повторите allow pasting.
— Красные строчки про apptracer или ERR_BLOCKED_BY_CLIENT — это блокировщик рекламы, ко входу отношения не имеет, не пугайтесь.
По безопасности коротко
Токен — это ключ от аккаунта. Никому его не показывайте и не суйте в чужие браузеры. Берите свежий прямо перед входом. И учтите: вход с нового устройства MAX вполне может счесть подозрительным.
Никакого волшебства тут нет. Это то, что MAX держит у себя сам, и любой DevTools показывает за десять секунд. Функции остались в проде, токен один на все браузеры, выход рвёт сессию у всех. Что делать с этим знанием — решайте сами.