HTTP для начинающего пентестера: методы, коды ответа, заголовки, cookies и сессии

Почему HTTP — первый протокол, который нужно понимать​


HTTP — протокол прикладного уровня, по которому браузер общается с сервером. Он stateless: сервер не хранит данные между запросами. Состояние добавляется через cookies и сессионные механизмы. Для пентестера это означает, что каждый запрос и каждый ответ — самостоятельный артефакт, который можно перехватить, модифицировать и проанализировать.

Без понимания структуры HTTP-сообщения невозможно корректно интерпретировать результаты сканирования, находить логические уязвимости или проверять настройки безопасности. Ниже — разбор каждого слоя протокола с акцентом на то, что важно при тестировании на проникновение.

Структура HTTP-сообщения​


Каждое сообщение состоит из стартовой строки, заголовков и опционального тела.

Запрос:

Код:
GET /admin/dashboard HTTP/1.1
Host: target.example.com
Cookie: session_id=abc123
Accept: text/html

Ответ:

Код:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Set-Cookie: session_id=abc123; Path=/; HttpOnly

<html>...</html>

Пентестеру важно уметь читать обе стороны: запрос показывает, что клиент отправляет (и что можно подменить), ответ — что сервер раскрывает и какие ограничения устанавливает.

Методы запросов и их значение для безопасности​


МетодНазначениеЧто проверять
GETПолучение ресурсаПараметры в URL видны в логах, истории браузера, Referer
POSTОтправка данных в телеДанные не в URL, но всё равно передаются открытым текстом без TLS
PUTСоздание/замена ресурсаМожет быть разрешён там, где не должен
DELETEУдаление ресурсаПроверка авторизации на деструктивные операции
OPTIONSЗапрос поддерживаемых методовРаскрывает список методов, включая потенциально опасные
PATCHЧастичное изменениеАналогично PUT — проверка контроля доступа
HEADКак GET, но без телаПолезен для проверки существования ресурса без загрузки
TRACEЭхо-запросЧасто отключён из-за риска XST (Cross-Site Tracing). Если включён — может раскрывать внутренние заголовки, добавленные прокси, и использоваться для обхода HttpOnly

Практический приём: отправьте OPTIONS на интересующий endpoint. Если сервер возвращает Allow: GET, POST, PUT, DELETE, это сигнал проверить, действительно ли все эти методы требуют авторизации.

TRACE заслуживает отдельного внимания: при включённом TRACE сервер возвращает тело запроса без изменений, включая заголовки, которые добавили промежуточные прокси. Это позволяет атакующему прочитать cookie с флагом HttpOnly через XSS-вектор (атака XST). Именно поэтому большинство серверов отключают TRACE по умолчанию, и его наличие — индикатор слабой конфигурации.

Коды ответа: что искать пентестеру​


Коды сгруппированы в пять классов по первой цифре.

2xx — успех​


  • 200 OK — стандартный успешный ответ.
  • 201 Created — ресурс создан. Если возвращается после POST без проверки прав — возможная проблема авторизации.
  • 204 No Content — операция выполнена, тело пустое. Часто встречается при DELETE.

3xx — перенаправления​


  • 301 / 302 — постоянное и временное перенаправление. Проверяйте, куда ведёт Location: открытый редирект — это вектор для фишинга и обхода SSRF-фильтров.
  • 307 / 308 — перенаправление с сохранением метода. Важно при тестировании: POST не превращается в GET.

4xx — ошибки клиента​


  • 401 Unauthorized — требуется аутентификация. Проверяйте, можно ли обойти через другой метод или заголовок.
  • 403 Forbidden — аутентификация есть, но прав недостаточно. Разница между 401 и 403 помогает картировать модель авторизации.
  • 404 Not Found — ресурс не существует. Но если на один путь возвращается 404, а на другой 403 — это раскрывает структуру приложения.
  • 405 Method Not Allowed — метод не поддерживается. Полезно для перечисления допустимых операций.

5xx — ошибки сервера​


  • 500 Internal Server Error — необработанное исключение. Часто содержит стектрейс или информацию о фреймворке.
  • 503 Service Unavailable — сервер перегружен или на обслуживании. Может указывать на rate limiting.

Заголовки, которые раскрывают информацию​


Заголовки запроса​


