June 24

Анализ заголовков HTTP: серверы, cookies, политики безопасности

Анализ заголовков HTTP: серверы, cookies, политики безопасности (CSP, HSTS, X-Frame-Options и другие)

HTTP-заголовки — это метаданные, которыми обмениваются клиент (браузер) и сервер при каждом запросе. Для специалиста по техническому OSINT заголовки — ценный источник информации: они раскрывают версии программного обеспечения, используемые технологии, настройки безопасности и даже особенности конфигурации. Помимо этого, заголовки безопасности (CSP, HSTS, X-Frame-Options) позволяют оценить уровень защищённости веб-приложения и выявить потенциальные уязвимости. Данная статья посвящена методам сбора и анализа HTTP-заголовков, а также извлечению разведывательной информации из них.

Почему HTTP-заголовки важны для технического OSINT?

Этап 1: Сбор заголовков (базовые инструменты)

1. curl — самый простой способ:

# Показать только заголовки ответа
curl -I https://example.com

# Показать заголовки запроса и ответа
curl -v https://example.com

# Сохранить заголовки в файл
curl -D headers.txt https://example.com

2. wget:

wget --server-response -O /dev/null https://example.com

3. Browser DevTools (F12 → Network → выбрать запрос → Headers).

4. Онлайн сервисы:

  • SecurityHeaders.com — проверяет наличие и корректность заголовков безопасности, выставляет оценку.
  • HTTPHeaderCheck (httpheadercheck.com) — анализирует заголовки и даёт рекомендации.
  • Mozilla Observatory — глубокий анализ безопасности с рекомендациями.

Этап 2: Анализ идентификационных заголовков

Эти заголовки могут выдать технологии, версии ПО, что полезно для обнаружения устаревших или уязвимых компонентов.

Server:

  • Указывает тип и версию веб-сервера. Примеры: nginx/1.18.0, Apache/2.4.41 (Ubuntu), Microsoft-IIS/10.0, Cloudflare.
  • Часто скрывается администраторами (Server: Apache, без версии). Если версия показана — сверьте с базами уязвимостей.

X-Powered-By:

  • Показывает технологию бэкенда. Например: PHP/7.4.33, ASP.NET, Express. Может дать версию языка/фреймворка.

X-Generator:

  • Иногда содержит название CMS или генератора контента (например, WordPress 6.2).

X-AspNet-Version:

  • Для ASP.NET. Пример: X-AspNet-Version: 4.0.30319.

X-Powered-By-Plesk: (если используется панель управления хостингом).

Этап 3: Анализ cookie и сессионных заголовков

Заголовок Set-Cookie не только управляет сессиями, но и выдаёт технологии.

Set-Cookie:

  • PHPSESSID=... → PHP (версия сессионного механизма).
  • JSESSIONID=... → Java (JSP).
  • ASPSESSIONID...ASP.NET.
  • laravel_session=... → Laravel (PHP-фреймворк).
  • XSRF-TOKEN → часто используется в Angular, Laravel, Django.

Флаги cookie (httponly, secure, samesite):

  • HttpOnly — недоступен для JavaScript (хорошо для безопасности).
  • Secure — только через HTTPS.
  • SameSite=Lax/Strict — защита от CSRF.

Этап 4: Заголовки безопасности (Security Headers)

Оценка безопасности веб-приложения — важная часть разведки. Слабые настройки могут привести к уязвимостям (кликджекинг, XSS, перехват сессий).

4.1. Content-Security-Policy (CSP)

CSP — белый список источников загрузки ресурсов (скриптов, стилей, изображений). Хорошо настроенный CSP сильно уменьшает риск XSS.

Анализ CSP:

  • default-src 'none' — жёсткая политика.
  • script-src 'self' — разрешены скрипты только с того же домена.
  • unsafe-inline, unsafe-eval — опасные директивы, делают CSP бесполезным.
  • report-uri /report-csp-violation — куда отправлять отчёты о нарушениях.

Ошибки:

  • Отсутствие CSP — распространённая проблема.
  • Наличие unsafe-inline без nonce/hash — снижает защиту.
  • Слишком широкие источники (*.example.com, https:).

