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

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

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

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

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Средне+60 XP ~35 мин nodejs
CWE-287 · A07:2021 Pro
Обложка: JWT alg:none — обход аутентификации без подписи Обложка: JWT alg:none — обход аутентификации без подписи
Задача
# JWT: обход аутентификации через алгоритм без подписи ## Сценарий Магазин электроники **ChipCart** перевёл вход с сессий на токены: после логина сервер выдаёт подписанный JWT в cookie, и каждый запрос авторизуется по нему. Разработчик сделал всё «по стандарту» — токен из трёх частей, подпись секретом сервера. Однако внешний ревьюэр, наблюдая за поведением приложения, заподозрил, что проверка токена доверяет ему больше, чем следует. Продавец магазина просит проверить: можно ли попасть в админ-панель, не зная ни пароля администратора, ни секрета подписи. ## Цель 1. Войдите покупателем и найдите токен в cookie; декодируйте заголовок и полезную нагрузку. 2. Определите, как сервер выбирает способ проверки подписи и все ли допустимые режимы проверки одинаково строги. 3. Сформируйте токен, который сервер принимает как валидный и который даёт права администратора. 4. Откройте админ-панель и получите флаг. ## Теория JWT состоит из трёх частей: заголовок, полезная нагрузка, подпись. В заголовке клиент объявляет алгоритм подписи — и если сервер следует этому объявлению, контроль над способом проверки переходит к отправителю токена. Стандарт исторически допускает режим «без подписи», рассчитанный на уже доверенный контент; для аутентификации он непригоден. **Уязвимый паттерн:** ```js claims = jwt.decode(token); // подпись не проверяется claims = jwt.verify(token, JWT_SECRET, { algorithms: ['HS256', 'none'] }); // «без подписи» — в списке разрешённых ``` Когда сервер принимает неподписанный токен, содержимое полезной нагрузки определяет клиент: достаточно записать туда свой идентификатор и роль администратора. Роль при этом читается из токена, а не из базы, — подделка сразу даёт полные права. ## Точка входа атаки `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: подбор слабого секрета и подделка admin-токена Обложка лабы: JWT: подбор слабого секрета и подделка admin-токена
Auth

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

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

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

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

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

+30 XP
Node.js Pro
Exploit Fix