Определение настоящего источника запроса

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Магазин импортирует изображения товаров из подготовленного каталога. Браузер просит приложение получить изображение; приложение имеет сетевой доступ, которого нет у покупателя. Вы проследите реальный запрос и изучите безвредную внутреннюю запись состояния, чтобы понять подделку серверных запросов (SSRF).

Используйте только предоставленные учебные URL. Организации и внутренние данные синтетические. Достаточно базовых навыков терминала: HTTP, поля URL, сетевые роли и перенаправления объясняются здесь. Контейнеры имеют отдельные сетевые пространства имён и разделяют ядро одного экземпляра.

Импорт обычного изображения товара

На этом шаге импортируйте настоящее изображение и определите сервер, который его получил. Перейдите на вкладку Image Importer. Форма отправляет URL в App — сервер функции изображений. URL — адрес: http — протокол (схема), catalog.test — имя узла, 8000 — порт прослушивания, /leaf.png — путь ресурса.

Чтобы начать этот шаг, выберите вкладку Image Importer в интерфейсе лабораторной работы.

Оставьте Image URL равным http://catalog.test:8000/leaf.png, а Import slot — normal. Нажмите Import image. Страница Import result показывает настоящий статус HTTP и объект JSON — ответ из именованных полей. Найдите content_type: image/png и хеш, отпечаток полученных байтов. Поле body содержит закодированные байты изображения; редактировать или декодировать его не нужно.

Image Importer показывает фактический статус получения и поля ответа

Выберите Back to Image Importer на той же вкладке (или кнопку браузера «Назад»), затем обновите страницу. Под Imported responses должно появиться зелёное изображение. Если его нет, проверьте URL и написание слота, затем отправьте снова.

Image Importer показывает настоящее изображение, импортированное App

Перейдите на вкладку Workstation. Этот терминал — клиентский контейнер. Подготовленная программа imagectl.py отправляет запросы в App; python3 запускает её. show normal читает существующий импорт без повторного получения:

Перед выполнением следующей команды перейдите на вкладку Workstation.

python3 imagectl.py show normal

Найдите HTTP 200, session: learner-c08 и PNG image content. HTTP — протокол запросов и ответов; 200 означает успех. Теперь прочитайте настоящие записи запросов Catalog:

python3 imagectl.py requests

Каждая запись содержит адрес client и запрошенный path. Catalog увидел адрес App в сети каталога, а не Workstation или браузера. Исходящий запрос сделал App. Меняющийся адрес — свидетельство сервиса, а не фиксированное значение для запоминания. Перейдите на вкладку Topology, чтобы сравнить настроенные подключения к сетям и текущую проверку состояния внутреннего потребителя.

Topology показывает настроенные сетевые роли и наблюдаемое состояние потребителя

Сравнение доступности для клиента и сервера

На этом шаге получите через App только подготовленное внутреннее состояние запасов. Внутренняя служба доступна в сети, выделенной компонентам приложения. Workstation принадлежит фронтальной сети; App также принадлежит внутренней. localhost всегда означает среду выполнения команды: loopback Workstation не является loopback App.

Чтобы начать этот шаг, выберите вкладку Workstation в интерфейсе лабораторной работы.

Попробуйте прямой запрос из Workstation. Утилита выводит ожидаемые ошибки, не останавливая оболочку:

Перед выполнением следующей команды перейдите на вкладку Workstation.

python3 imagectl.py direct http://internal.test:8000/status

Ожидается UNREACHABLE from Workstation. Это имя недоступно в данном контейнере. Сети изолируют и сам адрес; дело не только в отсутствии имени. Теперь попросите App получить тот же ресурс. fetch выполняет импорт, последний аргумент задаёт слот сохранения ответа:

python3 imagectl.py fetch http://internal.test:8000/status internal

Ожидаются HTTP 200 и JSON с service: inventory, status: synthetic-ready и меняющимся training_id. Прочитайте импортированный ответ ещё раз:

python3 imagectl.py show internal

Запись принадлежит learner-c08. Это SSRF: контролируемый клиентом ввод заставляет сервер использовать собственный сетевой доступ. Workstation не получил нового подключения. При no import повторите запрос со слотом internal; нужен только синтетический объект текущей VM.

Переход по перенаправлению каталога

На этом шаге вы узнаете, почему проверки первого назначения может быть недостаточно. Перенаправление — HTTP-ответ, указывающий клиенту другой URL. Маршрут /redirect Catalog возвращает 302 с Location на ту же синтетическую службу запасов. Уязвимый App автоматически следует перенаправлению.

Чтобы начать этот шаг, выберите вкладку Workstation в интерфейсе лабораторной работы.

На вкладке Workstation импортируйте подготовленный маршрут в отдельный слот:

Перед выполнением следующей команды перейдите на вкладку Workstation.

python3 imagectl.py fetch http://catalog.test:8000/redirect redirect

Поле url указывает Catalog, но final_url — Internal. Тело содержит текущее синтетическое состояние запасов, а не изображение. Изучите сохранённый ответ и журнал Catalog:

python3 imagectl.py show redirect
python3 imagectl.py requests

Catalog записал /redirect; затем App использовал другую сеть для обращения к Internal. Доверие к начальному хосту не делает следующее назначение доверенным. Следующая лабораторная начинается независимо и исправляет два решения: выбор назначения и следование перенаправлениям. Это контролируемое упражнение не проверяет вредоносные изменения DNS, произвольные источники изображений Интернета или альтернативные кодировки адресов.

Резюме

Вы импортировали настоящее изображение, сравнили доступность для клиента и сервера и изучили реальный перенаправленный ответ. Внутренние данные были синтетическими; сетевые запросы — настоящими.