Qwerty Pirogov
New member
- 05.10.2024
- 1
- 1
1. CTF-контекст и real-world релевантность.
JSON Web Tokens (JWT) стали стандартом аутентификации и авторизации в современных веб-приложениях, особенно в архитектурах микросервисов. Несмотря на свою популярность, их неправильная реализация часто приводит к критическим уязвимостям, позволяющим злоумышленникам подделывать личность, повышать привилегии и захватывать сессии.
CTF-контекст: Задачи на JWT проверяют понимание криптографии, кодирования Base64URL и логики валидации на стороне сервера.
Реальная релевантность: Эти уязвимости напрямую связаны с категорией A07:2021 – Identification and Authentication Failures (Недостатки идентификации и аутентификации) в OWASP Top 10. Успешная эксплуатация JWT в реальном мире может привести к захвату сессий, краже данных и несанкционированному доступу к административным функциям.
2. Разведка: Анализ JWT токена.
Первый шаг в любой атаке это Reconnaissance (разведка). Нам нужно получить токен и понять его структуру и алгоритмы. Задачу решаю на платформе HackerLab (Жесткий Type).
Захожу на выделенный хост. Прохожу регистрацию, выпадает роль user, на удачу копирую флаг
, вставляю в проверку, не подходит. Хм..
В таргете Burp Suite чекаю вкладки, нахожу токен для нового пользователя.
Перехваченный токен состоит из трёх частей, разделённых точками (.): Header, Payload и Signature.
Пример перехваченного токена:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSIsInJvbGUiOiJ1c2VyIiwiZXhwIjoxNzY0Njg4ODE3fQ.GU_897KC83_9YHOvUZvGm_JSkm47dwsl3MqdbHjUpEk
Иду на сайт
Ключевая цель: Мы идентифицируем клейм, который контролирует привилегии (здесь это "role": "user").
Параметр alg (HS256) указывает на использование симметричного ключа.
CTF-контекст: Задачи на JWT проверяют понимание криптографии, кодирования Base64URL и логики валидации на стороне сервера.
Реальная релевантность: Эти уязвимости напрямую связаны с категорией A07:2021 – Identification and Authentication Failures (Недостатки идентификации и аутентификации) в OWASP Top 10. Успешная эксплуатация JWT в реальном мире может привести к захвату сессий, краже данных и несанкционированному доступу к административным функциям.
2. Разведка: Анализ JWT токена.
Первый шаг в любой атаке это Reconnaissance (разведка). Нам нужно получить токен и понять его структуру и алгоритмы. Задачу решаю на платформе HackerLab (Жесткий Type).
Захожу на выделенный хост. Прохожу регистрацию, выпадает роль user, на удачу копирую флаг
В таргете Burp Suite чекаю вкладки, нахожу токен для нового пользователя.
Перехваченный токен состоит из трёх частей, разделённых точками (.): Header, Payload и Signature.
Пример перехваченного токена:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSIsInJvbGUiOiJ1c2VyIiwiZXhwIjoxNzY0Njg4ODE3fQ.GU_897KC83_9YHOvUZvGm_JSkm47dwsl3MqdbHjUpEk
Иду на сайт
Ссылка скрыта от гостей
, декодирую JSON.Ключевая цель: Мы идентифицируем клейм, который контролирует привилегии (здесь это "role": "user").
Параметр alg (HS256) указывает на использование симметричного ключа.
Поиск public endpoints для токенов
В процессе разведки ищем все точки входа (endpoints), которые могут дать нам больше информации:
- /login – для получения новых токенов.
- /api/v1/profile – для тестирования валидности токена.
/api/v1/jwks – если используется асимметричный алгоритм (RS256), этот endpoint может раскрыть публичный ключ (JSON Web Key Set), который затем можно использовать в атаке Algorithm Confusion.
3. Векторы атаки на JWT
Выбор вектора атаки зависит от результатов разведки.
None algorithm bypass
Наиболее эффективная, если сервер не принудительно проверяет подпись. Мы заставляем сервер принять токен без подписи, просто изменив заголовок.
- Изменить Header: "alg": "None".
- Изменить Payload: "role": "admin".
- Удалить Signature (третью часть токена).
Weak secret bruteforce (wordlist attack)
Актуально при использовании HS256 и слабом ключе.
- Процесс: Используем jwt_tool в связке со словарями (например, rockyou.txt) для перебора возможных секретных ключей.
- Задача: Найти ключ, который при подписи нашего Header.Payload (с ролью admin) даёт валидную подпись.
Algorithm confusion (RS256 - HS256)
Атака на реализацию, которая динамически обрабатывает alg.
- Получаем Public Key сервера (например, с /jwks).
- Меняем alg в Header на HS256.
- Подписываем наш токен с привилегиями администратора, используя Public Key как Secret Key для алгоритма HS256.
Уязвимый сервер, видя HS256, использует Public Key (который, по его мнению, является Secret Key) для проверки, и подпись оказывается валидной.
4. Эксплуатация: Получение admin-токена.
Продемонстрирую пошаговый процесс на примере.
Инструмент: Burp Suite.
Инструмент: Burp Suite.
- Модификация Payload (Цель: admin):
Мы берём оригинальный Payload, декодируем его, меняем "role": "user" на "role": "admin", и перекодируем обратно в Base64URL.
Делаю это в декодере Burp Suite.
- Перехожу в Repeater, вставляю payload с "role": "admin"
- Нажимаю Send и получаю ответ 200, а это значит, сервер принял данные:
- Поздравляю, мы пришли к цели!
5. Защита в production.
Предотвращение описанных атак требует строгой реализации и соблюдения лучших практик.
Secure JWT checklist (OWASP recommendations)
Нарушение Рекомендация OWASP Динамическое чтение alg Алгоритм Whitelist: Всегда используйте строгий белый список разрешённых алгоритмов (например, только HS256). Блокируйте alg:None. Слабый ключ Strong Secrets: Используйте криптографически стойкие, длинные (минимум 256 бит) и уникальные секретные ключи. Бесконечный срок жизни Короткий TTL: Устанавливайте минимальное время жизни токена (exp claim), например, 5-15 минут, для снижения риска захвата сессии. Игнорирование клеймов Validate All Claims: Проверяйте все стандартные (iss, exp) и авторизационные (role) клеймы.
Нарушение | Рекомендация OWASP |
|---|---|
Динамическое чтение alg | Алгоритм Whitelist: Всегда используйте строгий белый список разрешённых алгоритмов (например, только HS256). Блокируйте alg:None. |
Слабый ключ | Strong Secrets: Используйте криптографически стойкие, длинные (минимум 256 бит) и уникальные секретные ключи. |
Бесконечный срок жизни | Короткий TTL: Устанавливайте минимальное время жизни токена ( exp claim), например, 5-15 минут, для снижения риска захвата сессии. |
Игнорирование клеймов | Validate All Claims: Проверяйте все стандартные ( iss, exp) и авторизационные (role) клеймы. |
Code review tips для ревьюверов
- Проверьте используемую JWT-библиотеку на наличие известных уязвимостей.
- Убедитесь, что код не содержит флагов типа verify=false или логики, которая разрешает токену быть неподписанным.
- Особое внимание уделите функции, отвечающей за верификацию: она должна явно указывать ожидаемый алгоритм, а не брать его из токена.
Runtime detection правила для WAF/SIEM
- WAF Rule: Блокируйте любые входящие JWT, в которых Base64URL-декодированный Header содержит строку "alg":"None" или другие подозрительные алгоритмы, не входящие в белый список.
- SIEM Rule: Настройте мониторинг на аномально частые ошибки аутентификации или невалидные токены от одного и того же IP-адреса, что может указывать на активный брутфорс секретного ключа (Weak secret bruteforce)
6. Дополнительные материалы и CTF-площадки для практики.
Для закрепления навыков:
HackerLab.Pro: Проект Codeby
OWASP JWT Cheat SheetPortSwigger
Web Security Academy: Раздел "JWT Attacks" содержит интерактивные лабораторные работы.
Hack The Box / TryHackMe: Практические машины с уязвимостями JWT.
Использование этих инструментов и знаний позволит вам успешно решать CTF-задачи и, что более важно, применять эти знания для защиты реальных приложений.
Вложения
Последнее редактирование: