
Nicht authentifizierter beliebiger Datei-Upload -> RCE in WPLP Cookie Consent (gdpr-cookie-consent) <= 4.4.1 - technischer Bericht und PoC
Proof-of-Concept und technische Dokumentation für CVE-2026-75865, einen nicht authentifizierten, beliebigen Datei-Upload, der zu Remote Code Execution im WPLP Cookie Consent – Cookie Banner & Consent Management für GDPR, CCPA & Google Consent Mode-Plugin für WordPress (Slug gdpr-cookie-consent) führt und alle Versionen bis einschließlich 4.4.1 betrifft.
| Eckdaten |
|---|
| CVE | CVE-2026-75865 |
| Schweregrad | Kritisch — CVSS 3.1 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Schwachstellen | CWE-862 (Fehlende Autorisierung) + CWE-434 (Uneingeschränkter Upload von Dateien mit gefährlichem Typ) |
| Betroffene Versionen | gdpr-cookie-consent ≤ 4.4.1 |
| Behoben in | 4.4.2 |
| CVE-Zuweiser | Wordfence |
| Veröffentlicht | 2026-09-01 |
| Entdeckt von | Supakiad S. (m3ez) |
Die SaaS-„Connector“-REST-Endpunkte des Plugins authentifizieren Anfragen, indem sie an die SaaS-Anwendung des Anbieters delegieren, die ein Bearer-JWT validiert — aber das Plugin prüft nur, ob der Validierungs-Endpunkt mit HTTP 200 antwortet. Es gibt keine Eigentümerbindung zwischen dem JWT und der Ziel-Website, sodass jedes gültige, von der SaaS ausgestellte Token (z. B. von einem kostenlosen Konto) akzeptiert wird.
Die Funktion saas_upload_logo() schreibt anschließend einen vom Angreifer bereitgestellten Base64-BLOB in das öffentliche Verzeichnis wp-content/uploads/ unter einem vom Angreifer gewählten Dateinamen — ohne jegliche Inhalts- oder Erweiterungsprüfung. Das gespeicherte API-Token (master_key), das den Endpunkt ebenfalls schützt, ist nicht wirklich geheim: Die eigene /store-auth-Route des Plugins überschreibt es aus Request-Parametern nach derselben JWT-Prüfung, sodass die gesamte Kette — von der nicht authentifizierten Anfrage bis zur ausgeführten Payload im Web-Root — nur eine Ziel-URL und ein kostenloses SaaS-Konto erfordert.
Die Schwachstelle wurde in 4.4.2 behoben, indem der Upload-Endpunkt vollständig entfernt und das Vertrauensmodell des Connectors überarbeitet wurde (JWT-Eigentümerbindung, hash_equals(), HMAC-Request-Signierung).
Vollständige technische Analyse: REPORT.md
| Datei | Beschreibung |
|---|---|
REPORT.md | Detaillierte technische Dokumentation: Root-Cause-Analyse mit zeilenreferenziertem Code, der 4.4.1 → 4.4.2-Fix-Vergleich, Exploitation-Kette, Erkennung & Mitigation |
cve_2026_75865.py | PoC-Skript — scannt eine Zielliste, erkennt verwundbare Websites und führt die vollständige Kette aus (Admin-Enumeration → Master-Key-Überschreibung → Payload-Upload → Verifizierung) mit Live-Ausgabe |
payload.php | Minimale, harmlose Payload, die standardmäßig verwendet wird: gibt eine Markierungszeichenfolge aus und unterstützt die Selbstentfernung (?delete=1) |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama ist optional (farbige Logs)
# 1. Speichere ein gültiges SaaS-JWT (beliebiges Konto bei app.wplegalpages.com) in jwt.txt
# 2. Erstelle eine Zielliste und führe das Skript nur gegen Systeme aus, die du testen darfst:
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
Verifizierte Payload-URLs werden live an vuln.txt angehängt, eine pro Zeile, sobald jedes Ziel verifiziert ist.
| Option | Standard | Beschreibung |
|---|---|---|
-l, --list | (erforderlich) | Zielliste, eine URL pro Zeile |
-o, --output | vuln.txt | Verifizierte Payload-URLs, live angehängt |
-t, --threads | 40 | Parallele Worker |
--shell | payload.php | Payload-Datei neben dem Skript; hochgeladener Name = ihr Basisname |
--filename | — | Benutzerdefinierter hochgeladener Dateiname (seine Erweiterung wird zuerst versucht, dann --exts) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | Fallback-Erweiterungen, wenn die primäre blockiert ist |
--jwt-file | jwt.txt | SaaS-JWT, erste nicht-leere Zeile |
--marker | — | Zeichenfolge, die in der Payload-Antwort erscheinen muss, um als gültig zu gelten |
--timeout | 15 | Timeout pro Anfrage (Sekunden) |
-k, --insecure | aus | TLS-Verifizierung deaktivieren |
-v, --verbose | aus | Verbindungsfehlerdetails anzeigen |
Dieses Repository wird ausschließlich für Bildungs- und defensive Sicherheitsforschung veröffentlicht. Verwende das Tool ausschließlich gegen Systeme, die dir gehören oder für die du eine ausdrückliche schriftliche Testgenehmigung hast. Der Autor ist nicht verantwortlich für jeglichen Missbrauch oder Schaden, der durch dieses Material verursacht wird.