
Joomla 확장 프로그램 PhocaCommander는 파일 업로드 작업에서 경로 탐색(Path Traversal) 취약점에 노출되어 있습니다 - CVSS 6.1
PhocaCommander ≤ 6.1.3 — 인증된 관리자가 웹 루트 외부에 파일을 쓸 수 있음
PhocaCommander의 파일 업로드 핸들러는 경로 포함 검증 없이 공격자가 제어하는 base64로 인코딩된 folder 매개변수에서 대상 경로를 구성합니다. 인증된 관리자는 웹 서버 프로세스가 쓸 수 있는 웹 루트 외부의 임의 위치에 파일을 업로드할 수 있습니다.
실험실에서 확인된 내용: folder=Li4vLi4vLi4vdG1w (= ../../../tmp)로 업로드하면 업로드된 파일이 /var/www/html/ 외부인 /tmp/에 소유로 생성됩니다. 운영 환경의 PHP-FPM 환경에서는 이를 연계하여 원격 코드 실행을 달성할 수 있습니다.
www-data| COMPONENT | VULNERABLE | TESTED ON | FIXED |
|---|---|---|---|
| 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/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload()는 POST folder 매개변수를 base64에서 디코딩하고 이를 Path::clean() 연결에 직접 전달하며, 이 값은 포함 검사 없이 업로드 대상 경로로 사용됩니다.
FILEUPLOAD.PHP — 취약한 코드
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
Path::clean()은 디렉터리 구분 기호를 정규화하지만 ../ 시퀀스를 해석하거나 제거하지 않습니다. 해석된 경로는 후속 경계 검사 없이 File::upload()에 직접 전달됩니다.
업로드 확장자 허용 목록
핸들러는 확장자 허용 목록(이미지, 문서, 압축 파일, 텍스트 파일)을 적용하고 .php 및 .htaccess 같은 서버 실행 가능 유형을 차단합니다. 그러나 허용 목록에서 허용되는 많은 파일 유형(셸 스크립트, cron 작업 정의, 구성 조각 등)은 중요한 OS 경로에 기록될 경우 심각한 피해를 초래할 수 있습니다.
관리자 로그인 페이지를 통해 인증합니다. 임의의 관리자 페이지에서 Joomla CSRF 토큰을 가져옵니다. 토큰은 숨겨진 양식 필드로 나타나거나 페이지 소스에서 추출할 수 있습니다.

file 필드에 파일 콘텐츠를, folder 필드에 base64로 인코딩된 경로 순회 값 Li4vLi4vLi4vdG1w (= ../../../tmp)를 담아 POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload로 multipart POST 요청을 보냅니다. 서버는 HTTP 200 및 {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}로 응답합니다.
요청 / 응답

파일이 /var/www/html/ 외부인 /tmp/upload_test.txt에 www-data 소유로 생성된 것이 확인됩니다.

www-data가 쓸 수 있는 모든 경로는 OS 스케줄러, SSH 데몬 및 기타 서비스에서 사용하는 경로를 포함하여 공격자가 선택한 콘텐츠를 받을 수 있습니다.txt 파일과 .user.ini(auto_prepend_file)를 웹에서 접근 가능한 디렉터리에 업로드하면 해당 디렉터리에 대한 다음 요청에서 PHP 실행이 발생합니다