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` |