JWT: Key Confusion (RS256 to HS256) на jsonwebtoken
Express-приложение подписывает JWT через RS256 и публикует RSA публичный ключ через JWKS-эндпоинт. Функция верификации вызывает jwt.verify без явного whitelist алгоритмов — это позволяет атакующему подписать HS256-токен публичным ключом и получить admin-доступ.
hardnodejsPro
Задача
# JWT: атака на путаницу алгоритмов (Key Confusion)
## Сценарий
Перед вами Express-приложение интернет-магазина SecureShop. Аутентификация построена на JWT-токенах с **асимметричной подписью**: сервер подписывает токены приватным RSA-ключом, а проверяет — соответствующим публичным ключом. Публичный ключ по стандартной для JWT-систем практике опубликован — клиенты могут самостоятельно проверить подпись токена.
В реализации проверки на стороне сервера допущена ошибка из категории *JWT Algorithm Confusion*. Когда обе схемы подписи (асимметричная RSA и симметричный HMAC) присутствуют в коде верификатора одновременно, клиент при определённых условиях может вынудить сервер использовать «не тот» механизм проверки — и получить административный доступ, не обладая ни приватным ключом, ни паролем admin'а.
## Цели
1. Авторизуйтесь как `demo` / `demo` и изучите токен в cookie клиента.
2. Найдите способ, которым приложение раздаёт информацию о ключе подписи (это нормальная практика для асимметричной подписи), и поймите, какие именно данные оно отдаёт.
3. Сформируйте JWT-токен, который сервер примет за валидный и который выдаст административные права, не используя при этом приватный ключ сервера.
4. Откройте админ-панель и извлеките CTF-флаг.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
| Цель | `admin`-роль (пароль администратора неизвестен) |