ЗаголовокЗачем нужен пентестеру
HostОпределяет виртуальный хост. Подмена может открыть скрытые сайты на том же IP
User-AgentНекоторые WAF и приложения фильтруют по нему
RefererМожет использоваться для проверки источника запроса
X-Forwarded-ForПередаёт оригинальный IP клиента через прокси. Подмена может обойти IP-based rate limiting
AuthorizationНесёт учётные данные (Basic, Bearer). Проверяйте формат и стойкость
Content-TypeОпределяет формат тела. Смена может обойти валидацию

Заголовки ответа​


ЗаголовокЧто искать
ServerРаскрывает тип и версию веб-сервера
X-Powered-ByУказывает на фреймворк (PHP, ASP.NET, Express)
Set-CookieУстанавливает cookies — анализируйте атрибуты
Content-Security-PolicyОграничивает источники загрузки ресурсов. Отсутствие или слабая политика — риск XSS
X-Frame-OptionsЗащита от clickjacking. Значения: DENY, SAMEORIGIN
Strict-Transport-SecurityПринуждает браузер использовать HTTPS. Отсутствие — риск downgrade-атаки
Access-Control-Allow-OriginНастройка CORS. Значение * или отражение произвольного Origin — потенциальная утечка данных

Cookies: структура и атрибуты безопасности​


HTTP-куки — небольшой фрагмент данных, который сервер отправляет браузеру через заголовок Set-Cookie. Браузер сохраняет его и возвращает с каждым последующим запросом к тому же серверу в заголовке Cookie. Именно cookies добавляют состояние к stateless-протоколу.

Синтаксис Set-Cookie​


Код:
Set-Cookie: <имя>=<значение>; Expires=<дата>; Max-Age=<секунды>; Domain=<домен>; Path=<путь>; Secure; HttpOnly; SameSite=Strict

Атрибуты и их влияние на безопасность​


Expires / Max-Age — определяют время жизни. Если ни один не задан, cookie является сессионным и удаляется при закрытии браузера. Однако многие браузеры восстанавливают сессию, поэтому сессионные cookies могут жить дольше ожидаемого. Если заданы оба атрибута, Max-Age имеет приоритет.

Domain — указывает, каким хостам отправляется cookie. По умолчанию — текущий хост без поддоменов. Если задан явно (например, Domain=example.com), cookie отправляется и на все поддомены. Это важно: уязвимый поддомен может установить cookie для родительского домена, что открывает путь к атаке фиксации сессии.

Path — ограничивает URL-пути, для которых cookie отправляется. Path=/ означает отправку со всеми запросами. Path=/docs/ ограничивает отправку запросами к директории docs и её поддиректориям.

Secure — cookie отправляется только по HTTPS. Не обеспечивает шифрования самого значения. Начиная с Chrome 52 и Firefox 52, сайты на http: не могут устанавливать cookies с этим флагом.

HttpOnly — запрещает доступ к cookie из JavaScript через document.cookie. Критически важен для защиты от кражи сессионных токенов через XSS.

SameSite — управляет отправкой cookie при межсайтовых запросах:

  • Strict — cookie отправляется только при запросах с того же сайта.
  • Lax — cookie не отправляется при межсайтовых подзапросах (изображения, фреймы), но отправляется при навигации по ссылке.
  • None — cookie отправляется всегда, но требует одновременного наличия Secure.

Если SameSite не указан, современные браузеры применяют Lax по умолчанию.

Префиксы cookie-имён​


Два префикса обеспечивают дополнительные гарантии:

  • __Secure- — cookie должна быть установлена с флагом Secure и с HTTPS-страницы.
  • __Host- — требует Secure, Path=/ и запрещает атрибут Domain. Это самая строгая защита: cookie привязана к конкретному хосту и не может быть перехвачена поддоменом.

Код:
Set-Cookie: __Host-session=token123; Secure; Path=/

Браузер отклонит установку, если любое условие нарушено. Бэкенд обязан обращаться по полному имени cookie, включая префикс — пользовательские агенты не удаляют префикс перед отправкой.

Сессии: как они работают и что проверять​


Типичный механизм сессии:

  1. Пользователь отправляет учётные данные (POST на /login).
  2. Сервер создаёт сессию, генерирует идентификатор и возвращает его через Set-Cookie.
  3. Браузер отправляет cookie с каждым запросом.
  4. Сервер по идентификатору находит сессию в хранилище (память, база, Redis).

