Перейти к содержимому
← Каталог golang Auth Bypass

JWT: Подбор слабого секретного ключа

Приложение подписывает JWT токеном HMAC-SHA256 со слабым ключом. Подбери секрет и подделай токен администратора.

mediumgolangPro
Задача
# JWT: подбор слабого секретного ключа HMAC ## Сценарий Ты проводишь аудит безопасности **SecureShop**. Приложение использует JWT (JSON Web Tokens) для аутентификации: сервер выдаёт подписанный HMAC-SHA256 токен, который хранится в cookie `token`. Команда уверена, что эндпоинт-валидатор JWT корректно проверяет подпись и доверяет содержимому только при валидной сигнатуре. По данным внутреннего аудита, в админ-панели хранится конфиденциальная метка, доступная только пользователям с ролью администратора; её требуется извлечь, имея только обычную учётную запись. ## Цель 1. Получите выданный сервером JWT-токен после логина обычного пользователя; декодируйте header и payload (без верификации) для разведки структуры. 2. Найдите способ подписать произвольный токен — без знания серверного секрета через атаку, не требующую взаимодействия с сервером. 3. Получите доступ к админ-панели и извлеките флаг. ## Теория Когда JWT подписан симметричным алгоритмом HMAC, безопасность всей схемы целиком зависит от **энтропии секретного ключа**. Криптостойкая стойкость HMAC-SHA256 не имеет значения, если злоумышленник может перебрать сам ключ: атака полностью офлайновая, не требует обращения к серверу, не оставляет следов в логах. Достаточно одного валидного токена (получаемого через обычный логин) и словаря/набора правил перебора. **Уязвимый паттерн:** ```go // Слабый HMAC-секрет — fixed dictionary word, низкая энтропия var jwtSecret = []byte("secret") ``` Согласно RFC 8725 (BCP для JWT), HMAC-секрет должен содержать минимум столько энтропии, сколько даёт сам алгоритм — для HS256 это 256 бит (32 случайных байта). Сcrooll-словарные значения (`secret`, `key`, `password`, `jwt_secret`, `your_secret_key`) — типичные «default-значения» из туториалов и примеров кода; они подбираются за миллисекунды на ноутбуке инструментами вроде `hashcat -m 16500`. Усиливает уязвимость практика помещать `role`/привилегии напрямую в payload токена: тот, кто контролирует подпись, контролирует все авторизационные решения. ## Точка входа атаки | Параметр | Значение | |----------|----------| | Учётные данные | `demo` / `demo` | | Аутентификация | `POST /login` | | Алгоритм JWT | HS256 (HMAC-SHA256) | | Cookie с JWT | `token` | | Панель администратора | `GET /admin` |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru