hackatoll
Zur Lernplattform

Wissen › Insecure Deserialization / PHP Object Injection

Insecure Deserialization / PHP Object Injection

Nutzerdaten (z. B. aus einem Cookie) werden mit unserialize() verarbeitet – ein Angreifer kann damit beliebige interne Objekte erzeugen und deren Magic-Methoden auslösen.

Datenverarbeitung Schweregrad: Hoch

Serialisierung wandelt ein Objekt in eine speicherbare Zeichenkette um, Deserialisierung baut daraus wieder ein Objekt. Verarbeitet eine Anwendung dabei Daten, die der Angreifer kontrolliert – etwa einen Cookie – mit unserialize(), entscheidet der Angreifer, welche Klasse instanziiert wird und mit welchen Eigenschaften. PHP ruft beim Deserialisieren automatisch bestimmte Magic-Methoden auf (__wakeup(), __destruct()). Enthält eine im Projekt ladbare Klasse in einer solchen Methode eine gefährliche Aktion (Datei schreiben/lesen, Kommandos, DB-Zugriff), lässt sie sich so von außen auslösen – das nennt man PHP Object Injection.

Wie der Angriff funktioniert

Beispiel

Der Unterschied ist, WEM die zu deserialisierenden Daten gehören:

// verwundbar: Cookie-Wert direkt deserialisieren
$data = unserialize($_COOKIE['sel']); // Angreifer bestimmt die Objekt-Struktur

// ein 'Gadget' im Projekt, das beim Aufwachen etwas Gefaehrliches tut
class Report {
  public string $datei = '';
  public function __wakeup() { file_put_contents($this->datei, '...'); }
}

// sicher: kein unserialize auf Fremddaten – JSON nutzen
$data = json_decode($_COOKIE['sel'], true);
// oder, wenn unserialize unvermeidbar ist, Klassen verbieten:
$data = unserialize($roh, ['allowed_classes' => false]);

Mögliche Auswirkungen

◆ In TYPO3 beachten

Worauf du in TYPO3 achten musst

In TYPO3 steckt die Gefahr selten im Core-Standard, sondern in Extensions, die eigene Zustände in Cookies oder Feldern serialisieren und ungeprüft zurücklesen. Der Objekt-Graph des gesamten geladenen Projekts (Core, Extensions, Composer-Pakete) steht als Gadget-Fundus zur Verfügung.

unserialize() gehört nicht an Fremddaten

Cookies, Request-Parameter und Uploads sind angreiferkontrolliert. ceselector 4.0.1 z. B. liest einen Plugin-Cookie per unserialize() zurück (CVE-2026-46725) – das reicht für Object Injection, noch bevor irgendeine Prüfung greift.

JSON statt serialize

Für eigene Persistenz in Cookies/Feldern json_encode/json_decode verwenden. JSON transportiert nur Daten, keine Objekt-Typen – es gibt keine Magic-Methode zum Auslösen.

allowed_classes, wenn es sein muss

Ist unserialize() unvermeidbar, mit dem Options-Parameter ['allowed_classes' => false] (oder einer engen Liste) deserialisieren, damit gar keine beliebigen Objekte entstehen. Zusätzlich serialisierte Werte signieren (HMAC), damit Manipulation auffällt.

Schutzmaßnahmen

Interaktiv üben

In der Lernplattform kannst du diese Schwachstellenklasse an einer echten, isolierten TYPO3-Instanz nachvollziehen:

Weiterlesen

Jetzt interaktiv üben →