
Sicherer lokaler Proof of Concept für die PHP-Object-Injection-Schwachstelle in Cotonti CommentsWidget (CAN-2026-2035973 / CVE-2026-71294).
Sicherer lokaler Proof of Concept für die PHP-Object-Injection-Schwachstelle, die in der CommentsWidget-Implementierung von Cotonti identifiziert wurde.
plugins/comments/inc/CommentsWidget.phpDer verwundbare Codepfad akzeptiert den GET-Parameter ci und übergibt angreiferkontrollierte Daten durch base64_decode() an PHPs unserialize(), ohne einzuschränken, welche Klassen instanziiert werden dürfen.
Konzeptionell ist die verwundbare Operation:
$ci = @unserialize(base64_decode($ci));
Wenn ein serialisiertes Objekt übergeben wird, kann PHP die vom Angreifer kontrollierte Klasse instanziieren und Magic Methods wie aufrufen. In einer größeren Anwendung kann dies gefährlich werden, wenn geeignete Gadget-Klassen verfügbar sind.
__wakeup()Der eingereichte Fix ändert die Deserialisierung zu:
$ci = @unserialize(base64_decode($ci), ['allowed_classes' => false]);
und validiert, dass der resultierende Wert die erwartete Array-Struktur aufweist, bevor er verwendet wird.
poc.php führt drei lokale Tests durch:
unserialize() instanziiert DangerousGadget und löst dessen __wakeup()-Methode aus.allowed_classes => false verhindert, dass die Gadget-Klasse instanziiert wird, und verhindert somit den Seiteneffekt von __wakeup().Der PoC verwendet /tmp/pwned_by_cotonti_poc.txt nur als harmlosen Sentinel, der zeigt, dass __wakeup() ausgeführt wurde. Er führt nicht einen Betriebssystembefehl aus. Die Zeichenkette id && whoami existiert nur als Platzhalterwert in der command-Eigenschaft des Gadgets.
serialize() / unserialize()Eine Cotonti-Installation ist nicht erforderlich, da das verwundbare und das behobene Deserialisierungsverhalten direkt reproduziert werden.
Aus dem Repository-Verzeichnis:
php poc.php
Die erwartete Ausgabe ähnelt:
[!] DangerousGadget::__wakeup() triggered
[TEST 1] VULNERABLE: __wakeup() executed during unrestricted unserialize().
[TEST 2] FIXED: object instantiation was blocked; no sentinel was created.
[TEST 3] FIXED: invalid serialized structure rejected by validation.
Summary:
- Vulnerable path allows a serialized attacker-controlled object to be instantiated and invokes __wakeup().
- Fixed path uses allowed_classes=false, preventing the gadget class from being instantiated.
- Structural validation rejects values that do not match the expected array shape.
- No real command execution is performed by this PoC; the command property is only a placeholder.
Das Skript entfernt seine Sentinel-Datei vor dem Beenden.
Deserialisieren Sie keine angreiferkontrollierten Daten mit uneingeschränktem PHP unserialize().
Für diesen Codepfad ist die demonstrierte Gegenmaßnahme, die Klasseninstanziierung zu deaktivieren:
unserialize($data, ['allowed_classes' => false]);
Der deserialisierte Wert sollte außerdem gegen die exakte Struktur validiert werden, die von der Anwendung erwartet wird, bevor sein Inhalt verwendet wird.
Dieses Repository ist für Sicherheitsforschung, Verifikation und defensives Testen gedacht. Führen Sie den PoC nur in Umgebungen aus, die Ihnen gehören oder für die Sie ausdrücklich autorisiert sind, Tests durchzuführen. Verwenden Sie ihn nicht, um Systeme ohne Genehmigung anzugreifen.
Harsh Raj Singhania — Schwachstellenforschung, Proof of Concept und Offenlegung.