
Расширение Joomla PhocaCommander уязвимо к обходу пути (Path Traversal) в действиях удаления, копирования и перемещения — CVSS 6.4
PhocaCommander ≤ 6.1.3 — аутентифицированный администратор манипулирует файлами за пределами веб-корня
Обработчик файловых действий в PhocaCommander формирует исходные и целевые пути из контролируемых атакующим параметров, закодированных в base64 (pathfrom, pathwhere), без какой-либо проверки ограничения пути. Аутентифицированный администратор может удалять, копировать и перемещать файлы в любом месте файловой системы, доступном процессу веб-сервера.
Подтверждено в лаборатории: удаление файла в /tmp/ (за пределами веб-корня) и копирование в файловый менеджер PhocaCommander — с возможностью чтения его содержимого через встроенный редактор. Все три операции (удаление, копирование, перемещение) используют один и тот же непроверяемый участок кода.
/etc/passwd| КОМПОНЕНТ | УЯЗВИМЫЕ ВЕРСИИ | ПРОТЕСТИРОВАНО НА | ИСПРАВЛЕНО |
|---|---|---|---|
| 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/views/phocacommanderactiona/view.json.php
Представление действия декодирует pathfrom и pathwhere из base64 и напрямую конкатенирует их с JPATH_ROOT без проверки ограничения пути. Эти непроверенные пути затем используются во всех трёх файловых операциях:
VIEW.JSON.PHP — УЯЗВИМОЕ ФОРМИРОВАНИЕ ПУТИ
// Both parameters decoded from base64 — no containment check
$pathFrom = JPATH_ROOT . '/' . base64_decode($this->t['pathfrom']) . '/';
$pathWhere = JPATH_ROOT . '/' . base64_decode($this->t['pathwhere']) . '/';
// Delete — removes any file reachable by www-data
$srcValue = $pathFrom . $v;
if (PhocaCommanderHelper::fileExists($srcValue)) {
File::delete($srcValue);
}
// Copy / Move — arbitrary cross-directory file operations
File::copy($pathFrom . $v, $pathWhere . $v);
File::move($pathFrom . $v, $pathWhere . $v);
PhocaCommanderHelper::fileExists() использует is_file(Path::clean($file)). Path::clean() нормализует слэши, но не удаляет последовательности ../, поэтому последовательности обхода в любом из параметров без проверки разрешаются в произвольные пути файловой системы.
Тестовый файл создаётся в /tmp/poc.txt с владельцем www-data, что подтверждает наличие цели до операции удаления.

Выполните аутентификацию через страницу входа администратора. Получите токен формы Joomla — он отображается как скрытое поле ввода на любой странице администратора.

Декодированные параметры:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → имя файла poc.txtЗАПРОС / ОТВЕТ


Используйте повторно сессию администратора из сценария 1 или выполните аутентификацию заново, чтобы получить новый CSRF-токен.
Декодированные параметры:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → имя файла passwdЗАПРОС / ОТВЕТ

/etc/passwd теперь находится внутри веб-корня по пути phoca-files/passwd, владелец — www-data.

Перейдите в файловый менеджер PhocaCommander в панели администратора, откройте phoca-files/, кликните по файлу passwd, затем нажмите Edit, чтобы просмотреть его содержимое во встроенном редакторе CodeMirror. Отображается полное содержимое /etc/passwd:

www-data за пределами веб-корня, может быть безвозвратно удалён, включая конфигурации приложений, файлы блокировок и cron-задания других сервисов/etc/shadow, приватные ключи, .env-файлы других приложений) в веб-корень делает их доступными по HTTP без каких-либо дополнительных действий