Что может быть проще: сброс пароля, подтверждение почты или аутентификация по токену? Но если ваш токен генерируется геморройно простым методом — у злоумышленника появляется прямой доступ к системе. Давайте разберёмся, почему до сих пор взламываются даже крупные сервисы и почему “уникальный токен” — не всегда синоним безопасности.
🟢 Как появляется проблема:
Иногда разработчики генерят токены через стандартные функции вроде
rand() или time(), добавляя к ним user_id или инкрементный счетчик. Примеры из реального мира:- Сброс пароля:
token = md5(time() . user_id)- Авторизация: просто
strval(rand())❗️По факту — это не токен, а открытая дверь, где “замок” известен каждому умеющему читать код. Если сервер при отправке ссылки для сброса пароля проверяет только такой токен — любой, у кого есть доступ к user_id и времени генерации, сможет подобрать нужное значение и получить доступ к чужому аккаунту.
🔊 Как это эксплуатируют:
Самый частый паттерн:
1. Изучаем токен — часто можно декодировать его, видим время или user_id.
2. Получаем user_id жертвы (через API или просто по URL).
3. Генерируем гипотетические значения токена по шаблону, который использует сервер.
4. Подставляем их в запрос — вход срабатывает. Профит.
📌 Даже хуже, если используется стандартный
rand() на популярных языках — достаточно знать seed или время запуска генератора, чтобы воспроизвести последовательность токенов полностью (пример: предсказуемые токены сброса пароля в старых версиях некоторых CMS).🔔 Как делать правильно?
Используйте только криптографически стойкие генераторы случайных чисел:
- Для PHP:
random_bytes() и bin2hex()- Для Python:
secrets.token_urlsafe()- Для Node.js:
crypto.randomBytes()Короче — никогда не генерируйте security-токены с помощью наивных функций и не смешивайте их с очевидными константами (user_id, timestamp и прочее)! Любой аудитор кода обязан сразу поднимать тревогу, видя старые добрые
md5(time()).Когда вы в последний раз проверяли генерацию токенов в своем проекте? Поделитесь кейсами — у кого встречались "простейшие" реализации? 👀
📶 Полезная ссылка: https://cqr.company/ru/web-vulnerabilities/insecure-token-generation/
ЧТНП | #web
