Reflective XSS via incomplete return URL sanitization
Beschreibung
### Zusammenfassung Der Fix für CVE-2025-35939 in `craftcms/cms` führte einen `strip tags()`-Aufruf in `src/web/User.php` ein, um die Rückgabe-URLs zu löschen, bevor sie in der Sitzung gespeichert werden. "strip tags()" entfernt jedoch nur HTML-Tags (Winkelklammern) - es überprüft oder filtert keine URL-Schemata. Payloads wie `javascript:alert(document.cookie)` enthalten keine HTML-Tags und durchlaufen `strip tags()` völlig unverändert, wodurch XSS reflektiert wird, wenn die URL in einem `href`-Attribut gerendert wird. ### Details Der gepatchte Code in ist: ```php public function setReturnUrl($url): void { parent::setReturnUrl(strip tags($url)); } ``` `strip tags()` entfernt HTML-Tags (z.B. ``, ``) aus einer Zeichenfolge, aber es ist **nicht** ein URL-Entschlüsseler. Wenn die entsorgte Rückgabe-URL anschließend in einem `href`-Attribut-Kontext (z. B. ``) dargestellt wird, überleben die folgenden gefährlichen Nutzlasten `strip tags()` völlig unverändert: 1. **`javascript:` Protokoll-URLs** -- `javascript:alert(document.cookie)` enthält keine HTML-Tags, so `strip tags()` gibt sie verbatim zurück. Wenn es in einem "href" platziert wird, führt ein Klick auf den Link das JavaScript aus. 2. **`data:` URIs ** -- `data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==` verwendet Base64-Codierung und enthält überhaupt keine Tags, um `strip tags()` vollständig zu umgehen. 3. **Protokoll-relative URLs** -- `//evil.com/steal` enthält keine Tags und wird unverändert durchlaufen. Wenn es als "href" dargestellt wird, löst der Browser es relativ zum Protokoll der aktuellen Seite auf und leitet den Benutzer zu einer von einem Angreifer kontrollierten Domain um. Das Kernproblem ist, dass `strip tags()` mit HTML-Syntax (Winkelklammern) arbeitet, während das Bedrohungsmodell hier eine URL-Schemavalidierung erfordert. Dies sind grundlegend unterschiedliche Sicherheitsbedenken. ### Impact **Reflected XSS über gestaltete Return URL.** Ein Angreifer konstruiert einen bösartigen Link wie „https://target.example.com/craft/?returnUrl=javascript:alert(document.cookie) und sendet ihn an ein Opfer. Der Angriffsfluss ist: 1. Das Opfer klickt auf den Link und besucht die Craft CMS-Site. 2. Die Anwendung ruft `setReturnUrl()` mit dem vom Angreifer kontrollierten Wert auf. 3. `strip tags()` verarbeitet die URL, findet aber keine HTML-Tags - es geht unverändert durch. 4. Die URL wird in der Sitzung gespeichert und später in einem `href`-Attribut dargestellt (z. B. ein Link "Return" oder "Continue"). 5. Wenn das Opfer auf diesen Link klickt, wird `javascript:alert(document.cookie)` im Kontext des Craft CMS-Ursprungs ausgeführt. Dies ermöglicht: - **Session-Hijacking** über Cookie-Diebstahl (`document.cookie`) - **Datenexfiltration** über `fetch()` an einen von Angreifern kontrollierten Server - **Phishing** durch Umleitung zu einer ähnlichen Domain (Protokoll-relative URL) - **CSRF** durch Durchführung von Aktionen im Namen des authentifizierten Benutzers ### Referenzen - https://github.com/craftcms/cms/commit/cc9921c1482a431c2356af8a04ce4cfe
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Auf eine behobene Version aktualisieren: 4.17.3, 5.9.7.
Empfohlene Schritte
- Betroffene Systeme identifizieren: Pixel & Tonic Craft CMS.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Update/Rollout auf behobene Version vorbereiten und priorisiert einspielen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.