Перейти к содержимому
HackIndex logo

HackIndex

Инструменты

Flask Cookie Forge & Decoder

Декодируйте сессионные cookie Flask itsdangerous или создавайте подписанные — для CTF-заданий и авторизованного тестирования.

Flask подписывает сессионные cookie с помощью библиотеки itsdangerous с HMAC-SHA1 или HMAC-SHA512. Формат cookie — PAYLOAD.TIMESTAMP.SIGNATURE — все сегменты закодированы в base64url. Сжатые полезные нагрузки начинаются с точки в качестве префикса. Этот инструмент декодирует любой сессионный cookie Flask для раскрытия JSON-полезной нагрузки (ключ не требуется), проверяет подпись HMAC при наличии SECRET_KEY и позволяет создать новый валидный подписанный cookie. Вся обработка происходит на стороне сервера в PHP. Ничего не сохраняется и не записывается в журнал.

Декодировать Cookie

Декодировать и проверить существующий Flask cookie

Находится в конфигурации целевого приложения как SECRET_KEY. Используется для проверки подписи HMAC.

Flask-Session по умолчанию использует "cookie-session". Изменяйте только если целевое приложение использует кастомный salt.

Подделать Cookie

Создать валидный подписанный Flask cookie

Flask по умолчанию использует HMAC-SHA1. Некоторые приложения настраивают HMAC-SHA512.

Оставьте пустым для Flask по умолчанию "cookie-session".

Совет: сначала декодируйте реальный cookie, чтобы увидеть точную JSON-структуру, затем измените и подделайте.

Как это работает

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. 1. Get the cookie: перехватите целевой запрос в Burp Suite или DevTools браузера и скопируйте значение сессионного cookie.
  2. 2. Decode: вставьте cookie для раскрытия JSON-полезной нагрузки без ключа — Flask cookie подписаны, а не зашифрованы.
  3. 3. Получите SECRET_KEY: найдите его в конфигурации целевого приложения, утечке .env, истории git или взломайте из известной подписи.
  4. 4. Modify & forge: измените JSON-полезную нагрузку (например, установите user_id или is_admin), введите SECRET_KEY и создайте новый валидный подписанный cookie.
  5. 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").