Авторские курсы Михаила Тарасова

Подмена JWT alg: Когда твой токен — это открытая дверь в админку

Подмена JWT alg: Когда твой токен — это открытая дверь в админку

Что вижу: JWT (JSON Web Token) в куках или заголовках типа Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.... Вижу, что алгоритм подписи (alg) — это HS256 или что-то такое, что можно подменить. Это как замок на двери, но ключ от него лежит под ковриком с надписью «Взломай меня».
Как поймал: Перехватываю запрос через Burp Suite, декодирую токен на jwt.io или через jwt_tool. Сразу вижу, что alg не зафиксирован на сервере, а проверка подписи — чисто формальность. Лезу в доки библиотеки (если это Node.js с jsonwebtoken или Python с PyJWT старой версии), ищу, как обойти валидацию.
Чем пахнет: Это потенциальный обход авторизации с вероятностью 8/10, если сервер тупо верит заголовку alg и не проверяет его на бэкенде. Если алгоритм подписи можно подставить на none, то ты уже админ, братан. Класс уязвимости — Authentication Bypass, иногда доходит до RCE, если админка даёт доступ к системным командам.

Почему подмена JWT alg — это боль?

Для тех, кто вчера только поставил Kali: JWT — это токен, состоящий из трёх частей (Header, Payload, Signature), разделённых точками и закодированных в Base64. Header содержит инфу об алгоритме подписи (alg), например, HS256 (симметричный ключ) или RS256 (асимметричный). Проблема в том, что многие библиотеки и сервера слепо доверяют значению alg из токена, не проверяя его на соответствие ожидаемому.

Классика жанра — подмена alg на none. Если сервер принимает токен с alg: none, он просто игнорирует подпись и верит пейлоаду. Это как сказать охраннику: «У меня пропуск без подписи, но я свой, пусти». И он пускает! Или другой трюк: смена с RS256 (асимметричный, нужен публичный ключ) на HS256 (симметричный), используя публичный ключ как секрет для подписи. Если сервер не валидирует алгоритм, ты в игре.

CVE для примера: CVE-2018-0114 — уязвимость в некоторых реализациях JWT, где подмена alg на none позволяет обойти авторизацию. Эксплойты и PoC есть на Exploit-DB или в доках jwt_tool.

Чё почём

Эксплойт: Вот тебе готовый вектор атаки через подмену alg на none. Допустим, у тебя есть токен, перехваченный через Burp:

  1. Декодируй Header и Payload на jwt.io или через jwt_tool. Видишь, user: guest. Меняем это на user: admin.

  2. В Header меняем alg с HS256 на none. Новый токен собираем без подписи (просто Header.Payload. без третьей части):

3. Отправляй через Burp или curl:

Если сервер принимает none как валидный алгоритм, ты в админке. Поздравляю, бро, ты только что сломал авторизацию.

Вектор 2 (RS256 на HS256): Если alg стоит RS256, попробуй подменить на HS256. Найди публичный ключ (часто он валяется в /jwks.json или в исходниках). Используй его как секрет для подписи через HS256 с помощью jwt_tool:

Отправь новый токен на сервер. Если он не проверяет алгоритм, ты снова админ.

Обход защиты: Если сервер фильтрует none, попробуй другие значения alg, типа HS384 или HS512, играя с версиями библиотеки. Если есть WAF, шифруй токен через двойное кодирование (Base64 дважды) или подменяй заголовки: X-Forwarded-For: 127.0.0.1.
Доказательство: Делай скрин ответа сервера с 200 OK и доступом к /admin. «Видишь приветствие ‘Welcome, Admin’? Это не твой котик мурлычет, это твой билет на баг-баунти». Лог запроса из Burp — твой PoC для HackerOne.

Советы

3 вектора для добивания:

  1. Игра с алгоритмами. Если none не катит, попробуй подмену между RS256/HS256 или другие варианты (ES256PS256). Используй jwt_tool -I -pc user -pv admin для автоматизации.

  2. Копай ключ. Если это RS256, ищи публичный ключ в открытых эндпоинтах типа /jwks.json или в старых репозиториях на GitHub. Иногда ключи сливают в коммитах.

  3. Смотри на куки и заголовки. JWT может быть не только в Authorization, но и в куках типа session=.... Проверяй все параметры через Burp Intruder.

План атаки:

  1. Перехватывай токен через Burp и декодируй на jwt.io или jwt_tool.

  2. Подменяй alg на none или меняй алгоритм подписи, если есть ключ. Отправляй через Repeater в Burp.

  3. Если доступ получен, ищи админские функции (например, загрузку файлов для RCE). Если есть доступ к БД, дампи через sqlmap --os-shell.

 

Мои курсы