Слабый JWT
Задание 1Введение
Цель: Устройство JWT и подбор слабого секрета подписи.
Сайт подписывает сессии JWT (HS256). Разработчик взял секрет из списка популярных паролей. Найдите секрет — и сможете подделать токен админа. Флаг — CTF{секрет}.
Задание 2Теория и инструменты
JWT состоит из трёх частей base64url через точку: заголовок, полезная нагрузка, подпись. Для HS256 подпись = HMAC-SHA256(секрет, header + '.' + payload).
Если секрет — словарное слово, его подбирают офлайн: вычисляют подпись для каждого слова и сравнивают. Зная секрет, можно подписать любой токен, например с role: admin.
Инструменты
- Python:
hmac,hashlib.sha256,base64.urlsafe_b64encode - jwt.io — посмотреть содержимое токена
- hashcat режим 16500
Больше теории — в разделе «Обучение: Веб».
Задание 3Практика: найдите флаг
token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QiLCJyb2xlIjoidXNlciIsImlhdCI6MTc2MDgzMjAwMH0.zHa0NDBBUfzZ_Y0cH5q61QokxJZpGGhoGPesQ8X9SO8 wordlist.txt: 123456 letmein dragon monkey sunshine shadow master freedom whatever trustno1 princess starwars superman hunter2 batman access welcome football matrix cyberpunk
Пошаговый план — открывайте по одному шагу
- 1Разделите токен на три части по точке.
- 2Для каждого слова из словаря вычислите HMAC-SHA256 от
header.payload(как строки, с точкой). - 3Закодируйте результат в base64url без
=в конце. - 4Слово, у которого подпись совпала с третьей частью токена, и есть секрет.
Подсказки — каждая до решения стоит −25 очков
Задание 4Как защититься
Секрет HS256 — минимум 256 случайных бит (secrets.token_hex(32)), либо асимметричные алгоритмы (RS256/EdDSA).
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.