
Joomla 확장 프로그램 PhocaCommander는 삭제, 복사, 이동 작업에서 경로 탐색(Path Traversal) 취약점에 노출되어 있습니다 - CVSS 6.4
PhocaCommander ≤ 6.1.3 — 인증된 관리자가 웹 루트 외부 파일을 조작할 수 있음
PhocaCommander의 파일 작업 핸들러는 공격자가 제어하는 base64 인코딩 매개변수(pathfrom, pathwhere)를 사용하여 소스 및 대상 경로를 구성하지만, 경로 포함 검증을 전혀 수행하지 않습니다. 인증된 관리자는 웹 서버 프로세스가 접근할 수 있는 파일 시스템 어디에서나 파일을 삭제, 복사, 이동할 수 있습니다.
실험실에서 확인된 내용: 웹 루트 외부의 /tmp/에 있는 파일을 삭제하고, /etc/passwd를 PhocaCommander 파일 관리자로 복사하여 내장 편집기로 내용을 읽을 수 있었습니다. 세 가지 작업(삭제, 복사, 이동) 모두 동일한 검증되지 않은 코드 경로를 사용합니다.
| 구성 요소 | 취약한 버전 | 테스트 환경 | 수정된 버전 |
|---|---|---|---|
| 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를 통해 접근할 수 있게 됩니다.