
Приветствую тебя, уважаемый читатель!
Мы начинаем цикл статей про настройку правил WAF (на примере продукта «ПроWAF»), поделимся хитростями и неочевидными способами настройки WAF для борьбы с некоторыми веб-атаками. И наша первая тема: манипуляция с заголовками ответа. Сразу стоит заметить, что управлять заголовками ответа чаще всего приходится через конфиг веб‑сервера и очень многие DevOps инженеры сочтут странным использование для этого WAF, ведь конфигурация как бы «размазывается» между несколькими сущностями...
Ответим: через WAF делать настройку может оказаться удобнее. То, что относится к безопасности — отображается в WAF. Также не нужно лезть в конфиги веб‑серверов, не нужны права root. Безопасник может настраивать систему, не тревожа DevOps.
Зачем вообще управлять заголовками ответа HTTP-сервера?
Управление механизмами безопасности браузера
Это первое и основное применение. Заголовки ответа используются браузерами для активации или настройки механизмов защиты клиента.
Не буду описывать детально каждый из механизмов, ведь на эту тему есть прекрасная документация и десятки толковых статей. Приведу список заголовков со ссылкой на документацию:
Также есть онлайн сервисы для тестирования приложения на наличие и корректность заголовков безопасности. Например:
Примеры правил «ПроWAF» на добавление заголовков безопасности.


Управление кешированием
Обычно статику через WAF не раздают, но раз уж пошел разговор про заголовки ответа, то для общей картины, думаю, стоит упомянуть про заголовок Cache-Control.
Взаимодействие с поисковыми роботами
Тут отмечу только X-Robots-Tag.
Затруднение сбора информации о приложении (Security through obscurity)
Еще один способ извлечь пользу из манипуляции заголовками ответа - затруднить для атакующего сбор информации о приложении, скрыть подлинные версии и виды ПО.
Зачастую веб-серверы и фреймворки добавляют свои заголовки в ответ, и по их содержимому или по наличию специфических заголовков злоумышленник сможет понять, с каким ПО он имеет дело и подготовиться к атаке на приложение, подобрав подходящий эксплойт и т.п.
Вот некоторые заголовки ответа, которые могут раскрыть информацию о сервере:
Server:
Указывает информацию о веб-сервере: его название и версию.
Пример: Server: Apache/2.4.41 (Ubuntu)
X-Powered-By:
Передает информацию о технологии, фреймворке или языке программирования, используемых на сервере.
Пример: X-Powered-By: PHP/7.4.3 или X-Powered-By: Express
X-AspNet-Version:
Указывает версию ASP.NET, которая используется на сервере.
Пример: X-AspNet-Version: 4.0.30319
X-Backend-Server:
Пример: X-Backend-Server: backend1.example.com
X-Generator:
Этот заголовок может указывать на инструмент или фреймворк, который сгенерировал страницу.
Пример: X-Generator: WordPress 5.5.1
Х-Powered-CMS:
Иногда указывает на использование конкретной CMS (Content Management System).
Пример: X-Powered-CMS: Joomla! 3.9.19
X-Powered-By-Plesk:
Указывает на использование панели управления хостингом Plesk.
Пример: X-Powered-By-Plesk: PleskWin
X-Environment:
Может указывать на среду, в которой работает приложение (например, production, staging, development).
Пример: X-Environment: production
X-Powered-By-Framework:
Может содержать информацию о фреймворке, на котором построено приложение.
Пример: X-Powered-By-Framework: Laravel
X-Server-Software:
Похож на заголовок Server, но может быть использован для указания дополнительной информации о программном обеспечении сервера.
Пример: X-Server-Software: Apache/2.4.41 (Unix)
Помимо перечисленных выше, ваше приложение может добавлять и свои уникальные заголовки, которые не всегда хочется показывать наружу.
Разумеется, только модификацией или удалением заголовков проблему определения стека не решить, но модификация заголовков ответа поможет не выделяться в поисковиках вроде shodan где любой желающий может сделать поисковый запрос и вывести все серверы с определенным заголовком.
Для интересующихся темой fingerprintin'га веб-серверов оставлю несколько ссылок на инструменты и сигнатуры:
https://github.com/saganshul/owtf-tornado-react-demo/blob/master/tools/httprint-signatures.txt
https://webtechsurvey.com/common-response-headers
https://github.com/tunetheweb/wappalyzer/tree/master
https://github.com/nmap/nmap/blob/master/nselib/data/http-fingerprints.lua
А правило для удаления заголовка ответа приводим ниже:

Кстати, ничего не мешает перезаписывать содержимое заголовка ответа и менять шило на мыло, т.е. IIS на apache ;)
Немножечко странного
В заключение привожу несколько нетрадиционных способов использования заголовков ответа. Это скорее фан, нежели техническая необходимость.
Некоторые компании так размещают объявления о вакансиях
X-Recruiting: Like HTTP headers? Come write ours: https://careers.example.com X-Hiring: "We are hiring! Join our team as a Senior Backend Developer at jobs.example.com". |
Кто-то пытается вставлять рекламу
X-Promo: "Check out our new API at api.example.com!". |
Помню, была история с веб-сервером (его название, увы, уже выветрилось из памяти), который так пытался монетизироваться ;)
Кто-то использует заголовки в юмористических целях
X-Security: "Armed with lasers and firewalls!". X-AI-Message: "I’m learning from every request you send...". X-API-Calories: "This request burned 42 calories". X-Secret-Code: "42-A7F9-GH35". # и пусть свидетель сего заголовка ломает голову что бы это значило )) |
Или для новостей, подсказок и анонсов
X-Tip: "Did you know? You can now integrate with our API using GraphQL!". X-Update-Notice: "Version 2.0 is live! Explore the new API endpoints.". X-Quest-Hint: "To unlock the next level, find the secret word hidden in our API docs.". X-Security-Tip: "Enable two-factor authentication for better security.". |
И да, вы можете настроить что-то подобное у себя через наш WAF ;))
Заключение
В этой статье мы в общих чертах рассмотрели некоторые заголовки ответа и способы извлечь из них пользу, а также взглянули, как это легко сделать через WAF. Управлять заголовками ответа таким образом можно как для всего приложения, так и для любой его части, править конфиги веб-сервера не обязательно.
Буду рад дополнениям, замечаниям и предложениям )