Flask Cookie Forge & Decoder
Декодируйте сессионные cookie Flask itsdangerous или создавайте подписанные — для CTF-заданий и авторизованного тестирования.
Декодировать Cookie
Декодировать и проверить существующий Flask cookieПодделать Cookie
Создать валидный подписанный Flask cookieКак это работает
Flask использует библиотеку itsdangerous для подписи сессионных cookie с помощью HMAC. Формат cookie — три сегмента base64url, разделённых точками: PAYLOAD.TIMESTAMP.SIGNATURE. Деривация ключа: HMAC-{algo}(key=secret, msg=salt) — производный ключ используется для вычисления HMAC-{algo}(key=derived, msg=PAYLOAD.TIMESTAMP). Этот инструмент декодирует и при необходимости проверяет любой сессионный cookie Flask, затем позволяет создать новый — всё на стороне сервера в PHP без сохранения входных данных.
- 1. Get the cookie: перехватите целевой запрос в Burp Suite или DevTools браузера и скопируйте значение сессионного cookie.
- 2. Decode: вставьте cookie для раскрытия JSON-полезной нагрузки без ключа — Flask cookie подписаны, а не зашифрованы.
- 3. Получите SECRET_KEY: найдите его в конфигурации целевого приложения, утечке .env, истории git или взломайте из известной подписи.
- 4. Modify & forge: измените JSON-полезную нагрузку (например, установите user_id или is_admin), введите SECRET_KEY и создайте новый валидный подписанный cookie.
- 5. Inject: замените сессионный cookie в вашем запросе и отправьте повторно.
Что такое сессионные cookie Flask?
Flask хранит весь словарь сессии непосредственно в cookie браузера — по умолчанию серверного хранилища сессий нет. Объект сессии сериализуется в JSON, при необходимости сжимается zlib, кодируется base64url и подписывается HMAC с использованием SECRET_KEY приложения. Подпись предотвращает подделку, но поскольку полезная нагрузка не зашифрована, любой может прочитать данные сессии без ключа. Это делает сессионные cookie Flask распространённой целью в CTF веб-заданиях.
payload
JSON-объект, закодированный в base64url (сжатый zlib, если имеет префикс в виде точки). Содержит данные сессии — user_id, роли, CSRF-токен и т.д.
timestamp
4-байтовая эпоха Unix big-endian, упакованная в base64url. Присутствует в cookie с временной меткой (URLSafeTimedSerializer). Используется для проверки срока действия cookie.
signature
base64url(HMAC-{algo}(derived_key, PAYLOAD.TIMESTAMP)). Производный ключ = HMAC-{algo}(secret_key, salt). Salt по умолчанию — "cookie-session".
compression
itsdangerous сжимает полезную нагрузку с помощью zlib deflate, когда сжатие экономит место. Сжатые полезные нагрузки получают префикс в виде точки перед кодированием base64url.
FAQ
Отправляет ли это мой cookie или SECRET_KEY куда-либо?
Нет. Всё декодирование и подписание происходит на стороне сервера в PHP. Данные не сохраняются, не записываются в журнал и не передаются третьим лицам.
Можно ли прочитать полезную нагрузку без SECRET_KEY?
Да — Flask cookie подписаны, но не зашифрованы. Вставьте cookie без ключа, чтобы мгновенно увидеть JSON-данные сессии. SECRET_KEY нужен только для проверки или создания валидной подписи.
Как работает деривация ключа itsdangerous?
itsdangerous выводит ключ подписи как HMAC-{algo}(key=secret_key, msg=salt). Подпись — это HMAC-{algo}(key=derived_key, msg=PAYLOAD.TIMESTAMP). Это отличается от прямого HMAC — salt добавляет доменное разделение между различными применениями одного и того же секретного ключа.
Какой алгоритм выбрать при подделке?
HMAC-SHA1 — это стандартный алгоритм Flask/itsdangerous. Используйте HMAC-SHA512 только если целевое приложение явно его настраивает. Алгоритм можно определить, попробовав оба при декодировании — этот инструмент сначала пробует sha1, затем sha512.
Декодирование не удаётся или подпись недействительна — почему?
Убедитесь, что вставляете необработанное значение cookie без URL-кодирования (%3D и т.д.). Инструмент обрабатывает URL-кодированный ввод автоматически. Для проверки подписи убедитесь, что SECRET_KEY верный и salt совпадает с целевым приложением (по умолчанию "cookie-session").