
На 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-инъекции наугад.
Прежде чем запускать 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. Не Burp, не curl, а встроенный инспектор браузера. Открывается в Chrome через F12 или Ctrl+Shift+I, и большинство задач уровня easy решаются, не выходя из этого окна.
Открываешь DevTools, переходишь на вкладку Application (в Firefox — Storage). В левой панели разворачиваешь секцию Cookies и видишь все cookies для текущего домена: имя, значение, домен, путь, срок действия, флаги Secure, HttpOnly и SameSite.
Что делать:
dXNlcm5hbWU9YWRtaW4= — это base64 (подсказка: набор символов A-Za-z0-9+/ и символ = в конце для padding).session, token, secret, role, user, auth — любое из них может указывать на cookie с данными аутентификации.Значение cookie можно изменить прямо в таблице Application — двойной клик на ячейке Value, вводишь новое значение, перезагружаешь страницу (F5) и смотришь, как отреагирует сервер.
Переходишь на вкладку Network, перезагружаешь страницу (Ctrl+R). В списке запросов выбираешь первый (обычно сам HTML-документ). В правой панели открываешь секцию Response Headers.
Что искать:
X-: X-Flag, X-Hint, X-Secret-Token. Авторы задач обожают прятать подсказки в кастомных заголовках.Типичная ошибка новичка: искать флаг в теле страницы, когда он прилетел в заголовке ответа. Network-вкладка показывает то, что на странице не отображается.
Elements (Ctrl+Shift+C) — поиск по DOM-дереву страницы. Жмёшь Ctrl+F прямо в панели Elements и ищешь по ключевым словам: flag, ctf, hidden, secret, comment, admin. HTML-комментарии <!-- --> видны только здесь или в исходном коде (Ctrl+U).
Console — выполнение JavaScript для чтения и модификации cookies. Команда document.cookie выводит все cookies без флага HttpOnly. Здесь же можно задавать новые значения — об этом ниже в разделе про подмену.
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 в терминале.
В 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 строилась именно на этом — приложение использовало слабый ключ из предоставленного списка.
Подмена через 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 — навык, который отделяет человека, решающего задачи за минуты, от того, кто часами пишет инъекции впустую. Сервер в каждом ответе отдаёт метаданные: версию ПО, тип сессии, а иногда и прямые подсказки от авторов задачи.
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 говорит о стеке технологий и определяет, какие уязвимости стоит проверять.
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 эти же знания позволяют определить вектор атаки за секунды, до написания первой строки эксплойта.
Когда DevTools недостаточно — запускаешь Burp Suite. Community Edition бесплатна и покрывает подавляющее большинство задач на CTF. Burp работает как прокси между браузером и сервером: каждый запрос проходит через него, и ты можешь его остановить, поковырять и отправить заново.
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-задач:
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 единственный вариант без написания скриптов.
Когда значение cookie — число, но правильное неизвестно, Intruder решает задачу перебором за секунды. На picoCTF 2021 задача Cookies решалась именно так (по данным writeup picoCTF 2021):
name=-1 через Proxy.-1 как позиции для подстановки.picoCTF{, чтобы мгновенно определить ответ с флагом.В Community Edition Intruder работает с ограничением скорости (throttling), но для диапазона в 100 значений это не критично — задача решается за пару минут.
Бесплатная версия не включает активный сканер, Collaborator и часть BApp-расширений. Для CTF-задач на cookies и сессии этого обычно не нужно — Proxy, Repeater и Intruder покрывают основной рабочий процесс. Если задача требует анализа зашифрованных Flask-токенов, полезны внешние инструменты для подбора секретного ключа.
Прежде чем переходить к инъекциям и сложным техникам, пройдись по этому списку. На задачах уровня easy и приличной части medium он закрывает большинство тасков:
=), hex (символы 0-9a-f), JWT (три части через точку), число.flag, ctf, hidden, secret, admin, comment в HTML-коде.document.cookie — прочитать доступные cookies через JavaScript, попробовать atob() для base64-значений.role, is_admin, user_id, level на привилегированные значения и перезагрузить страницу.Этот чеклист — не замена полноценному пентесту, а фильтр: если задача решается на этапе анализа 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 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...