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

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

JWT Key Confusion (RS256 to HS256)

JWT RS256/HS256 key confusion: the server exposes the public key and doesn't enforce the signing algorithm, allowing token forgery via algorithm switch.

Автор: Hack & Fix
Освоишь: bcrypt/argon2constant-time compareMFA
Сложно+90 XP ~65 мин golang
CWE-287 · A07:2021 Pro
Обложка: JWT Key Confusion (RS256 to HS256) Обложка: JWT Key Confusion (RS256 to HS256)
Задача
# JWT Key Confusion: подмена алгоритма подписи токена ## Сценарий Вы — аудитор безопасности магазина **СигмаСтор**. Сервис аутентифицирует пользователей JWT-токенами с асимметричной подписью: приватный ключ хранится только на сервере и подписывает токены, а публичный открыт — он публикуется стандартными эндпоинтами для клиентов и внешних интеграций. Команда уверена: подделать токен без приватного ключа невозможно. Внутренний аудит полагает иначе — в админ-панели лежит конфиденциальная метка, и её можно добыть с обычной учётной записи. ## Цель 1. Изучите, как сервер проверяет JWT: какие алгоритмы подписи он готов принять и различает ли он их классы при выборе ключа. 2. Разберитесь, какой материал для проверки подписи сервер использует для каждого класса алгоритмов — и что из этого материала доступно вам открыто. 3. Сформируйте токен с привилегированной ролью, не зная приватного ключа, войдите в админ-панель и извлеките флаг. ## Теория Key Confusion (Algorithm Confusion) — атака на проверку JWT, смешивающая классы криптографии. RSA — асимметричный алгоритм: подпись создаётся приватным ключом, проверяется публичным. HMAC — симметричный: один и тот же секрет и для подписи, и для проверки. Если валидатор не фиксирует класс алгоритма и для HMAC-ветки отдаёт те же данные, что и для RSA (например, открытый публичный ключ), происходит подмена: материал, который обязан быть открытым, начинает работать как симметричный секрет. **Уязвимый паттерн:** ```go // keyfunc не фиксирует класс алгоритма: для HMAC-ветки // публичный ключ возвращается как симметричный секрет if _, ok := token.Method.(*jwt.SigningMethodRSA); ok { return &h.rsaPrivateKey.PublicKey, nil } return []byte(h.rsaPublicKeyPEM), nil ``` Механика атаки: атакующий скачивает публичный ключ из открытого эндпоинта, собирает собственный токен с нужными полями и заголовком симметричного алгоритма, а подпись считает тем самым открытым материалом. Сервер проверяет HMAC на тех же байтах — подпись «сходится», подделка принимается. ## Точка входа атаки `POST /login` — вход (выдаёт cookie `token` с JWT); `GET /api/public-key` — публичный ключ сервера (PEM); `GET /admin` — админ-панель с флагом при роли администратора. * Обычный пользователь: `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: Timing Attack: Перечисление Пользователей Обложка лабы: Timing Attack: Перечисление Пользователей
Auth

Timing Attack: Перечисление Пользователей

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

+90 XP
Go Pro
Exploit Fix
Обложка лабы: JWT Authentication: Взлом слабой криптографии Обложка лабы: JWT Authentication: Взлом слабой криптографии
Auth

JWT Authentication: Взлом слабой криптографии

В этой лаборатории сервер использует JWT для авторизации, но совершает сразу две критические ошибки: использует слабый секретный ключ и доверяет заголовку alg.

+90 XP
Go Pro
Exploit Fix
Обложка лабы: Предсказуемые Токены Сессии (MD5) Обложка лабы: Предсказуемые Токены Сессии (MD5)
Auth

Предсказуемые Токены Сессии (MD5)

Сессионные токены генерируются через MD5(username), что позволяет предсказать токен администратора и захватить его сессию.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Небезопасный Сброс Пароля (IDOR) Обложка лабы: Небезопасный Сброс Пароля (IDOR)
Auth

Небезопасный Сброс Пароля (IDOR)

Форма сброса пароля принимает user_id из клиента, позволяя атакующему сбросить пароль любого пользователя через IDOR.

+60 XP
Go Pro
Exploit Fix