Анализ заголовков 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
wget --server-response -O /dev/null https://example.com
3. Browser DevTools (F12 → Network → выбрать запрос → Headers).
- SecurityHeaders.com — проверяет наличие и корректность заголовков безопасности, выставляет оценку.
- HTTPHeaderCheck (httpheadercheck.com) — анализирует заголовки и даёт рекомендации.
- Mozilla Observatory — глубокий анализ безопасности с рекомендациями.
Этап 2: Анализ идентификационных заголовков
Эти заголовки могут выдать технологии, версии ПО, что полезно для обнаружения устаревших или уязвимых компонентов.
- Указывает тип и версию веб-сервера. Примеры:
nginx/1.18.0,Apache/2.4.41 (Ubuntu),Microsoft-IIS/10.0,Cloudflare. - Часто скрывается администраторами (
Server: Apache, без версии). Если версия показана — сверьте с базами уязвимостей.
- Показывает технологию бэкенда. Например:
PHP/7.4.33,ASP.NET,Express. Может дать версию языка/фреймворка.
- Для ASP.NET. Пример:
X-AspNet-Version: 4.0.30319.
X-Powered-By-Plesk: (если используется панель управления хостингом).
Этап 3: Анализ 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.
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).
Защита от кликджекинга (встраивания сайта в frame).
DENY— запрещено встраивание в frame.SAMEORIGIN— разрешено только с того же домена.ALLOW-FROM uri— устаревшее.- Отсутствие заголовка — сайт можно встроить в
<iframe>(угроза UI redressing).
Защита от MIME-тип-путаницы (MIME sniffing).
Единственное допустимое значение: nosniff. Если отсутствует — браузер может выполнить script, даже если тип указан как текст.
Старый заголовок для защиты от XSS (в основном для старых браузеров).
1; mode=block— блокировать страницу при обнаружении XSS.1— попытаться очистить (менее безопасно).0— отключено.
В современных браузерах во многом заменён CSP, но его наличие всё же полезно.
Контролирует передачу referer при переходе по ссылкам.
no-referrer— вообще не передавать.strict-origin— передавать только схему и домен (при HTTPS→HTTPS).unsafe-url— всегда передавать полный URL (опасно, утечка параметров).
4.7. Feature-Policy / Permissions-Policy
Ограничивает доступ к функциям браузера (камера, микрофон, геолокация). Может содержать информацию о политиках организации.
Этап 5: Заголовки, указывающие на CDN, прокси, кэширование
Эти заголовки помогают понять, скрыт ли реальный IP сервера за CDN, используется ли балансировка, кэширование.
Этап 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 по заголовкам.
- Запрос заголовков: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'
- Анализ:
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'— хорошо, но лучше конкретные директивы. - Рекомендации:
Этап 10: Мониторинг изменений заголовков
Заголовки могут меняться со временем: администраторы могут включить HSTS, изменить версии ПО. Мониторинг изменений помогает отслеживать обновления безопасности.
- Периодически запрашивать заголовки (раз в день, раз в неделю).
- Сравнивать хэши ответов (или конкретных заголовков).
- При изменении — уведомление.
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. Комбинация этих данных с результатами других статей цикла даёт наиболее полную картину инфраструктуры цели.