4.2. HSTS (HTTP Strict Transport Security)

Принудительное использование HTTPS для всех подключений к домену.

Пример: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Анализ:

  • max-age=0 — отключено (опасно).
  • includeSubDomains — принудительный HTTPS для всех поддоменов.
  • preload — домен включён в предзагружаемый список браузеров (максимальный уровень).
  • Отсутствие HSTS — возможность атаки «понижения до HTTP» (SSL stripping).

4.3. X-Frame-Options

Защита от кликджекинга (встраивания сайта в frame).

Значения:

  • DENY — запрещено встраивание в frame.
  • SAMEORIGIN — разрешено только с того же домена.
  • ALLOW-FROM uri — устаревшее.
  • Отсутствие заголовка — сайт можно встроить в <iframe> (угроза UI redressing).

4.4. X-Content-Type-Options

Защита от MIME-тип-путаницы (MIME sniffing).

Единственное допустимое значение: nosniff. Если отсутствует — браузер может выполнить script, даже если тип указан как текст.

4.5. X-XSS-Protection

Старый заголовок для защиты от XSS (в основном для старых браузеров).

Значения:

  • 1; mode=block — блокировать страницу при обнаружении XSS.
  • 1 — попытаться очистить (менее безопасно).
  • 0 — отключено.

В современных браузерах во многом заменён CSP, но его наличие всё же полезно.

4.6. Referrer-Policy

Контролирует передачу referer при переходе по ссылкам.

Настройки:

  • no-referrer — вообще не передавать.
  • strict-origin — передавать только схему и домен (при HTTPS→HTTPS).
  • unsafe-url — всегда передавать полный URL (опасно, утечка параметров).

4.7. Feature-Policy / Permissions-Policy

Ограничивает доступ к функциям браузера (камера, микрофон, геолокация). Может содержать информацию о политиках организации.

Этап 5: Заголовки, указывающие на CDN, прокси, кэширование

Эти заголовки помогают понять, скрыт ли реальный IP сервера за CDN, используется ли балансировка, кэширование.

Cloudflare:

  • CF-Cache-Status (HIT, MISS, EXPIRED, DYNAMIC).
  • CF-RAY.
  • CF-Connection-Connecting.

Akamai:

  • X-Akamai-Transformed, X-Akamai-Cache-Status.

AWS CloudFront:

  • X-Amz-Cf-Id, X-Cache (Hit from cloudfront).

Varnish:

  • X-Varnish, X-Cache (HIT, MISS).

Этап 6: Анализ заголовков на предмет утечки внутренней информации

Некоторые заголовки могут раскрывать внутреннюю инфраструктуру:

  • X-Backend-Server — имя внутреннего сервера.
  • X-Debug-Token, X-Debug-Token-Link — утечка отладочной информации.
  • X-Server-Name — имя сервера внутри сети.
  • X-Forwarded-For (иногда) — реальный IP клиента, но может содержать IP прокси.
  • Via — прокси-серверы (например, Via: 1.1 varnish).

Если увидели X-Backend-Server: web01.internal.company.com — это очень ценно: можно узнать внутреннюю структуру и возможные имена хостов.

Этап 7: Инструменты для массового сбора заголовков

Httpx (от ProjectDiscovery) — быстрый HTTP-клиент, собирает заголовки, извлекает технологии, поддерживает вывод в JSON.

httpx -u https://example.com -sc -title -tech-detect -json -o headers.json

HTTPX (Python-библиотека) — позволяет автоматизировать запросы:

import httpx

def get_headers(url):
    try:
        response = httpx.get(url, follow_redirects=True, timeout=10)
        headers = dict(response.headers)
        # дополнительные данные
        headers['_status_code'] = response.status_code
        headers['_url'] = str(response.url)
        return headers
    except Exception as e:
        return {'_error': str(e)}

# Пример для одного сайта
print(get_headers('https://example.com'))

Этап 8: Автоматический анализ с помощью SecurityHeaders.com API

SecurityHeaders.com предоставляет API для оценки заголовков.

curl https://securityheaders.com/?q=https://example.com&hide=on

