Главная / Блог / Веб задачи CTF: как находить флаги в cookies, заголовках и сессиях

13 мин.00

Веб задачи CTF: как находить флаги в cookies, заголовках и сессиях

Веб задачи CTF: как находить флаги в cookies, заголовках и сессиях

Веб задачи CTF: как находить флаги в cookies, заголовках и сессиях

На picoCTF 2021 задача Cookies решалась за три минуты: перехватить запрос в Burp, подставить число 18 в cookie name — флаг на экране. На CTF-марафоне от OTUS задача за 150 очков требовала декодировать base64 из cookie secret, перевести бинарные данные в текст и поменять одно значение — "is_admin":"False" на "True". Ни единой SQL-инъекции, ни единого эксплойта: DevTools, понимание HTTP-заголовков и минута на декодирование.

По опыту разбора сотен веб-задач на CTFtime-ивентах и picoCTF, больше половины тасков категории easy и приличная часть medium решаются анализом cookies, заголовков и сессий. Новичок, который это усвоил, закрывает первые задачи за минуты — пока остальные пишут SQL-инъекции наугад.

Где прячут флаги в веб-задачах CTF

Прежде чем запускать sqlmap или собирать пейлоады для XSS — проверь очевидные места. Авторы задач уровня easy часто прячут флаг буквально на виду. Нужно только знать, куда смотреть. Подробнее — в нашем обзоре пентест веб-приложений.

Cookies. Самый частый вариант для задач на cookie manipulation CTF. Флаг может быть закодирован в значении cookie (base64, hex, бинарный код) или появляться после подмены параметра — role=admin вместо role=user. На соревнованиях OTUS задача Cookies (150 очков) использовала именно этот паттерн: JSON-структура {"username":"user","is_admin":"False"} закодирована в base64, записана в cookie secret, и для получения флага нужно было изменить одно поле (по данным разбора задач OTUS CTF).

HTTP-заголовки ответа. Сервер может отправлять флаг или подсказку в нестандартном заголовке — X-Flag, X-Secret, X-Custom-Header. Иногда данные валяются в заголовке Set-Cookie, который браузер обрабатывает автоматически, и новичок его не замечает, потому что ищет флаг в теле страницы.

HTML-комментарии и скрытые элементы. Классический тайник: <!-- flag{...} --> в исходном коде страницы или <input type="hidden" value="flag{...}">. На KnightCTF 2024 задача Levi Ackerman отсылала к robots.txt — файлу, который содержал путь к скрытой странице /l3v1_4ck3rm4n.html с флагом (по данным writeup KnightCTF 2024 от Selectel).

JavaScript-код. Флаг или логика его получения могут сидеть в inline-скрипте или подключаемом JS-файле. На KnightCTF 2024 задача Kitty после обхода авторизации показывала дашборд, в исходном коде которого находился JS-код: при вводе cat flag.txt в форму скрипт отправлял POST-запрос к /execute и возвращал флаг.

Сессионные токены. Flask, Django и Express часто используют подписанные cookies для хранения данных сессии. Если секретный ключ слабый или известен — токен можно расшифровать и подделать. На picoCTF 2021 задача Most Cookies эксплуатировала уязвимость Flask-приложения с предсказуемым секретным ключом (по данным writeup picoCTF 2021).

Эти паттерны напрямую отражают проблемы из OWASP A07:2021 — Identification and Authentication Failures: слабое управление сессиями, предсказуемые токены и хранение чувствительных данных в cookies без защиты.

DevTools для поиска флагов CTF: пошаговый разбор

DevTools — первый инструмент для веб-задач CTF. Не Burp, не curl, а встроенный инспектор браузера. Открывается в Chrome через F12 или Ctrl+Shift+I, и большинство задач уровня easy решаются, не выходя из этого окна.

