Kraken
  • 🐙Привет!
    • 👋Добро пожаловать!
  • ✏️Крупицы знаний
    • 🌚Общие статьи
      • Как установить Kali Linux
      • Как поставить виртуальную Kali Linux
      • Что такое CVE
      • Обзор популярных алгоритмов хеширования
      • Модель OSI
      • Какие есть алгоритмы шифрования
      • Что такое TCP/IP
      • HSTS
      • Что такое хеширование и как его используют в ИБ
      • Скрипт для проверки данных SSL-сертификата
      • Шифруем файлы на Kali Linux с помощью OpenSSL
      • Как работает WPA2
      • О протоколе FTP
      • Что такое CVSS
      • Что такое политика одного источника (SOP)
      • О Cross-Origin Resource Sharing (CORS)
      • О Content Security Policy (CSP)
      • Что такое Bash
      • Веб-сокеты
      • MITRE ATT&CK
      • Начало в OSINT
      • Особенности и подходы к тестированию мобильных приложений
      • Что такое REST
      • Что такое API
      • Сравнение безопасности среды iOS и Android
      • CSS в ИБ
    • 🎪Карьера
      • Какие бывают роли у пентестеров и в чем их смысл
      • Какие есть виды пентеста
      • Что входит в пентест
      • Какие есть области знаний в веб-пентесте
      • Главные ошибки новичков в ИБ
    • 😰Уязвимости
      • Об атаке Pastejaking
      • Об уязвимости KRACK
      • Об уязвимости Regex DoS
      • Об атаке MITM
      • Что такое уязвимость нулевого дня
      • Атака на протокол STP
      • Защита протокола STP
      • Clickjacking
      • База при атаке на Wi-Fi
      • Атаки по сторонним каналам
      • DNS ребайндинг
    • ⚙️Инструменты
      • Лучшие сканеры открытых портов и инструменты проверки портов
      • Что такое OWASP ZAP и как он помогает защитить приложения?
      • О фреймворке WiFi Exploitation Framework (WEF)
      • WeBaCoo — поддерживаем доступ к взломанному веб-серверу
      • Socialscan — проверяем использование электронной почты и имен пользователей в соцсетях
      • Обзор инструментов Red Team
      • 11 инструментов для сканирования уязвимостей
      • Подборка инструментов для автоматизации атак на JWT
      • О Bulk_Extractor
      • О Unicornscan
      • О Maryam
      • О Picocrypt, утилите для шифрования данных
      • Анализируем трафик с ZUI (Zed User Interface)
      • Об инструменте SkipFish
      • Как получить уведомления на почту о входе по SSH
      • О сканере OpenSCAP
      • О Censys — инструменте для поиска уязвимых поддоменов
      • О Scanless — инструменте для анонимного сканирования открытых портов
      • О SearchSploit — инструменте для поиска эксплойтов
      • Выбираем менеджер паролей
      • О Maltego
      • Устанавливаем и используем Snyk CLI в Windows
      • Проверяем безопасность Docker-образов с помощью Trivy
      • Об инструменте SpiderFoot
      • Сканируем сети с помощью скриптов Bash
      • О фреймворке Volatility на Windows
      • Определяем тип WAF с помощью WafW00f
      • Об инструменте ReNgine
      • О Foremost — инструменте для восстановления данных
      • Chisel — инструмент для проброса портов
      • O Yersinia
      • Об Acunetix
      • O Netcat
      • O Samba
      • O John the Ripper
      • О Common User Passwords Profiler (CUPP)
      • О RainbowCrack
      • Shodan
      • MobSF
      • Netsparker
      • Fortify
      • Veracode
      • Rapid7 InsightVM
      • Aircrack-ng
  • 🛠️ИНСТРУМЕНТЫ
    • ⌨️Беспроводные атаки
      • Aircrack-Ng
    • 🔑Атаки на пароли
      • Crunch
      • John
      • CUPP
      • Hashcat
      • Hydra
    • 👁️Сбор Информации
      • Masscan
      • Dnsenum
      • Parsero
      • Nmap
  • 👨‍💻Пентест
    • Методология
    • 🖥️Аппаратный/Физический доступ
      • Физические атаки
      • Побег из КИОСКа
  • 👾MITRE
    • 🗺️Тактики
      • 🏢Предприятия
        • Разведка
      • 📱Мобильные устройства
      • 🏭ICS
    • 💀CTI
      • ☠️Группы
        • admin@338
        • Ajax Security Team
        • ALLANITE
        • Andariel
  • 📟Справочник по безопасной разработке
    • 👨‍🔬CLIENT SIDE
      • Cross-Site Scripting [XSS]
      • Cross-Site Request Forgery [CSRF]
      • Clickjacking
      • Open Redirects
    • 🖥️SERVER SIDE
      • SQL Injections [SQLi]
      • XML External Entity Injection [XXE]
      • OS Command Injection [Command Execution]
      • File Upload
      • Server-Side Request Forgery [SSRF]
      • Host Header Injection
      • Аутентификация
      • Directory Traversal
      • Template Injection [SSTI]
    • API
  • 🐝OWASP
    • Cross Site Scripting (XSS)
