Логотип
Главная | Статьи | JWT-эксплойты: обход подписи через алгоритмические атаки
JWT-эксплойты: обход подписи через алгоритмические атаки

JWT-эксплойты: обход подписи через алгоритмические атаки

3 февраля, 2026

26

JSON Web Token (JWT) – это стандарт для передачи данных между сторонами в виде JSON-объектов. Токен состоит из трёх частей: заголовка (header), полезной нагрузки (payload) и подписи (signature). Казалось бы, подпись гарантирует целостность, но на практике разработчики допускают классические ошибки, которые превращают JWT в дырявое решето. Давай разберём топовые атаки.

None Algorithm Attack

Самый тупой, но рабочий эксплойт. Суть проста: меняем алгоритм подписи на none, удаляем саму подпись, и сервер принимает токен как валидный.

Структура JWT

Нормальный токен выглядит так:

Декодируем header:

Эксплуатация

Меняем alg на none или None (регистр важен):

Кодируем в Base64:

Обрати внимание на точку в конце — она критична. Некоторые либы требуют её наличие даже при none.

Защита

Жёстко проверяй алгоритм на сервере:

Algorithm Confusion Attack (RS256 → HS256)

Это уже интереснее. RS256 использует асимметричное шифрование (приватный ключ для подписи, публичный для проверки). HS256 – симметричное (один секрет для всего).

Вектор атаки

Если сервер не фиксирует алгоритм жёстко, можно подменить RS256 на HS256 и использовать публичный ключ как секрет для HMAC. Публичный ключ общедоступен, а значит, можем подписать свой токен.

Практика

Получаем публичный ключ сервера (часто доступен через /.well-known/jwks.json или в сертификате):

Почему работает

Сервер ожидает RS256, но вместо проверки подписи приватным ключом проверяет HMAC с публичным. А публичный ключ у нас есть.

Защита

Фиксируй алгоритм явно:

Weak Secret Brute Force

Если используется HS256/HS384/HS512 со слабым секретом, можно просто брутфорсить подпись.

Инструменты

hashcat – быстрее всех:

jwt_tool – швейцарский нож для JWT:

Скрипт на Python

KID Injection Attack

Параметр kid (Key ID) в заголовке указывает, какой ключ использовать. Иногда его значение используется в SQL-запросах или для чтения файлов.

SQL Injection через KID

Если сервер делает что-то типа:

То можем инжектить любое значение ключа.

Path Traversal

Если сервер читает файл по пути из kid, можем указать /dev/null (пустая строка) как секрет и подписать токен пустой строкой:

Timing Attack для HMAC

Если проверка HMAC идёт побайтово с ранним выходом, можно измерять время ответа и подбирать подпись.

Концепт

Эксплуатация

Защита

Используй константное время для сравнения:

JWK Injection

Некоторые либы позволяют указать ключ прямо в токене через параметр jwk или jku.

Атака

Генерируем свою пару ключей, вставляем публичный в jwk, подписываем приватным.

Автоматизация с jwt_tool

Мастхэв инструмент для пентеста JWT:

Чек-лист для пентеста

  • Пробуй alg: none с вариациями регистра
  • Ищи публичные ключи и тестируй algorithm confusion
  • Брутфорси секрет, если HS256/384/512
  • Проверяй kid на SQLi и path traversal
  • Тестируй параметры jwkjkux5u
  • Меняй typ на нестандартные значения
  • Подделывай timestamps (expiatnbf)
  • Ищи race conditions в проверке токенов

Вот так выглядит реальный хардкор в JWT-атаках. Главное – не забывай, что всё это работает только из-за косяков разработчиков. Правильная имплементация с жёсткой проверкой алгоритмов и сильными секретами убивает 99% этих эксплойтов.