Требования к окружению

  • ОС: любая — Windows 10+, macOS, Linux
  • Браузер: Chrome (рекомендуется) или Firefox — оба имеют полноценные DevTools
  • RAM: 4 ГБ минимум для комфортной работы DevTools и Burp Suite одновременно
  • Burp Suite Community Edition: бесплатная версия с portswigger.net (для разделов про Burp, проект активно поддерживается PortSwigger)
  • Сеть: доступ к CTF-платформе (picoCTF, CTFtime-ивенты)
  • Дополнительно: curl (предустановлен на macOS/Linux, на Windows доступен через Git Bash)

Вкладка Application — cookies на ладони

Открываешь DevTools, переходишь на вкладку Application (в Firefox — Storage). В левой панели разворачиваешь секцию Cookies и видишь все cookies для текущего домена: имя, значение, домен, путь, срок действия, флаги Secure, HttpOnly и SameSite.

Что делать:

  1. Прочитать значения всех cookies. Если значение выглядит как dXNlcm5hbWU9YWRtaW4= — это base64 (подсказка: набор символов A-Za-z0-9+/ и символ = в конце для padding).
  2. Обратить внимание на имена: session, token, secret, role, user, auth — любое из них может указывать на cookie с данными аутентификации.
  3. Проверить атрибуты: если у cookie нет флага HttpOnly, его можно прочитать и изменить через JavaScript-консоль. Если нет Secure — cookie передаётся по HTTP без шифрования. Согласно OWASP Web Security Testing Guide (Testing for Cookies Attributes), отсутствие этих атрибутов — прямой сигнал о небезопасной конфигурации.

Значение cookie можно изменить прямо в таблице Application — двойной клик на ячейке Value, вводишь новое значение, перезагружаешь страницу (F5) и смотришь, как отреагирует сервер.

Вкладка Network — заголовки в деталях

Переходишь на вкладку Network, перезагружаешь страницу (Ctrl+R). В списке запросов выбираешь первый (обычно сам HTML-документ). В правой панели открываешь секцию Response Headers.

Что искать:

  • Set-Cookie — сервер устанавливает cookie. Если видишь несколько Set-Cookie в ответе — проверяй значение каждого отдельно.
  • Нестандартные заголовки — любой заголовок, начинающийся с X-: X-Flag, X-Hint, X-Secret-Token. Авторы задач обожают прятать подсказки в кастомных заголовках.
  • Server и X-Powered-By — версия сервера и фреймворка. Знание стека (Flask, Express, PHP) определяет, как устроены сессии и какие уязвимости искать. На KnightCTF 2024 версия vsFTPd 2.3.4 из заголовка ответа была ключом к целой серии задач.

Типичная ошибка новичка: искать флаг в теле страницы, когда он прилетел в заголовке ответа. Network-вкладка показывает то, что на странице не отображается.

Elements и Console

Elements (Ctrl+Shift+C) — поиск по DOM-дереву страницы. Жмёшь Ctrl+F прямо в панели Elements и ищешь по ключевым словам: flag, ctf, hidden, secret, comment, admin. HTML-комментарии <!-- --> видны только здесь или в исходном коде (Ctrl+U).

Console — выполнение JavaScript для чтения и модификации cookies. Команда document.cookie выводит все cookies без флага HttpOnly. Здесь же можно задавать новые значения — об этом ниже в разделе про подмену.

Cookies CTF: декодирование, подмена и эскалация привилегий

Cookie manipulation CTF — самая частая категория веб-задач, связанных с cookies. Задачи строятся по одной из четырёх схем кодирования, и распознавание формата — уже половина решения.

Паттерны кодирования

Base64. Значение cookie — строка в base64. Декодируешь, получаешь текст (часто JSON), меняешь нужное поле, кодируешь обратно. Пример из CTF-марафона OTUS: cookie secret содержал base64-строку, которая после декодирования давала бинарный код. Бинарный код переводился в ASCII-текст и возвращал JSON: {"username":"user","is_admin":"False"}. Замена False на True, обратное кодирование — и флаг flag{d0_y0u_l1k3_c00k13s} на экране.

Hex-кодирование. Значение cookie — шестнадцатеричное представление текста. На OTUS CTF задача Algo использовала именно это: строка 666c61677b32646733326473323334327d переводилась из hex в ASCII:

bytes.fromhex('666c61677b32646733326473323334327d').decode()
# Результат: flag{2dg32ds2342}

Числовой идентификатор. Cookie содержит просто число — ID пользователя, индекс, порядковый номер. На picoCTF 2021 cookie name принимал числовое значение, и при значении 18 сервер возвращал флаг (по данным writeup picoCTF 2021). Тут нужен перебор — либо вручную (меняешь в Application), либо автоматически через Burp Intruder.

JWT (JSON Web Token). Значение cookie в формате xxxxx.yyyyy.zzzzz — три части, разделённые точками. Средняя часть — base64-закодированный JSON с данными пользователя. Если сервер не проверяет подпись или использует алгоритм none, можно изменить payload (например, "role":"admin") и подставить модифицированный токен. Расшифровать JWT для анализа можно на jwt.io или командой echo 'yyyyy' | base64 -d в терминале.

Подмена cookies через Console и сессии веб CTF

В DevTools Console можно читать и устанавливать cookies без дополнительных инструментов:

// Прочитать все доступные cookies (без HttpOnly)
document.cookie
// Установить cookie с нужным значением
document.cookie = "role=admin; path=/"
// Установить cookie с base64-значением (btoa кодирует в base64)
document.cookie = "secret=" + btoa('{"is_admin":"True"}') + "; path=/"

После установки нового значения перезагружаешь страницу и проверяешь, изменился ли ответ сервера. Функция btoa() кодирует строку в base64, atob() — декодирует обратно. Обе — стандартный JavaScript, доступный в любом браузере.