Ответ — HTML, но можно парсить. Оценка от A+ до F (рекомендуется A).

Пример из утилиты: можно использовать curl и grep для извлечения рейтинга.

Этап 9: Оценка качества и потенциальных уязвимостей по заголовкам

Недостатки в заголовках безопасности могут указывать на слабую защиту:

  • Нет HSTS → риск с stripping (особенно для сайтов с логинами).
  • Нет CSP → уязвимость XSS.
  • Нет X-Frame-Options → риск кликджекинга.
  • Наличие X-Powered-By с точной версией → может помочь злоумышленнику (но не является уязвимостью).

Практический пример: разбор заголовков сайта с логином

Задача: проверить защищённость сайта login.target.com по заголовкам.

  1. Запрос заголовков:textcurl -I https://login.target.comОтвет:textHTTP/2 200 server: nginx/1.22.0 x-powered-by: PHP/7.4.33 set-cookie: PHPSESSID=abc123; path=/; HttpOnly; Secure strict-transport-security: max-age=0 x-frame-options: DENY x-content-type-options: nosniff x-xss-protection: 1; mode=block content-security-policy: default-src 'self'
  2. Анализ:
    • server: nginx/1.22.0 — версия Nginx актуальна на момент проверки.
    • x-powered-by: PHP/7.4.33 — PHP 7.4.33 EOL? Проверить (на момент написания 7.4 достиг EOL, могут быть уязвимости).
    • PHPSESSID с HttpOnly; Secure — хорошо.
    • strict-transport-security: max-age=0 — HSTS выключен! Очень плохо для страницы логина.
    • CSP: default-src 'self' — хорошо, но лучше конкретные директивы.
  3. Рекомендации:
    • Включить HSTS с долгим max-age.
    • Обновить PHP до поддерживаемой версии.
    • Расширить CSP, запретив inline-скрипты.

Этап 10: Мониторинг изменений заголовков

Заголовки могут меняться со временем: администраторы могут включить HSTS, изменить версии ПО. Мониторинг изменений помогает отслеживать обновления безопасности.

Как организовать мониторинг:

  • Периодически запрашивать заголовки (раз в день, раз в неделю).
  • Сравнивать хэши ответов (или конкретных заголовков).
  • При изменении — уведомление.

Python-скрипт мониторинга:

import hashlib
import httpx
import time

def fetch_headers_hash(url):
    response = httpx.get(url, follow_redirects=True)
    # конкатенируем все заголовки в строку
    headers_str = str(sorted(response.headers.items()))
    return hashlib.sha256(headers_str.encode()).hexdigest()

def monitor(url, interval_hours=24):
    last_hash = None
    while True:
        current_hash = fetch_headers_hash(url)
        if last_hash is None:
            last_hash = current_hash
            print(f"Initial hash: {current_hash}")
        elif current_hash != last_hash:
            print(f"Headers changed for {url}!")
            # здесь можно отправить уведомление
            last_hash = current_hash
        time.sleep(interval_hours * 3600)

Этические и правовые ограничения

  • Сбор заголовков с помощью curl/httpx — это обычный HTTP-запрос, который не нарушает закон (аналогично посещению сайта браузером).
  • Использование SecurityHeaders.com и аналогичных сервисов также легально.
  • Массовый сбор заголовков (тысячи доменов) может привести к блокировке IP, если сайт расценит это как сканирование. Используйте разумные интервалы.
  • Анализ заголовков безопасности не даёт права атаковать сайт. Информация используется для оценки защищённости (в рамках разрешённого тестирования).

HTTP-заголовки — богатый источник информации при пассивном техническом OSINT. Идентификационные заголовки (Server, X-Powered-By) раскрывают версии ПО, что позволяет искать уязвимости. Заголовки cookie указывают на используемые технологии и фреймворки. Заголовки безопасности (CSP, HSTS, X-Frame-Options) оценивают защищённость веб-приложения. Заголовки кэширования и прокси помогают определить CDN и скрыть реальный IP. Комбинация этих данных с результатами других статей цикла даёт наиболее полную картину инфраструктуры цели.