
Расширение Joomla PhocaCommander уязвимо к обходу пути (Path Traversal) в функции getSource — CVSS 8.2
PhocaCommander ≤ 6.1.3 — обход пути (Path Traversal) аутентифицированного администратора, CSRF не требуется
Уязвимость произвольного чтения файлов существует в конечной точке редактора файлов PhocaCommander. Функция getSource() декодирует параметр filename из base64 и передаёт его напрямую в file_get_contents() без проверки ограничения пути. Аутентифицированный администратор может прочитать любой файл, доступный процессу веб-сервера, — включая файлы за пределами корневой директории веб-сайта, — просто отправив GET-запрос. CSRF-токен не требуется.
Эксплуатация раскрывает учётные данные базы данных Joomla и секретный ключ из configuration.php, а также позволяет читать системные файлы, такие как /etc/passwd, с помощью последовательностей обхода пути (например, ../../../../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-токен не требуется — GET-запрос)
Файл: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() декодирует filename из base64 и напрямую конкатенирует его с JPATH_ROOT, после чего читает файл без проверки ограничения пути:
PHOCACOMMANDEREDIT.PHP — УЯЗВИМЫЙ КОД
public function getSource($fileName) {
$fileName = base64_decode($fileName); // ← attacker-controlled
$item = new stdClass;
if (PhocaCommanderHelper::fileExists(JPATH_ROOT . '/' . $fileName)) {
$item->source = file_get_contents(JPATH_ROOT . '/' . $fileName); // ← no containment check
}
return $item;
}
fileExists() использует is_file(Path::clean($file)). Path::clean() нормализует слеши, но не удаляет последовательности ../, поэтому обходы пути беспрепятственно покидают пределы корневой директории веб-сайта.
В кодовой базе имеется getContainedRealPath() в helpers/phocacommander.php, который выполняет корректную проверку ограничения пути на основе realpath(). Он вызывается из save() и download(), но никогда не был добавлен в getSource(). Кроме того, метод edit() контроллера вызывается через GET, поэтому стандартные проверки CSRF-токена не применяются — активной cookie сессии администратора достаточно для запуска произвольного чтения файлов.
Аутентифицируйтесь через страницу входа администратора, чтобы получить действительную cookie сессии. Никаких дополнительных привилегий помимо стандартной сессии администратора не требуется.
Отправьте следующий GET-запрос с base64-закодированным путём обхода:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename декодирован: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Разрешённый путь: /var/www/html/../../../../etc/passwd = /etc/passwd
Редактор выводит полное содержимое /etc/passwd, что подтверждает доступ на чтение за пределами корневой директории веб-сайта.
ЗАПРОС / ОТВЕТ
