NOW Briefing
Elementor Pro 미인증 파일 업로드 취약점 (CVE-2026-32475)
■ 개요
Elementor는 WordPress 페이지를 시각적으로 제작하는 플러그인이고, Elementor Pro는 폼 위젯 등의 기능을 추가한 유료판입니다. BuiltWith 집계에는 국내 Elementor Pro 사용 사이트가 약 8,800개 포함돼 있습니다.
이번 취약점은 Forms 위젯에 파일 업로드 필드를 넣어 공개한 사이트에 영향을 줍니다. Patchstack은 파일 업로드 필드가 공개돼 있으면 기본 설정에서도 노출될 수 있다고 설명했지만, Elementor는 다중 파일 업로드 옵션이 켜진 경우로 범위를 좁혀 안내했습니다. 두 설명이 다르므로 우선 파일 업로드 필드가 들어간 모든 공개 폼을 점검 대상으로 잡는 것이 안전합니다.
취약점은 파일 확장자를 검사하는 단계와 파일을 저장하는 단계가 빈 업로드 항목을 서로 다르게 처리하면서 발생합니다. 이 차이를 이용하면 확장자 검사를 건너뛴 PHP 파일이 웹에서 접근 가능한 경로에 저장될 수 있습니다. 공격에 계정이나 관리자 권한은 필요하지 않으며, 저장된 파일이 실행되면 사이트와 서버가 침해될 수 있습니다.
연구자 Tin Pham(TF1T)이 2026년 7월 16일 Patchstack에 신고했고, Elementor는 8월 19일 4.2.2를 배포했습니다. 8월 20일 BleepingComputer 보도 시점까지 실제 악용 사례는 확인되지 않았습니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-32475 (Elementor Pro Forms 파일 업로드 필드의 확장자 검증 우회) |
| CVSS 점수 | CVSS v3.1 9.0 |
| 취약점 유형 | CWE-434, 미인증 임의 파일 업로드를 통한 원격 코드 실행 |
| 영향/위험 | • 공개 폼을 통한 PHP 파일 업로드 가능 • 업로드 파일이 웹에서 접근 가능한 경로에 저장돼 원격 코드 실행으로 이어질 수 있음 • 패치 후에도 기존에 업로드된 파일은 남음 |
| 노출 조건 | 파일 업로드 필드가 포함된 공개 폼(Patchstack 기준). Elementor는 다중 파일 업로드 옵션이 켜진 경우로 안내 |
| 취약 버전 | Elementor Pro 4.2.1 이하 |
| 패치 버전 | Elementor Pro 4.2.2 (2026-08-19 배포) |
■ 검증과 저장 단계의 처리 차이
파일 업로드는 modules/forms/fields/upload.php에서 처리합니다. validation()은 파일 확장자를 검사하고, process_field()은 파일을 업로드 디렉터리로 옮깁니다. 빈 업로드 항목을 만났을 때 앞쪽 함수는 return으로 검증을 끝내지만, 뒤쪽 함수는 continue로 그 항목만 건너뛰고 다음 파일을 처리합니다.
아래는 Patchstack 분석에 실린 코드입니다. return과 continue 옆의 설명 주석도 원문에 포함돼 있습니다.
// modules/forms/fields/upload.php - validation()
foreach ( $files[$id] as $index => $file ) {
// not uploaded
if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
return; // <-- leaves the whole method; every later entry goes unchecked
}
// ...
if ( ! $this->is_file_type_valid( $field, $file ) ) {
$ajax_handler->add_error( $id, esc_html__( 'This file type is not allowed.', 'elementor-pro' ) );
}
}
// modules/forms/fields/upload.php - process_field()
foreach ( $files[$id] as $index => $file ) {
if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
continue; // <-- skips only this entry; the loop carries on
}
// ... the file is moved into the public uploads directory
}
같은 필드의 첫 항목을 비워 두면 validation()은 이후 파일을 검사하지 않습니다. 반면 process_field()은 빈 항목 다음에 있는 파일까지 처리하므로, 확장자 차단 목록을 거치지 않은 PHP 파일이 저장될 수 있습니다. 저장 경로는 wp-content/uploads/elementor/forms/이며 파일명은 uniqid() 값과 원래 확장자를 조합해 만듭니다.
Patchstack은 4.2.2에서 빈 항목 처리 방식을 맞추고, 파일을 옮기기 직전에도 확장자를 다시 검사하도록 수정됐다고 설명합니다. Elementor Pro는 유료 배포판이라 공개 패치 diff는 확인되지 않았습니다. CVSS v3.1 9.0은 CNA인 Patchstack의 산정값이며 NVD 자체 평가는 없습니다.
■ 탐지 및 점검
• wp-content/uploads/elementor/forms/에서 .php, .php5, .phtml, .shtml 등 실행 가능한 파일을 찾습니다.
• 웹 서버와 PHP-FPM 로그에서 해당 경로의 PHP 파일이 요청됐는지 확인합니다. 파일 생성과 정상 응답 기록이 함께 남았다면 실행 가능성을 우선 조사합니다.
• 파일 업로드 필드가 포함된 공개 폼을 목록화하고, 다중 파일 업로드 및 필수 입력 설정을 함께 확인합니다.
• 관리자 화면이나 wp plugin list 명령으로 Elementor Pro의 실제 설치 버전을 확인합니다.
• 최근 생성된 파일의 시각을 폼 제출 기록과 대조해 정상 제출과 연결되지 않는 파일을 찾습니다.
✅ CHECK
파일명만으로 정상 업로드와 공격을 구분할 수 없습니다. 실행 가능한 확장자, 생성 시각, 해당 파일의 접근 기록을 함께 확인해야 합니다.
■ 대응 방안
• Elementor Pro를 4.2.2 이상으로 업데이트합니다.
• 업데이트 후에도 업로드 디렉터리를 조사합니다. 악성 파일이 발견되면 제거에 그치지 말고 다른 경로의 웹셸, 추가 관리자 계정, 예약 작업도 함께 확인합니다.
• 즉시 업데이트하기 어렵다면 파일 업로드 필드가 포함된 폼을 비공개로 전환하거나 해당 필드를 제거합니다.
• 웹 서버에서 wp-content/uploads/ 하위의 PHP 실행을 차단합니다.
• 파일 실행 흔적이 확인되면 관리자 비밀번호와 WordPress 보안 키·솔트를 교체하고 침해 범위를 조사합니다.
[참고 자료]
• Patchstack - Elementor Pro 미인증 파일 업로드 RCE 기술 분석



