Перейти к содержимому

Поиск по платформе

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

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

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Средне+60 XP ~35 мин golang
CWE-287 · A07:2021 Pro
Обложка: JWT: Подбор слабого секретного ключа Обложка: JWT: Подбор слабого секретного ключа
Задача
# JWT: подбор слабого секрета подписи ## Сценарий Сеть магазинов электроники **SwiftMart** перевела аккаунты на JWT: сервер подписывает токены алгоритмом HMAC-SHA256, и после входа токен живёт в cookie. Архитектор Павел уверен, что «подпись есть — защита есть», а про сам ключ говорит: «хранится в коде, никто не догадается». Служба безопасности наняла вас проверить это утверждение с учётной записи обычного покупателя. В админ-панели хранится конфиденциальная метка, доступная только роли администратора. ## Цель 1. Получите токен после входа обычного пользователя и изучите его заголовок и payload без проверки подписи. 2. Восстановите серверный секрет — атака офлайновая и не требует обращений к серверу. 3. Подпишите собственный токен с нужными claims, получите доступ к админ-панели и извлеките флаг. ## Теория Когда JWT подписан симметричным алгоритмом HMAC, стойкость всей схемы держится на энтропии секретного ключа. Сам SHA-256 криптографически стоек, но если ключ — короткое словарное слово, его можно перебрать офлайн: атакующий берёт выпущенный сервером токен (его выдаёт обычный логин) и проверяет кандидатов из словаря, сверяя получающуюся подпись. Ни одного лишнего запроса к серверу, никаких следов в логах — скорость перебора упирается только в мощность локальной машины. Рекомендации BCP для JWT требуют, чтобы HMAC-ключ содержал не меньше энтропии, чем сам алгоритм: для HS256 это 256 бит, то есть 32 случайных байта. Значения из туториалов и примеров кода не проходят ни по одному критерию: они входят в любой словарь для перебора. **Уязвимый паттерн:** ```go // Секрет подписи — короткая строковая константа в исходном коде: var jwtSecret = []byte("<словарное-значение>") ``` Вторая ошибка усугубляет первую: роль пользователя берётся прямо из payload токена. Кто восстановил секрет, тот подписывает себе любые привилегии. ## Точка входа атаки | Параметр | Значение | |----------|----------| | Учётные данные | `demo` / `demo` | | Вход | `POST /login` (выдаёт cookie `token` с JWT) | | Алгоритм подписи | HS256 (HMAC-SHA256) | | Привилегированная зона | `GET /admin` |

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: Предсказуемые Токены Сессии (MD5) Обложка лабы: Предсказуемые Токены Сессии (MD5)
Auth

Предсказуемые Токены Сессии (MD5)

Сессионные токены генерируются через MD5(username), что позволяет предсказать токен администратора и захватить его сессию.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Небезопасный Сброс Пароля (IDOR) Обложка лабы: Небезопасный Сброс Пароля (IDOR)
Auth

Небезопасный Сброс Пароля (IDOR)

Форма сброса пароля принимает user_id из клиента, позволяя атакующему сбросить пароль любого пользователя через IDOR.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting) Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting)
Auth

Брутфорс Формы Входа (Нет Rate Limiting)

Форма входа не ограничивает количество попыток, позволяя подобрать пароль администратора перебором по словарю.

+30 XP
Go Pro
Exploit Fix
Обложка лабы: Слабые Пароли (Нет Валидации Сложности) Обложка лабы: Слабые Пароли (Нет Валидации Сложности)
Auth

Слабые Пароли (Нет Валидации Сложности)

Форма регистрации принимает любые пароли, включая однозначные. Аккаунт admin защищён паролем 'admin'.

+30 XP
Go Pro
Exploit Fix