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

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

JWT: Weak Secret

JWT подписан слабым секретом — подберите его через brute-force и подделайте токен администратора.

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Легко+30 XP ~20 мин php
CWE-287 · A07:2021 Pro
Обложка: JWT: Weak Secret Обложка: JWT: Weak Secret
Задача
# Подделка JWT: слабый секрет подписи ## Сценарий «ПрессТайм» — сеть фитнес-студий с онлайн-магазином абонементов и мерча. Бэкендер Юлия Малышева перевела магазин на JWT-авторизацию: сервер подписывает токены симметричным ключом и отдаёт клиенту в cookie, проверка подписи настроена корректно. На вопрос о секрете Юлия ответила: «пока попроще, до релиза заменим» — и руководитель информационной безопасности просит вас показать, чем грозит такой «временный» ключ, пока магазин не уехал в прод. ## Цель 1. Войдите обычным пользователем и изучите выданный токен: алгоритм подписи и поля полезной нагрузки, включая роль. 2. Восстановите секрет подписи офлайн-перебором по словарю — без единого проверочного запроса к серверу. 3. Подпишите собственный токен с ролью администратора, подмените cookie и заберите флаг из админ-панели. ## Теория Симметричная подпись токена держится на одном — на стойкости секрета: тем же значением токен и подписывается, и проверяется. Криптография алгоритма не спасает, если сам секрет короткий или словарный. У атакующего на руках пара «содержимое токена — подпись», и он локально перебирает кандидатов, пока вычисленная подпись не совпадёт с известной: сервер не участвует, поэтому лимиты попыток и журналы не работают. **Уязвимый паттерн:** ```php // VULNERABILITY: weak secret — easily brute-forced with hashcat/jwt_tool $GLOBALS['JWT_SECRET'] = 'secret'; ``` Механика атаки: словарь типичных секретов прогоняется против подписи честно выданного токена; совпавший кандидат восстанавливает ключ. Дальше атакующий подписывает любой собственный токен — сервер обязан принять его как валидный, а роль, взятая из полезной нагрузки, даёт административные права. Проблему усиливает то, что права читаются из токена, а не из базы. ## Точка входа атаки `POST /login` — форма входа, поля `username`, `password`; при успехе сервер устанавливает cookie `token`. `GET /admin` — админ-панель; авторизованному администратору страница показывает флаг. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `???`

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

другие лабы по этой уязвимости
Обложка лабы: Login Bruteforce Обложка лабы: Login Bruteforce
Auth

Login Bruteforce

Эндпоинт логина не ограничивает количество попыток аутентификации, позволяя атакующему перебирать пароли.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: Weak Password Policy Обложка лабы: Weak Password Policy
Auth

Weak Password Policy

Регистрация принимает любой пароль без проверки сложности, что позволяет dictionary attack на аккаунты.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: Timing-атака на форму входа (PHP) Обложка лабы: Timing-атака на форму входа (PHP)
Auth

Timing-атака на форму входа (PHP)

Обработчик входа раскрывает существование пользователей через разницу во времени ответа — bcrypt вызывается только для существующих аккаунтов.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: JWT: None Algorithm Attack Обложка лабы: JWT: None Algorithm Attack
Auth

JWT: None Algorithm Attack

Сервер принимает JWT с алгоритмом none — подделайте токен без подписи и получите права администратора.

+60 XP
PHP Pro
Exploit Fix