
CVE-2026-32475 Elementor Pro Forms의 File Upload 필드는 검증과 파일 처리를 두 개의 별도 루프에서 수행하며, 빈 업로드 항목(UPLOAD_ERR_NO_FILE)을 서로 다르게 처리합니다. 인증되지 않은 공격자는 multipart
Elementor Pro Forms 파일 업로드 필드는 검증과 파일 처리를 두 개의 별도 루프에서 수행하며, 빈 업로드 항목 (UPLOAD_ERR_NO_FILE)을 서로 다른 방식으로 처리합니다. 인증되지 않은 공격자는 동일한 필드에 대해 첫 번째 파일 부분이 비어 있고 그다음에 PHP 페이로드가 오는 multipart 요청을 제출하여 validation()은 조기에 반환되게 하고 process_field()는 여전히 PHP 파일을 공개 디렉토리인 wp-content/uploads/elementor/forms/.php로 이동시킵니다.
대상 페이지에서 post_id, form_id, field_id를 자동으로 가져옵니다:
python poc.py -t http://localhost/wp --page-url "http://localhost/wp/?page_id=16" -c "whoami"
또는:
python poc.py -t http://localhost/wp --page-id 16 -c "whoami"
대화형 세션을 시작합니다:
python poc.py -t http://localhost/wp --page-id 16 -i
이 취약점의 핵심은 파일 업로드 메커니즘 자체를 우회하는 것입니다. 로컬 랩에서 테스트하든 실제 서버를 대상으로 테스트하든 이 부분은 다르지 않습니다. 업로드 필드에서 비어 있는 첫 번째 파일 부분 + PHP 페이로드는 확장자 검증을 우회하지만, 파일은 여전히 process_field()에 의해 처리됩니다. 우리는 파일이 성공적으로 기록되는 것을 입증했으며, 이는 설명된 내용과 정확히 일치합니다.
하드코딩된 Laragon 경로에 관하여:
이는 로컬 검증을 용이하게 하기 위한 것일 뿐입니다.
실제 대상에서는 디렉토리 패턴이 알려져 있고 고정되어 있습니다:
/wp-content/uploads/elementor/forms/
고정되어 있지 않은 것은 최종 파일명입니다.
Elementor는 원본 파일명을 유지하지 않습니다. process_field()에서 저장된 파일명은 다음과 같이 생성됩니다:
따라서 shell.php를 업로드하면 파일명이 다음과 같은 형식이 될 수 있습니다:
66f3a1c2e9b47.php
다음 경로 안에:
/wp-content/uploads/elementor/forms/
uniqid()는 시간 기반이며 강력한 난수 값이 아닙니다. 대략적으로 타임스탬프 + 마이크로초를 기반으로 합니다. 따라서 원격에서 파일을 복구하는 것은 업로드 문제라기보다 파일명 탐색 문제가 됩니다.
예를 들어 서버의 Date 헤더와 요청 타이밍을 기반으로 한 시간 창을 사용하거나, 업로드 시간 전후의 좁은 범위를 검색하거나, 폼이 [all-fields]를 포함한 이메일을 보내는 경우 정확한 URL을 복구할 수 있습니다.
저는 PoC를 인증되지 않은 파일 업로드라는 핵심 문제 자체를 명확하고 직접적으로 입증하는 데 초점을 맞췄습니다. uniqid() 값의 원격 복구를 완전히 설명하는 것은 취약점 자체를 검증하는 데 필요한 것보다 데모를 훨씬 더 길게 만들 뿐입니다.