
CVE-2026-23491 - InvoicePlane의 Guest Controller에서 인증되지 않은 Path Traversal 취약점
| 필드 | 세부 정보 |
|---|---|
| CVE ID | CVE-2026-23491 |
| 심각도 | 치명적 |
| 보안 권고 | 보안 권고 보기 |
| 발견자 | Lukasz Rybak |
InvoicePlane v1.6.3의 Guest 모듈 Get 컨트롤러에 있는 get_file 메서드에 경로 탐색(path traversal) 취약점이 존재합니다. 이 취약점으로 인해 인증되지 않은 공격자가 입력 파일 이름을 조작하여 서버의 임의 파일을 읽을 수 있습니다. 이로 인해 데이터베이스 자격 증명이 포함된 구성 파일을 비롯한 민감한 정보가 노출될 수 있습니다.
이 취약점은 application/modules/guest/controllers/Get.php 파일의 get_file 함수에 있습니다.
이 함수는 URL에서 직접 $filename 매개변수를 받습니다. urldecode($filename)를 수행하지만 디렉터리 탐색 시퀀스(예: ../)에 대한 입력 검증을 수행하지 않습니다. 그런 다음 검증되지 않은 파일 이름은 기본 디렉터리($this->targetPath, uploads/customer_files/에 해당)와 연결되어 readfile() 함수에 전달됩니다.
취약한 코드 조각:
public function get_file($filename): void
{
$filename = urldecode($filename);
if ( ! file_exists($this->targetPath . $filename)) {
$ref = isset($_SERVER['HTTP_REFERER']) ? ', Referer:' . $_SERVER['HTTP_REFERER'] : '';
$this->respond_message(404, 'upload_error_file_not_found', $this->targetPath . $filename . $ref);
}
// ... headers setting content type and disposition ...
readfile($this->targetPath . $filename);
}
$filename은 사용자에 의해 제어되고 검증되지 않으므로, 공격자는 ../../ipconfig.php와 같은 문자열을 제공하여 의도된 디렉터리를 벗어날 수 있습니다.
다음 cURL 명령은 기본 uploads/customer_files/ 디렉터리에서 두 단계 위에 있는 ipconfig.php 파일을 읽는 방법을 보여줍니다:
curl http://localhost/index.php/guest/get/get_file/..%2f..%2fipconfig.php
예상 출력:
서버는 DB_PASSWORD 및 ENCRYPTION_KEY와 같은 민감한 환경 변수를 포함하는 ipconfig.php의 내용으로 응답합니다.
공격자는 애플리케이션 구성, 소스 코드 및 잠재적으로 웹 서버 사용자가 읽을 수 있는 시스템의 다른 파일을 읽을 수 있습니다.
이 CVE는 조율된 취약점 공개(coordinated vulnerability disclosure) 절차에 따라 책임감 있게 공개되었습니다. 여기에 제공된 정보는 교육 및 방어 목적으로만 제공됩니다.