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

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

JWT: подбор слабого секрета и подделка admin-токена

Сервер подписывает JWT слабым секретом из словаря. Получив один валидный токен, атакующий за секунды подбирает секрет по словарю офлайн, подписывает новый токен с role=admin и забирает флаг.

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Средне+60 XP ~35 мин nodejs
CWE-287 · A07:2021 Pro
Обложка: JWT: подбор слабого секрета и подделка admin-токена Обложка: JWT: подбор слабого секрета и подделка admin-токена
Задача
# JWT: слабый секрет подписи ## Сценарий Магазин сувениров для гиков **NerdNook** защищает вход подписанными токенами: сервер проверяет подпись честно, алгоритм закреплён, секрет вроде бы никто не публикует. Но один из покупателей, разбирающийся в криптографии, заметил: токены с симметричной подписью можно «вскрывать» офлайн, прямо на своей машине. Владелец магазина не верит: «Секрет же не в коде… почти». Проверьте, действительно ли стойкость аутентификации магазина держится на секрете подписи — и что будет, если секрет угадываем. ## Цель 1. Войдите покупателем и достаньте свой токен из cookie; декодируйте заголовок и полезную нагрузку. 2. Подтвердите офлайн-подбор секрета подписи по вашему же токену, используя словарь типичных секретов. 3. Подпишите новый токен с ролью администратора подобранным секретом. 4. Откройте админ-панель и получите флаг. ## Теория Симметричная подпись токена — это HMAC: один и тот же секрет и ставит, и проверяет подпись. У атакующего, имеющего хотя бы один валидный токен, есть всё для офлайн-перебора: и сообщение, и подпись. Кандидат из словаря проверяется локально за доли секунды — сервер о попытках ничего не узнаёт. **Уязвимый паттерн:** ```js const JWT_SECRET = '...'; // короткое словарное слово row.role = decoded.role || row.role; // роль — из полезной нагрузки ``` Подобрав секрет, атакующий подписывает любые полезные нагрузки. А поскольку роль читается из токена, а не из базы, подделка сразу даёт административные права. ## Точка входа атаки `POST /login` — форма входа с полями `username` и `password`; после входа токен лежит в cookie `token`. Подписанный секретом токен подменяется в этом же cookie; цель — `GET /admin`. * **Пользователь:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting) — Node.js Обложка лабы: Брутфорс Формы Входа (Нет Rate Limiting) — Node.js
Auth

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

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

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: Timing-атака на форму входа Обложка лабы: Timing-атака на форму входа
Auth

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

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

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: JWT alg:none — обход аутентификации без подписи Обложка лабы: JWT alg:none — обход аутентификации без подписи
Auth

JWT alg:none — обход аутентификации без подписи

Сервер принимает JWT с alg:none и доверяет роли из claims — подделайте токен для получения прав администратора в SecureShop.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: Слабая Парольная Политика Обложка лабы: Слабая Парольная Политика
Auth

Слабая Парольная Политика

Регистрация принимает любой пароль без проверки сложности. Пароль администратора — 'admin'.

+30 XP
Node.js Pro
Exploit Fix