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