
Расширение Joomla PhocaCommander уязвимо к обходу пути (Path Traversal) в действии загрузки файлов — CVSS 6.1
PhocaCommander ≤ 6.1.3 — аутентифицированный администратор может записывать файлы за пределами корневой директории веб-сервера
Обработчик загрузки файлов в PhocaCommander формирует путь назначения из управляемого атакующим параметра folder в кодировке base64 без какой-либо проверки ограничения пути. Аутентифицированный администратор может загружать файлы в произвольные места за пределами корневой директории веб-сервера, доступные для записи процессу веб-сервера.
Подтверждено в лаборатории: загрузка с folder=Li4vLi4vLi4vdG1w (= ../../../tmp) размещает загруженный файл в — за пределами — с владельцем . В производственных средах PHP-FPM это можно использовать в связке для достижения удалённого выполнения кода.
/tmp//var/www/html/www-data| КОМПОНЕНТ | УЯЗВИМЫЕ ВЕРСИИ | ПРОТЕСТИРОВАНО НА | ИСПРАВЛЕНО |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Требуется аутентификация: администратор (сессия + CSRF-токен)
Файл: administrator/components/com_phocacommander/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload() декодирует POST-параметр folder из base64 и передаёт его напрямую в конкатенацию с Path::clean(), которая затем используется как место назначения загрузки без какой-либо проверки ограничения пути.
FILEUPLOAD.PHP — УЯЗВИМЫЙ КОД
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
Path::clean() нормализует разделители каталогов, но не разрешает и не удаляет последовательности ../. Полученный путь передаётся напрямую в File::upload() без последующей проверки границ.
Список разрешённых расширений для загрузки
Обработчик применяет список разрешённых расширений (изображения, документы, архивы, текстовые файлы) и блокирует исполняемые сервером типы, такие как .php и .htaccess. Однако многие типы файлов, допустимые этим списком, — включая shell-скрипты, определения cron-задач и фрагменты конфигурации, — могут нанести значительный вред при записи в критичные системные пути.
Выполните аутентификацию через страницу входа администратора. Получите CSRF-токен Joomla с любой страницы администрирования — он отображается как скрытое поле формы или может быть извлечён из исходного кода страницы.

Отправьте multipart POST-запрос на POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload с содержимым файла в поле file и закодированным в base64 путём обхода Li4vLi4vLi4vdG1w (= ../../../tmp) в поле folder. Сервер отвечает кодом HTTP 200 и {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}.
ЗАПРОС / ОТВЕТ

Файл подтверждён в /tmp/upload_test.txt, владелец www-data, за пределами /var/www/html/.

www-data, может получить содержимое, выбранное атакующим, включая пути, используемые планировщиком ОС, демоном SSH и другими сервисами.txt-файла, содержащего PHP-код, вместе с файлом .user.ini (auto_prepend_file) в каталог, доступный через веб, приводит к выполнению PHP при следующем запросе к этому каталогу