Добавить в корзинуПозвонить
Найти в Дзене
ХАК

Пишем свой сканер уязвимостей на Python: проверяем заголовки безопасности сайта

Введение Представьте, что веб-сайт — это крепость. Крепкие стены (брандмауэры) и бдительная охрана (системы обнаружения вторжений) — это хорошо, но что, если главные ворота открыты настежь? Именно такую роль играют HTTP-заголовки безопасности. Это невидимые инструкции, которые браузер получает от сервера, говорящие ему, как себя вести с контентом. Неправильно настроенные заголовки — это прямая угроза безопасности ваших пользователей. В этой статье мы не будем полагаться на готовые сканеры вроде Nessus или Burp Suite. Вместо этого мы напишем свой собственный сканер уязвимостей на Python. Наша цель — научиться понимать суть безопасности веб-приложений, проверяя наличие и корректность критически важных заголовков. Это знание необходимо не только пентестерам, но и разработчикам, чтобы с самого начала создавать более защищенные продукты. Прежде чем писать код, разберемся с нашими "целями". Вот ключевые заголовки безопасности, наличие которых мы будем проверять: Нам понадобится всего несколь
Оглавление

Введение

Представьте, что веб-сайт — это крепость. Крепкие стены (брандмауэры) и бдительная охрана (системы обнаружения вторжений) — это хорошо, но что, если главные ворота открыты настежь? Именно такую роль играют HTTP-заголовки безопасности. Это невидимые инструкции, которые браузер получает от сервера, говорящие ему, как себя вести с контентом. Неправильно настроенные заголовки — это прямая угроза безопасности ваших пользователей.

В этой статье мы не будем полагаться на готовые сканеры вроде Nessus или Burp Suite. Вместо этого мы напишем свой собственный сканер уязвимостей на Python. Наша цель — научиться понимать суть безопасности веб-приложений, проверяя наличие и корректность критически важных заголовков. Это знание необходимо не только пентестерам, но и разработчикам, чтобы с самого начала создавать более защищенные продукты.

Часть 1: Какие заголовки мы будем проверять и почему?

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

  1. Strict-Transport-Security (HSTS)
    Что делает:
    Приказывает браузеру загружать сайт только по защищенному протоколу HTTPS, даже если пользователь ввел http://.
    Чем опасен пропуск: Злоумышленник может "опустить" соединение до HTTP и перехватить данные (атака SSL-stripping).
  2. Content-Security-Policy (CSP)
    Что делает:
    Указывает браузеру, с каких источников разрешено загружать скрипты, стили, изображения и т.д. Это самый мощный механизм защиты от XSS-атак.
    Чем опасен пропуск: Возможность выполнения внедренного вредоносного JavaScript-кода.
  3. X-Content-Type-Options
    Что делает:
    Запрещает браузеру "угадывать" тип контента (MIME-sniffing). Контент должен обрабатываться так, как заявил сервер.
    Чем опасен пропуск: Атакующий может загрузить вредоносный скрипт под видом картинки, и браузер, попытавшись его угадать, выполнит.
  4. X-Frame-Options
    Что делает:
    Защищает от кликджекинга, запрещая встраивать страницу в <iframe> на других сайтах.
    Чем опасен пропуск: Мошенник может встроить ваш сайт в свой и обманом заставить пользователя совершить действие (например, подтвердить платеж).
  5. Referrer-Policy
    Что делает:
    Контролирует, сколько информации о URL-источнике (referrer) передается при переходе по ссылке.
    Чем опасен пропуск/неправильная настройка: Утечка конфиденциальных данных (токенов, путей в URL) на внешние сайты.

Часть 2: Подготовка инструментов: настраиваем окружение Python

Нам понадобится всего несколько библиотек. Создадим виртуальное окружение и установим зависимости.

Скриншот терминала с командами для создания виртуального окружения и установки requests.
Скриншот терминала с командами для создания виртуального окружения и установки requests.
  • requests: для простых и элегантных HTTP-запросов.
  • colorama: для красивого цветного вывода в консоль (чтобы было видно, что прошло проверку, а что нет).

Часть 3: Пишем ядро сканера

Создадим файл scanner.py. Начнем с импорта библиотек и описания целевых заголовков.

Скриншот начала кода с импортами и словарем SECURITY_HEADERS.
Скриншот начала кода с импортами и словарем SECURITY_HEADERS.

Теперь напишем функцию, которая делает запрос к сайту и анализирует ответ.

Скриншот функции check_headers и основного цикла.
Скриншот функции check_headers и основного цикла.

Что делает этот код:

  1. Использует HEAD-запрос для экономии трафика (нам не нужен body страницы).
  2. Обрабатывает перенаправления (allow_redirects=True).
  3. Для каждого заголовка из нашего списка проверяет его наличие в ответе сервера.
  4. Выводит результат с цветовой индикацией: зеленый — есть, красный — нет, желтый — есть, но значение требует проверки.

Часть 4: Запускаем сканер и анализируем результат

Давайте протестируем наш скрипт на нескольких примерах.

Вывод: У сайта хорошая базовая защита, но отсутствует CSP, что может быть критично для большого портала.
Вывод: У сайта хорошая базовая защита, но отсутствует CSP, что может быть критично для большого портала.

Часть 5: Как улучшить наш сканер?

Наш сканер — это основа. Вот идеи для его развития:

  1. Пакетная проверка: Читать список URL из файла и проверять их все.
  2. Более глубокий анализ CSP: Парсить директивы CSP и искать небезопасные правила вроде 'unsafe-inline'.
  3. Проверка cookies: Убедиться, что у куки установлены флаги Secure и HttpOnly.
  4. Генерация отчета: Сохранять результаты в HTML или PDF файл для заказчика.
  5. Проверка на уязвимости в реализациях: Например, известные проблемы в настройках CORS.
Блок-схема работы улучшенного сканера.
Блок-схема работы улучшенного сканера.

Заключение

Мы с вами создали работающий инструмент для пентеста и аудита безопасности. Хотя он простой, он выполняет очень важную задачу — проверяет фундаментальные аспекты безопасности веб-приложения. Такой сканер можно быстро адаптировать под конкретные нужды, интегрировать в CI/CD-процесс для проверки тестовых сред или использовать для обучения.

Помните: безопасность — это процесс, а не результат. Регулярный аудит, даже с помощью простых самописных утилит, значительно повышает вашу осведомленность и защищенность проектов. Экспериментируйте, улучшайте код и углубляйте свои знания.

Как вам материал по созданию сканера уязвимостей?

  • Да, все оказалось логично! Теперь я понимаю, как проверять базовые заголовки. ✅
  • Интересно, но нужно больше практики и углубления в тему. 🛠️
  • Материал сложный, без базовых знаний Python было трудно. ❌