
Proof-of-concept, демонстрирующий аутентифицированный blind SSRF в SiteContentDetector платформы Matomo, позволяющий проводить разведку внутренней сети и отправлять запросы к внутренним сервисам через специально сформированные URL-адреса сайтов.
Имя: CYBER-SEC
Контакт: [email protected]
Matomo позволяет аутентифицированному администратору сайта настроить main_url сайта с внутренним адресом. Любой аутентифицированный пользователь с правом просмотра может впоследствии вызвать getTrackingMethodsForSite, что приведёт к выполнению сервером слепого HTTP-запроса к настроенному URL.
Назначение проверяется только с помощью защит на основе имени хоста и не отклоняет должным образом loopback-, RFC1918- или link-local-адреса после разрешения. В результате приложение может быть использовано для выполнения слепых серверных запросов к внутренним сервисам.
Продукт: Matomo
Затронутая версия: 5.11.2 (подтверждено)
Компонент: SiteContentDetector / SitesManager
Вектор: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N
Базовый балл: 5.8 (средний)
enable_internet_features.main_url сайта.Проблема связана со следующим потоком:
Источник:
SitesManager.updateSite сохраняет main_url после базовой проверки URL.
Триггер:
GET /index.php?module=SitesManager&action=getTrackingMethodsForSite&idSite=<id>
Приёмник:
SiteContentDetector::requestSiteResponse()
-> Http::sendHttpRequestBy()
Реализация не отклоняет должным образом внутренние адреса назначения, такие как:
127.0.0.0/8
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
169.254.0.0/16
::1
fc00::/7
fe80::/10
Цели перенаправления также должны повторно проверяться, поскольку фильтрацию на основе имени хоста можно обойти, если изначально разрешённое имя хоста перенаправляет на внутренний адрес.
Используйте слушатель, которым вы управляете, в авторизованной лабораторной среде:
python3 -m http.server 8088
Будучи аутентифицированным администратором сайта, настройте main_url сайта так, чтобы он указывал на контролируемый внутренний слушатель:
http://<контролируемый-внутренний-слушатель>:8088/ssrf-test
Не проводите тесты против сторонних систем или конечных точек метаданных облака, если вы не владеете этой средой и не авторизованы для её тестирования.
Будучи аутентифицированным пользователем с правом просмотра, инициируйте:
GET /index.php?module=SitesManager&action=getTrackingMethodsForSite&idSite=1
Контролируемый слушатель получает серверный HTTP-запрос от сервера Matomo.
Пример вывода слушателя:
GET /ssrf-test HTTP/1.1
Host: <контролируемый-внутренний-слушатель>:8088
User-Agent: Matomo
Matomo выполняет серверный GET-запрос к настроенному main_url при инициировании getTrackingMethodsForSite.
Это было подтверждено с использованием внутреннего loopback/внутреннего HTTP-слушателя, который не был доступен извне, что подтверждает поведение слепого SSRF.
Аутентифицированный атакующий может злоупотребить этим поведением для:
Поскольку SSRF является слепым, атакующий не получает напрямую тело HTTP-ответа через Matomo. Однако одной лишь доставки запроса может быть достаточно для создания угрозы безопасности во внутренних сетях и облачных средах.
Рекомендуемые исправления:
Разрешайте имя хоста в IP-адреса перед выполнением запроса.
Отклоняйте частные, loopback-, link-local-, multicast- и иные небезопасные диапазоны IP после разрешения DNS.
Повторно проверяйте каждую цель перенаправления перед переходом по редиректам.
Предпочитайте строгий список разрешённых исходящих доменов вместо блок-списков имён хостов.
Применяйте защиты SSRF последовательно в конечном приёмнике HTTP-запроса, а не только при настройке URL сайта.
Рассмотрите возможность ограничения getTrackingMethodsForSite или триггера SiteContentDetector пользователями с более высокими привилегиями.
Добавьте журналирование аудита для исходящих серверных запросов, инициируемых конфигурацией сайта.
Проверено на официальном Docker-образе Matomo 5.11.2 без изменения исходного кода.
Эта проблема была сообщена CYBER-SEC.