
Lehrreiche CVE-2024-12877 Exploit-Demo für PHP Object Injection im GiveWP WordPress-Plugin. Enthält Ursachenanalyse, Regex-Bypass-Techniken und sichere Exploitation-Praktiken.
Woche 66 | Autor: Ali Soltani (soltanali0)
Willkommen zur Woche 66 der GO-TO CVE-Reihe, in der wir Schwachstellen zerlegen, Grundursachen analysieren und praktische Exploitationstechniken in einem sicheren, lehrreichen Kontext demonstrieren.
CVE-2024-12877 ist eine PHP-Object-Injection-Schwachstelle in GiveWP, einem der am weitesten verbreiteten WordPress-Spenden-Plugins. Die unsichere Verwendung von unserialize() auf benutzergesteuerte Eingaben ermöglicht Angreifern, PHP-Magic-Methods (wie __wakeup()) auszulösen, was potenziell zu Folgendem führen kann:
CVSS: 9.8 Kritisch | Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
GiveWP betreibt tausende von Wohltätigkeits-Websites, NGOs und Fundraising-Plattformen. Da es sensible Finanz- und Spenderdaten verarbeitet, ist eine Schwachstelle hier sehr folgenreich. Ein Angreifer, der eine Object Injection ausnutzt, kann von einem einzelnen Plugin aus die gesamte WordPress-Installation und den zugrunde liegenden Server kompromittieren.
Grundursache: unserialize() auf nicht vertrauenswürdigen Eingaben.
PHP-Magic-Methods: PHP ruft diese automatisch während des Objektlebenszyklus auf:
Die Schwachstelle entsteht durch die unsichere Verwendung der PHP-Funktion unserialize() auf benutzergesteuerte Eingaben. Während unserialize() dazu entwickelt wurde, PHP-Datenstrukturen wiederherzustellen, hat es eine gefährliche Nebenwirkung: Wenn Objekte rekonstruiert werden, ruft PHP automatisch Magic-Methods auf.
__wakeup() – wird ausgelöst, wenn ein Objekt unserialisiert wird
__destruct(), __toString(), __get/__set(), __call/__callStatic() – können für böswillige Ausführung genutzt werden
Regex-Validierung: GiveWP implementierte Regex-Prüfungen, um serialisierte Eingaben zu erkennen. Während der neue Regex mehr Datentypen erfasst, kann Regex eine Object Injection nicht zuverlässig verhindern.
Mit einem manipulierten serialisierten Objekt setzt der Angreifer Objekteigenschaften, und PHP selbst führt die Logik des Angreifers aus, indem es die Magic-Methods aufruft.
GiveWP implementierte eine regex-basierte Validierung, um zu prüfen, ob eine Eingabe serialisiert war. Alter Regex (unvollständig)
• Erkannte nur Arrays und Objekte.
• Andere serialisierte Typen (string, int, bool, float, null) umgingen die Erkennung.
• Erkennt alle PHP-serialisierten Typen.
• Blockiert einige triviale Payloads.
• Aber das Kernproblem bleibt: Wenn unserialize() auf Benutzereingaben angewendet wird, kann Regex nicht retten.
Dieses Snippet wurde geschrieben, um zwei verschiedene Regex-Implementierungen zu vergleichen:
• is_serialized_old() → die alte Version, die nur Arrays und Objekte erkennt.
• is_serialized_new() → die verbesserte Version, die alle PHP-serialisierten Datentypen erkennt (Arrays, Objekte, Strings, Integers, Booleans, Floats und Null). Wir erstellen einen Satz von Testwerten (array, object, string, integer, boolean, float, null), serialisieren sie und prüfen dann jeden gegen beide Regex-Funktionen. Einfach ausgedrückt:
Und nachdem dieser Code auf Ihrem docker ausgeführt wurde, sehen Sie dieses Ergebnis im Browser
Schritt 1
Schritt 2: Erstellen einer angreifbaren Klasse
Diese Klasse hat eine __wakeup()-Methode, die automatisch ausgeführt wird, wenn sie unserialisiert wird.
Schritt 3: Payload erstellen
Schritt 4: Ausgabe Nach dem Speichern der Datei kann dieser Exploit in dieser Datei gesehen werden
Exploit :
• Alter Regex: FALSE → konnte den Payload nicht erkennen.
• Neuer Regex: TRUE → erkannte ihn als serialisierte Eingabe.
• Ausführung: Hello RCE! → Der Payload wurde unserialisiert, und die Magic-Method __wakeup() führte vom Angreifer kontrollierten Code aus.
Prävention • Verwenden Sie kein unserialize() auf nicht vertrauenswürdigen Eingaben. Ersetzen Sie es durch json_decode() oder andere sicherere Alternativen.
• Halten Sie GiveWP und alle WordPress-Plugins auf dem neuesten Stand.
• Setzen Sie eine Web Application Firewall (WAF) ein, um bösartige serialisierte Payloads zu blockieren.
• Befolgen Sie das Prinzip der geringsten Privilegien: Führen Sie PHP- und Datenbankkonten mit minimalen erforderlichen Berechtigungen aus.
Ergebnisse:
Wesentliche Erkenntnis: Verlassen Sie sich niemals auf Regex, um unserialize() zu sichern. Der sicherste Ansatz ist, unserialisieren nicht vertrauenswürdiger Eingaben vollständig zu vermeiden.
unserialize() auf nicht vertrauenswürdigen Eingaben; bevorzugen Sie json_decode() oder andere sichere Alternativen.Ich betreibe zwei Telegram-Kanäle, die sich der Schwachstellenforschung und -ausnutzung widmen:
GO-TO CVE Weekly Episoden: Jede Woche tauchen wir tief in eine neue CVE ein und teilen detaillierte Analysen, Demos und Erkenntnisse. 🔗 Hier beitreten
CVEdb – Exploit-Archiv: Dieser Kanal archiviert 1-Day-Exploits und benutzerdefinierte PoCs für CVEs. Eine großartige Ressource für Forscher, die aktive Exploitationstechniken sehen möchten. 🔗 CVEdb beitreten
Folgen Sie den Kanälen, um auf dem Laufenden zu bleiben mit den neuesten CVEs, Exploitationstechniken und Sicherheitsforschungserkenntnissen.
Dieses Repository dient ausschließlich Bildungs- und Forschungszwecken. Die Ausnutzung von Schwachstellen ohne Erlaubnis ist illegal und unethisch. Der Autor ist nicht verantwortlich für Missbrauch.