
A extensão Joomla PhocaCommander é vulnerável a Path Traversal nas ações de excluir, copiar e mover - CVSS 6.4
PhocaCommander ≤ 6.1.3 — Administrador Autenticado Manipula Arquivos Fora da Raiz da Web
O manipulador de ações de arquivo no PhocaCommander constrói caminhos de origem e destino a partir de parâmetros codificados em base64 controlados pelo atacante (pathfrom, pathwhere) sem qualquer validação de contenção de caminho. Um administrador autenticado pode excluir, copiar e mover arquivos em qualquer lugar do sistema de arquivos acessível ao processo do servidor web.
Confirmado em laboratório: excluir um arquivo em /tmp/ (fora da raiz da web) e copiar /etc/passwd para o gerenciador de arquivos do PhocaCommander — tornando seu conteúdo legível através do editor integrado. Todas as três operações (excluir, copiar, mover) compartilham o mesmo caminho de código não validado.
| COMPONENTE | VULNERÁVEL | TESTADO EM | CORRIGIDO |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Autenticação necessária: Administrador (sessão + token CSRF)
Arquivo: administrator/components/com_phocacommander/views/phocacommanderactiona/view.json.php
A view de ação decodifica pathfrom e pathwhere de base64 e os concatena diretamente em JPATH_ROOT sem verificação de contenção. Esses caminhos não validados são então usados em todas as três operações de arquivo:
VIEW.JSON.PHP — CONSTRUÇÃO DE CAMINHO VULNERÁVEL
// 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() usa is_file(Path::clean($file)). Path::clean() normaliza barras, mas não remove sequências ../, portanto sequências de travessia em qualquer um dos parâmetros resolvem para caminhos arbitrários do sistema de arquivos sem verificação.
Um arquivo de teste é criado em /tmp/poc.txt de propriedade de www-data, confirmando que o alvo existe antes da operação de exclusão.

Autentique-se pela página de login do administrador. Obtenha o token de formulário do Joomla — ele aparece como um campo de entrada oculto em qualquer página administrativa.

Parâmetros decodificados:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → nome do arquivo poc.txtSOLICITAÇÃO / RESPOSTA


Reutilize a sessão de administrador do Cenário 1 ou autentique-se novamente para obter um token CSRF novo.
Parâmetros decodificados:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → nome do arquivo passwdSOLICITAÇÃO / RESPOSTA

/etc/passwd agora está presente dentro da raiz da web em phoca-files/passwd, de propriedade de www-data.

Navegue até o gerenciador de arquivos do PhocaCommander no painel de administração, abra phoca-files/, clique no arquivo passwd e depois clique em Editar para visualizar seu conteúdo no editor CodeMirror integrado. O conteúdo completo de /etc/passwd é exibido:

www-data fora da raiz da web pode ser removido permanentemente, incluindo configurações de aplicativos, arquivos de bloqueio e jobs do cron de outros serviços/etc/shadow, chaves privadas, arquivos .env de outros aplicativos) para a raiz da web os torna acessíveis via HTTP sem qualquer ação adicional