Введение
Магазин импортирует изображения товаров из подготовленного каталога. Браузер просит приложение получить изображение; приложение имеет сетевой доступ, которого нет у покупателя. Вы проследите реальный запрос и изучите безвредную внутреннюю запись состояния, чтобы понять подделку серверных запросов (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 содержит закодированные байты изображения; редактировать или декодировать его не нужно.

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

Перейдите на вкладку 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, чтобы сравнить настроенные подключения к сетям и текущую проверку состояния внутреннего потребителя.

Сравнение доступности для клиента и сервера
На этом шаге получите через 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, произвольные источники изображений Интернета или альтернативные кодировки адресов.
Резюме
Вы импортировали настоящее изображение, сравнили доступность для клиента и сервера и изучили реальный перенаправленный ответ. Внутренние данные были синтетическими; сетевые запросы — настоящими.