Powered by GitBook
On this page
  • 2. Типичный уязвимый код:
  • 3. Смягчения:
  • 3.1. Белый список разрешенных доменов:
  • 3.2. Защита абсолютных URL-адресов:
  • 4. Выводы:
  1. Справочник по безопасной разработке
  2. SERVER SIDE

Host Header Injection

Атаки на HTTP-заголовок Host используют уязвимые веб-сайты, которые обрабатывают значение заголовка Host небезопасным способом. Если сервер неявно доверяет заголовку Host и не проверяет или не экранирует его должным образом, злоумышленник может использовать этот ввод для внедрения вредоносной полезной нагрузки, которая манипулирует поведением сервера. Атаки, связанные с внедрением полезной нагрузки непосредственно в заголовок Host, часто называются атаками "внедрения заголовка Host".

Готовые веб-приложения обычно не знают, в каком домене они развернуты, если это не указано вручную в конфигурационном файле во время установки.

Поскольку заголовок Host фактически является контролируемым пользователем, такая практика может привести к ряду проблем. Если вводимые данные не приведены в надлежащий вид или не проверены, заголовок Host становится потенциальным вектором для использования целого ряда других уязвимостей, в частности:

  • Отравление веб-кэша.

  • Недостатки бизнес-логики в конкретной функциональности.

  • SSRF на основе маршрутизации.

  • Классические уязвимости на стороне сервера, такие как SQL-инъекции.

2. Типичный уязвимый код:

Сброс пароля - одна из самых распространенных целей для Header Injection; вот пример того, как выглядит уязвимый код:

public void resetPasswordLink(HttpServletRequest request) {

    // retrieves the host from the request header
    String host = request.getHeader("Host");
    
    String email = request.getParameter("email");
    HttpSession session = request.getSession();

    if (session != null) {
        String token = generateResetToken(email);
        
        // Password reset link is constructed with the retrieved host
        // for the token that has just been generated.
        StringBuilder resetLinkBuilder = new StringBuilder()
                .append(host)
                .append("?reset")
                .append(token);
        
        // Send the email
        sendEmail(email, resetLinkBuilder.toString());
    }
}

Обратите внимание, что в параметре Хост заголовка. Злоумышленник может воспользоваться этим и перехватить POST запрос, чтобы произвольно изменить Host из заголовка запроса. Таким образом, письмо, которое получит жертва, будет выглядеть безопасным, однако при переходе по ссылке, которая была сгенерирована (с атакующим Host ), злоумышленник получит токен сброса пароля, а значит, сможет полностью сбросить пароль жертвы.

3. Смягчения:

Чтобы предотвратить атаки на HTTP-заголовок Host, самый простой подход заключается в том, чтобы не использовать Host в коде на стороне сервера. Дважды проверьте, действительно ли каждый URL должен быть абсолютным. Часто оказывается, что вместо него можно использовать относительный URL. Это простое изменение поможет вам предотвратить уязвимости отравления веб-кэша, в частности.

3.1. Белый список разрешенных доменов:

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

public void resetPasswordLink(HttpServletRequest request) {

    // retrieves the host from the request header
    String host = request.getHeader("Host");
    
    String email = request.getParameter("email");
    HttpSession session = request.getSession();
    
    // create the whitelist for the allowed domains
    List <String> allowedDomains = Arrays.asList(
        "bobisecure.com",
        "bank.bobisecure.com",
        "s3.bobisecure.com"
    );
    
    // check whether the given `host` exists in the whitelist
    if (session != null && allowedDomains.contains(host)) {
        String token = generateResetToken(email);
        
        // Password reset link is constructed with the retrieved host
        // for the token that has just been generated.
        StringBuilder resetLinkBuilder = new StringBuilder()
                .append(host)
                .append("?reset")
                .append(token);
        
        // Send the email
        sendEmail(email, resetLinkBuilder.toString());
    }
}

3.2. Защита абсолютных URL-адресов:

Если вам приходится использовать абсолютные URL, то необходимо вручную указать текущий домен в конфигурационном файле и ссылаться на это значение вместо заголовка Host. В отличие от предыдущего пункта, конечная точка вашего приложения будет иметь дело только с единственным возможным URL. Такой подход устраняет угрозу, например, отравления при сбросе пароля.

Также важно убедиться, что вы не поддерживаете дополнительные заголовки, которые могут быть использованы для построения таких атак, в частности X-Forwarded-Host . Помните, что они могут поддерживаться по умолчанию.

4. Выводы:

Выполнение простых, но часто упускаемых из виду пунктов, которые мы здесь рассмотрели, защитит ваше приложение от любого типа инъекций в заголовок Host.

Помните, что в целом вы никогда не должны доверять заголовку Host, если это не является действительно необходимым!

Last updated 1 year ago

📟
🖥️