
e107 CMS install.php의 안전하지 않은 역직렬화
보고일: 2025년 9월 18일
CVE 할당일: 2025년 10월 9일
게시일: 2026년 2월 2일
CVE ID: CVE-2025-61505
발견자: Anas Abderrahman Benbarek
e107 CMS 버전 2.3.3의 설치 스크립트(install.php)에서 PHP 객체 주입 취약점(CWE-502: 신뢰할 수 없는 데이터의 역직렬화)이 발견되었습니다.
이 취약점으로 인해 인증되지 않은 원격 공격자가 악의적인 직렬화 데이터를 조작하여 e107 코드베이스 또는 해당 종속성 내에서 악용 가능한 가젯 클래스의 존재 여부에 따라 임의 코드 실행, 데이터 조작 또는 기타 악성 행위를 초래할 수 있습니다.
이 문제는 사용자 제어 입력에 대해 제한 없이(예: allowed_classes 옵션) PHP의 unserialize() 함수를 안전하지 않게 사용한 데서 비롯됩니다. 설치 단계로 제한되지만, 설치 프로그램이 데이터베이스 생성 및 파일 쓰기와 같은 민감한 작업을 처리하므로 노출된 서버에서 설정 중에 심각한 위험을 초래합니다.
install.php)e107 CMS 설치 과정은 여러 단계로 구성됩니다. 사용자 입력(언어, 데이터베이스 자격 증명, 관리자 세부 정보 등)은 previous_steps POST 매개변수에 저장된 직렬화된 배열을 사용하여 단계 간에 유지됩니다. 이 데이터는 전송을 위해 base64로 인코딩되며 서버에서 디코딩/역직렬화됩니다.
핵심 문제는 검증, 살균 또는 클래스 허용 목록 없이 디코딩된 사용자 입력을 unserialize()에 직접 전달하는 것입니다. 이는 두 곳에서 발생합니다.
if(isset($_POST['previous_steps']))
{
$tmp = unserialize(base64_decode($_POST['previous_steps']));
$override = (isset($tmp['paths']) && isset($tmp['paths']['hash'])) ? array('site_path'=>$tmp['paths']['hash']) : array();
unset($tmp);
}
스크립트는 previous_steps가 이전 양식 단계의 신뢰할 수 있는 직렬화 데이터를 포함한다고 가정합니다. 그러나 이는 일반 POST 매개변수이므로 공격자가 완전히 제어할 수 있습니다. base64_decode()는 입력을 바이너리로 변환하고, unserialize()는 이를 PHP 객체 또는 배열로 재구성합니다. 입력에 객체 표기법(O:로 시작)이 포함된 경우 PHP는 현재 범위에 존재하거나 자동 로드되는 클래스를 인스턴스화합니다. 이는 즉시 __wakeup() 또는 기타 매직 메서드를 트리거하여 가젯 체인이 존재하는 경우 파일 쓰기 또는 예기치 않은 데이터베이스 호출과 같은 부작용을 일으킬 수 있습니다.
악용 가능성 참고: 성공은 사용 가능한 가젯 클래스에 따라 달라집니다. 이것이 없으면 영향은 충돌 또는 데이터 손상으로 제한될 수 있습니다.
{
$this->previous_steps = unserialize(base64_decode($_POST['previous_steps']));
// ... (filtering and password restoration logic)
unset($_POST['previous_steps']);
}
이 인스턴스는 역직렬화된 데이터가 객체 상태($this->previous_steps)의 일부가 되어 이후 설치 프로그램 작업(MySQL 설정, 관리자 생성, 설정 파일 생성)에 영향을 미치기 때문에 더 위험합니다. 여기서 객체 주입은 설치 과정 전반에 걸쳐 지속될 수 있으며 높은 권한의 작업에 영향을 줄 수 있습니다. 다시 한 번, allowed_classes 제한이 없으므로 자동 로드된 모든 클래스(코어, 핸들러, 플러그인, 라이브러리)가 인스턴스화될 수 있습니다.
악용 가능성 참고: 실제 악용은 일반적으로 코드 실행과 같은 위험한 동작에 도달하기 위해 여러 객체를 연결("가젯 체인")해야 합니다. 예를 들어, 한 클래스의 __wakeup()이 사용자 제어 문자열을 평가하는 다른 메서드를 호출할 수 있습니다. 이러한 체인이 없으면 영향은 서비스 거부(예: 소멸자에서 리소스 소진)에 머무를 수 있습니다. 설치 프로그램의 높은 권한 컨텍스트(e107_config.php 쓰기, 디렉토리 생성)는 위험을 증폭시키지만, 설치 후 스크립트를 제거하면 장기적인 노출이 줄어듭니다.
이 취약점은 설치 단계 중 인증되지 않은 HTTP POST 요청을 통해 /install.php에 도달할 수 있습니다.
unserialize($data, ['allowed_classes' => false]);