
Python 3 PoC 스캐너 및 CVE-2026-92229 익스플로잇으로, Forminator WordPress 플러그인 버전 1.57.2 이하에서 발생하는 인증되지 않은 임의 숏코드 실행 취약점입니다.
Forminator(WPMU DEV)의 **CVE-2026-92229**에 대한 Python 3 PoC 스캐너/익스플로잇.
| 플러그인 | forminator |
| 영향받는 버전 | ≤ 1.57.2 |
| 수정된 버전 | 1.57.3+ |
| CVSS | 9.1 (치명적) |
| 인증 | 비인증 |
| 벡터 | POST 파라미터 current_url (퀴즈 AJAX) |
| CWE | CWE-94 (코드 인젝션) |
| 공로 | Kuba (Wordfence) |
취약한 버전에서는 사용자가 제공한 current_url이 퀴즈 결과 HTML(예: 소셜 공유 속성)에 반영되고, 응답 버퍼가 WordPress do_shortcode()로 처리됩니다. 비인증 공격자는 admin-ajax.php를 통해 악성 current_url에 임의 숏코드를 삽입하여 퀴즈를 제출할 수 있습니다.
주요 AJAX 액션:
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (미리보기; --preview)1.57.3에서 전체 HTML 버퍼 대신 의도된 텍스트 필드로만 숏코드 실행을 제한하여 수정되었습니다.
pip install -r requirements.txtpip install -r requirements.txt
# Detect plugin, version, public Forminator modules (quiz answers when parseable)
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (auto nonce + quiz answers when possible)
python poc.py -u https://target.example --mode exploit \
--page-url /quiz/ --form-id 42 \
--shortcode "PROBE"
# Preview submit (no stored entry, same code path)
python poc.py -u https://target.example --mode exploit --preview \
--page-url /quiz/ --form-id 42
# Manual quiz answers if HTML parsing fails
python poc.py -u https://target.example --mode exploit \
--form-id 42 --answers "2051:7608,2052:7610"
| 옵션 | 설명 |
|---|---|
-u, --url | 단일 대상 기본 URL |
--list | 한 줄에 URL 하나씩 있는 파일 |
--mode | check (기본값) 또는 exploit |
--page-url | 폼이 포함된 페이지 경로 또는 URL |
--form-id | Forminator 모듈 ID |
--form-type | quizzes, custom-forms, 또는 poll |
--answers | question_id:answer_id,... 형식의 퀴즈 답변 |
--shortcode | 숏코드 페이로드 (current_url 내부에서 [caption]…[/caption]으로 감싸짐) |
--preview | 미리보기 AJAX 액션 사용 |
--threads, -j | 대량 스캔 동시성 (기본값 20) |
--output | JSONL 결과 (기본값 cve_2026_92229_results.jsonl) |
--vuln-list | check 적중 항목용 텍스트 파일 (기본값 hits.txt) |
--candidates-list | 익스플로잇 가능한 check 항목용 JSONL 메타데이터 (기본값 candidates.jsonl) |
--quiet | 대량 실행 시 진행 상황 출력 최소화 |
| 파일 | 내용 |
|---|---|
cve_2026_92229_results.jsonl | 대상별 JSON (status, version, modules, …) |
hits.txt | exploitable_candidate: true인 기본 URL |
candidates.jsonl | 적중 세부 정보: form_id, page_url, form_type |
status 값| 상태 | 의미 |
|---|---|
candidate | 취약한 버전 + 파싱된 답변이 있는 퀴즈 |
form_no_quiz_answers | 폼은 발견되었으나 퀴즈 답변이 자동 파싱되지 않음 |
plugin_no_public_form | 플러그인은 존재하나 공개 모듈이 발견되지 않음 |
patched | 버전 ≥ 1.57.3 (또는 더 새로운 메이저) |
no_plugin | Forminator가 감지되지 않음 |
answers[qid]**를 파싱할 수 있을 때만 **exploitable_candidate**로 표시합니다 (많은 사이트가 JS로 렌더링된 퀴즈를 사용 → --answers 또는 수동 익스플로잇 사용).[caption]과 같은 무해한 숏코드로 탐침)..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
로컬 대량 스캔 목록(예: list.txt, FOFA 내보내기, *.jsonl 결과)은 .gitignore에 나열되어 있으며 커밋해서는 안 됩니다.
승인된 보안 테스트 전용입니다. 관련 법률 및 프로그램 규칙을 준수할 책임은 사용자에게 있습니다.