Чек-лист проверки сессионного механизма​


  • Энтропия идентификатора. Сессионный токен должен быть криптографически случайным. Последовательные числа или предсказуемые паттерны — критическая уязвимость.
  • Атрибуты cookie. Проверьте наличие HttpOnly, Secure, SameSite. Отсутствие HttpOnly на сессионной cookie — прямой путь к краже через XSS.
  • Регенерация при логине. После успешной аутентификации идентификатор сессии должен меняться. Если старый token продолжает работать — возможна фиксация сессии.
  • Инвалидация при выходе. После logout сервер должен уничтожить сессию. Если cookie удаляется только на клиенте, а серверная сессия живёт — токен можно переиспользовать.
  • Таймаут неактивности. Сессия должна истекать после периода бездействия.
  • Поведение при параллельных сессиях. Можно ли войти с двух устройств одновременно? Это не всегда уязвимость, но должно быть осознанным решением.

Перехват и модификация трафика​


Для анализа HTTP-трафика пентестер использует прокси-сервер, который sits между браузером и целевым приложением. Burp Suite и OWASP ZAP — основные инструменты.

Типовой workflow в учебной лаборатории:

  1. Настроить браузер на прокси (обычно 127.0.0.1:8080).
  2. Установить CA-сертификат прокси для перехвата HTTPS.
  3. Перехватить запрос, изучить заголовки и параметры.
  4. Модифицировать и отправить повторно (Repeater в Burp Suite).
  5. Сравнить ответы: изменился ли код, появились ли ошибки, раскрылась ли информация.

Bash:
## Альтернатива для быстрой проверки без GUI — curl
## Отправка запроса с кастомным заголовком на локальную лабораторию
curl -v -H "X-Forwarded-For: 127.0.0.1" http://localhost:8080/admin

Флаг -v выводит полные заголовки запроса и ответа — удобно для быстрого анализа без запуска прокси.

Типичные ошибки при анализе HTTP​


  • Игнорирование кодов 3xx. Перенаправление может скрывать реальный endpoint или уводить от уязвимого пути.
  • Проверка только GET. Уязвимость может проявляться только при PUT или DELETE, которые не видны в обычном браузере.
  • Доверие клиентской валидации. Если поле disabled в HTML или проверка на JavaScript — это не защита. Серверная валидация обязательна.
  • Непроверка CORS. Если сервер возвращает Access-Control-Allow-Origin: * одновременно с Access-Control-Allow-Credentials: true, браузер блокирует доступ к ответу согласно спецификации CORS. Однако само наличие такого сочетания указывает на некорректную серверную конфигурацию: сервер не проверяет Origin и, вероятно, отражает произвольные значения. В сочетании с конкретным Origin (а не *) и credentials: true это уже эксплуатируемая утечка данных.
  • Пропуск заголовков безопасности. Отсутствие Content-Security-Policy, X-Content-Type-Options: nosniff, Strict-Transport-Security — это не уязвимость сама по себе, но индикатор слабого security posture.

Итоговый чек-лист для анализа HTTP-приложения​


  1. Перехватите трафик через прокси, изучите структуру запросов и ответов.
  2. Отправьте OPTIONS на ключевые endpoint'ы — перечислите доступные методы.
  3. Проверьте коды ответа на несанкционированный доступ (401 vs 403 vs 200).
  4. Проанализируйте Set-Cookie: наличие HttpOnly, Secure, SameSite, предсказуемость значений.
  5. Проверьте регенерацию сессионного токена при логине и инвалидацию при logout.
  6. Изучите заголовки безопасности ответа: CSP, HSTS, X-Frame-Options, CORS.
  7. Попробуйте подменить Host, X-Forwarded-For, Content-Type — оцените реакцию сервера.
  8. Зафиксируйте все находки с полными запросами и ответами для отчёта.

Все проверки проводите только в рамках согласованного scope: собственная лаборатория, CTF-платформа или авторизованный пентест. DNS для начинающего пентестера: записи, резолвинг и безопасная диагностика в учебной сети поможет разобраться с DNS-диагностикой, если нужно определить инфраструктуру цели до начала HTTP-анализа.

Источники​


 
Назад
Верх Низ