Для задач с Flask-сессиями подход другой. Flask хранит данные сессии прямо в cookie, подписывая их HMAC-ключом. Cookie начинается с eyJ (base64 от {"), и его можно декодировать для чтения данных. Но для подмены нужно знать секретный ключ приложения. Если ключ слабый (словарные значения вроде password, secret, changeme), его можно подобрать утилитами для brute-force Flask-сессий. На picoCTF 2021 задача Most Cookies строилась именно на этом — приложение использовало слабый ключ из предоставленного списка.

Когда подмена cookies не работает

Подмена через document.cookie не сработает, если cookie установлен с флагом HttpOnly — браузер не позволит JavaScript его прочитать или изменить. Решение: Burp Suite перехватывает HTTP-запрос на уровне сети, до применения браузерных ограничений.

Ещё один барьер — подписанные cookies с неизвестным ключом. Простая подмена значения приведёт к ошибке проверки подписи. Если ключ невозможно подобрать — задача, скорее всего, решается другим вектором (инъекция, десериализация, path traversal).

Для продвинутых задач существуют техники вроде cookie sandwich, описанные исследователями PortSwigger в январе 2025 года: они позволяют обходить HttpOnly-флаг через особенности парсинга cookies в Apache Tomcat и Python-фреймворках. Но для уровня easy и medium это перебор — достаточно Burp Repeater.

HTTP заголовки CTF: что сервер рассказывает сам

Анализ HTTP заголовков CTF — навык, который отделяет человека, решающего задачи за минуты, от того, кто часами пишет инъекции впустую. Сервер в каждом ответе отдаёт метаданные: версию ПО, тип сессии, а иногда и прямые подсказки от авторов задачи.

Заголовки ответа, на которые стоит смотреть

Set-Cookie — важнейший заголовок для CTF. Сервер устанавливает cookie и указывает его атрибуты. Если в Set-Cookie видишь session=eyJ... — перед тобой Flask-сессия (base64-закодированный JSON с подписью). Если PHPSESSID=abc123 — классическая PHP-сессия, данные хранятся на сервере, и менять session ID бессмысленно без дополнительного вектора.

Нестандартные X-заголовки — авторы CTF-задач используют их для подсказок или прямого хранения флага. Заголовок X-Hint: check the source code направит в нужную сторону. Заголовок X-Flag: ZmxhZ3suLi59 — base64-закодированный флаг, готовый к декодированию. В продакшн-приложениях такого не бывает, но в CTF-задачах встречается регулярно.

Server и X-Powered-By — идентификация серверного ПО. Строка Server: Apache/2.4.29 или X-Powered-By: Express говорит о стеке технологий и определяет, какие уязвимости стоит проверять.

curl для сырого анализа HTTP запросов CTF

DevTools удобен, но иногда нужен минимальный инструмент без графического интерфейса — особенно при работе через SSH. Команда curl -v (verbose mode) показывает все заголовки запроса и ответа:

curl -v http://target.ctf:5000/ 2>&1 | grep -i "set-cookie\|x-\|flag"
# -v выводит заголовки, grep фильтрует интересное
curl -v -b "role=admin" http://target.ctf:5000/dashboard
# -b отправляет произвольный cookie с запросом

Флаг -b позволяет отправить cookie любого содержания, флаг -H добавляет произвольный заголовок. Для разовой проверки curl часто быстрее Burp, но для перебора значений или сложных многоэтапных запросов Burp Intruder незаменим.

В контексте реального пентеста анализ HTTP-заголовков — разведка, которая укладывается в технику Browser Information Discovery (T1217, MITRE ATT&CK). Set-Cookie без Secure-флага в HTTPS-приложении — готовый finding для отчёта. Манипуляция cookies для получения чужой сессии соответствует технике Steal Web Session Cookie (T1539, Credential Access). На CTF эти же знания позволяют определить вектор атаки за секунды, до написания первой строки эксплойта.

Burp Suite CTF: перехват трафика и brute-force cookies

Когда DevTools недостаточно — запускаешь Burp Suite. Community Edition бесплатна и покрывает подавляющее большинство задач на CTF. Burp работает как прокси между браузером и сервером: каждый запрос проходит через него, и ты можешь его остановить, поковырять и отправить заново.

Настройка и перехват трафика CTF

Burp слушает на 127.0.0.1:8080 по умолчанию. В браузере настраиваешь прокси на тот же адрес (в Chrome удобно через расширение FoxyProxy). После этого каждый HTTP-запрос проходит через Burp. Во вкладке Proxy → Intercept включаешь перехват — запрос зависает, и ты видишь его целиком: URL, метод, заголовки, cookies, тело.

Согласно руководству PortSwigger (Using Burp to Hack Cookies and Manipulate Sessions), базовый workflow для cookie-задач:

  1. Отключаешь Intercept, заходишь на страницу логина, авторизуешься обычным способом.
  2. Включаешь Intercept, перезагружаешь страницу — запрос перехвачен в панели.
  3. Правый клик по запросу → Send to Repeater — запрос копируется во вкладку Repeater для ручного тестирования.

Repeater: ручная модификация cookies

Repeater — главный инструмент для ручного анализа HTTP запросов CTF. Во вкладке Params все cookies отображаются в таблице: имя и значение. Удалять cookies можно кнопкой Remove, добавлять — кнопкой Add, менять значения — прямым редактированием. Кнопка Send отправляет модифицированный запрос.

По данным PortSwigger, типичный сценарий для CTF: изменить значение cookie uid с 2 на 1, нажать Send — и ответ сервера покажет страницу пользователя admin с флагом. Этот паттерн — числовой ID в cookie, определяющий аккаунт — встречается на CTF постоянно.

Главное преимущество Repeater перед DevTools Console: Repeater работает на уровне HTTP-запросов, до обработки браузером, поэтому позволяет модифицировать HttpOnly-cookies, которые JavaScript не видит. Если задача требует изменить cookie с HttpOnly-флагом — Repeater единственный вариант без написания скриптов.

Intruder: автоматический перебор cookies

Когда значение cookie — число, но правильное неизвестно, Intruder решает задачу перебором за секунды. На picoCTF 2021 задача Cookies решалась именно так (по данным writeup picoCTF 2021):

  1. Перехват запроса с cookie name=-1 через Proxy.
  2. Отправка в Intruder (правый клик → Send to Intruder).
  3. Во вкладке Positions — выделение значения -1 как позиции для подстановки.
  4. Во вкладке Payloads — тип Numbers, диапазон от 0 до 100, шаг 1.
  5. Во вкладке Settings — добавление Grep Match для строки picoCTF{, чтобы мгновенно определить ответ с флагом.
  6. Запуск атаки — значение 18 вернуло ответ с совпадением по строке.

В Community Edition Intruder работает с ограничением скорости (throttling), но для диапазона в 100 значений это не критично — задача решается за пару минут.

Ограничения Burp Community

Бесплатная версия не включает активный сканер, Collaborator и часть BApp-расширений. Для CTF-задач на cookies и сессии этого обычно не нужно — Proxy, Repeater и Intruder покрывают основной рабочий процесс. Если задача требует анализа зашифрованных Flask-токенов, полезны внешние инструменты для подбора секретного ключа.

Чеклист: анализ HTTP запросов CTF перед написанием эксплойта

Прежде чем переходить к инъекциям и сложным техникам, пройдись по этому списку. На задачах уровня easy и приличной части medium он закрывает большинство тасков:

  1. Application → Cookies — прочитать все значения, определить формат: base64 (padding =), hex (символы 0-9a-f), JWT (три части через точку), число.
  2. Network → Response Headers — перезагрузить страницу, проверить Set-Cookie, все X-заголовки, Server/X-Powered-By.
  3. Elements → Ctrl+F — поиск по flag, ctf, hidden, secret, admin, comment в HTML-коде.
  4. Console → document.cookie — прочитать доступные cookies через JavaScript, попробовать atob() для base64-значений.
  5. Проверить /robots.txt и /.git/ — скрытые пути и возможные утечки исходного кода.
  6. View Source (Ctrl+U) — просмотреть JS-код: обработчики форм, fetch-запросы, скрытые эндпоинты.
  7. Если cookie содержит JSON — попробовать изменить role, is_admin, user_id, level на привилегированные значения и перезагрузить страницу.
  8. Burp Repeater — отправить запрос, менять cookies по одному, наблюдать за ответом сервера.
  9. Если cookie — число — Burp Intruder с диапазоном 0-100, Grep Match на строку формата флага.
  10. curl -v — быстрая проверка всех заголовков без запуска браузера, удобно для первичной разведки.

Этот чеклист — не замена полноценному пентесту, а фильтр: если задача решается на этапе анализа cookies и заголовков, незачем тратить время на более сложные векторы. Чеклист ничего не дал — переходишь к SQL-инъекциям, десериализации и другим техникам.

Половина веб-задач на CTF — не про знание редких уязвимостей, а про внимательность к тому, что сервер уже отдаёт. Навык читать cookies, декодировать заголовки и подменять значения в Repeater переносится один в один на реальные проекты. В MITRE ATT&CK техника Steal Web Session Cookie (T1539) описывает ровно то, чему учат эти задачи: получение доступа к сессионным данным через анализ cookies. Разница между CTF и реальной атакой — в масштабе последствий, но механика та же.

Есть мнение, что CTF-задачи на cookies — это «детский сад», который не имеет отношения к реальной безопасности. На практике всё ровно наоборот. На каждом втором аудите веб-приложений встречаются cookies без HttpOnly, сессионные токены в base64 без подписи, предсказуемые session ID с числовым инкрементом. Проблемы из OWASP A07:2021 никуда не делись за четыре года — и навык, отточенный на CTF-задачах, позволяет находить их быстрее любого автоматического сканера. Настоящая проблема не в сложности техник, а в том, что новички перескакивают через базу: запускают sqlmap, не заглянув во вкладку Application; пишут пейлоады для XSS, не открыв Network. Веб-задачи CTF — тренажёр именно этой привычки: сначала смотреть, потом ломать. Порядок действий, который экономит часы на реальных проектах. Если только начинаешь разбираться в ИБ — IB Basics в Codeby закрывает фундамент от сетей до первых задач, без академического тона.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...