
CVE-2025-67875 - ChurchCRM weist gespeichertes XSS über die Zuweisung von Personen-Eigenschaften auf, das zur Übernahme einer Admin-Sitzung führt.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2025-67875 |
| Schweregrad | HOCH |
| Advisory | Advisory ansehen |
| Entdeckt von | Lukasz Rybak |
Eine kritische Privilegienausweitung-Schwachstelle existiert in ChurchCRM Version 6.3.0 und früher. Ein authentifizierter Benutzer mit bestimmten mittleren Berechtigungen („Edit Records“ und „Manage Properties and Classifications“) kann eine persistente Cross-Site-Scripting-(XSS)-Nutzlast in das Profil eines Administrators injizieren. Die Nutzlast wird ausgeführt, wenn der Administrator seine eigene Profilseite aufruft, wodurch der Angreifer die Sitzung des Administrators übernehmen, administrative Aktionen ausführen und eine vollständige Kontenübernahme erreichen kann.
Diese Schwachstelle ist eine Kombination aus zwei separaten Fehlern: einer Insecure Direct Object Reference (IDOR), die es jedem Benutzer erlaubt, das Profil eines anderen Benutzers anzusehen, und einer Schwachstelle durch fehlerhafte Zugriffskontrolle (Broken Access Control), die es einem Benutzer mit allgemeinen Bearbeitungsrechten erlaubt, die Datensatzeigenschaften eines anderen Benutzers zu ändern.
Die Angriffskette ist wie folgt:
IDOR in PersonView.php: Es gibt keine Autorisierungsprüfung am Anfang von PersonView.php. Jeder authentifizierte Benutzer kann die Profilseite eines anderen Benutzers anzeigen (z. B. PersonView.php?PersonID=1 für den Admin), einfach indem er dessen ID kennt.
Broken Access Control in PropertyAssign.php: Die Funktion „Assign a New Property“ (Neue Eigenschaft zuweisen), die über die PersonView.php-Seite eines anderen Benutzers erreichbar ist, leitet den Benutzer zu PropertyAssign.php. Dieses Skript prüft korrekt, ob der Benutzer die allgemeine Berechtigung isEditRecordsEnabled() besitzt, führt aber keine objektbezogene Autorisierungsprüfung durch, um zu verifizieren, ob der Benutzer die spezifische, in der URL übergebene PersonID bearbeiten darf. Dadurch kann ein Benutzer mit „Edit Records“ die Eigenschaften jeder Person im System ändern, einschließlich der eines Administrators.
Vektor für gespeichertes XSS: Ein Angreifer kann diese beiden Fehler ausnutzen, um zur Profilseite des Administrators zu navigieren und das Formular „Assign a New Property“ zu verwenden, um eine bösartige XSS-Nutzlast im Datensatz des Administrators zu speichern. Das Feld Value für textbasierte Eigenschaften wird bei der Eingabe nicht ordnungsgemäß bereinigt (nur wird angewendet, was Ereignishandler nicht entfernt) und wird bei der Ausgabe nicht kodiert, was zu gespeichertem XSS führt.
Dieser Proof of Concept zeigt, wie ein Benutzer mit bestimmten mittleren Berechtigungen eine gespeicherte XSS-Nutzlast in das Profil des Hauptadministrators injizieren kann.
Voraussetzungen:
Edit RecordsManage Properties and ClassificationsSzenario:
PersonID=1 ist.
http://localhost:8101/PersonView.php?PersonID=1
PersonView.php gewährt).
PropertyAssign.php möglich).
PersonView.php?PersonID=1), wird die Nutzlast sofort ausgeführt und ein Alert-Fenster erscheint. Der Angreifer könnte eine fortschrittlichere Nutzlast verwenden, um das Sitzungscookie des Administrators zu stehlen.
Dies ist eine kritische Schwachstelle zur Privilegienausweitung. Sie ermöglicht es einem Benutzer mit bestimmten, erhöhten (aber nicht administrativen) Berechtigungen, die volle Kontrolle über das Konto eines Administrators zu erlangen. Durch die Übernahme der Admin-Sitzung kann der Angreifer jede Aktion ausführen, die einem Administrator zur Verfügung steht, einschließlich der Erstellung neuer Admin-Konten, dem Löschen von Daten und möglicherweise der Verkettung mit anderen Schwachstellen, um eine vollständige Kompromittierung des Servers zu erreichen.
Gemeldet von: Łukasz Rybak
Diese CVE wurde im Rahmen koordinierter Offenlegungspraktiken für Schwachstellen verantwortungsvoll offengelegt. Die hier bereitgestellten Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken.
strip_tagssrc/PropertyAssign.php): Speichert den Eigenschaftswert, nachdem nur strip_tags() angewendet wurde, was Ereignishandler-Attribute wie onerror zulässt.src/PersonView.php): Rendert den gespeicherten Eigenschaftswert direkt in das HTML, ohne htmlspecialchars(), wodurch die Nutzlast ausgeführt wird.
// src/PersonView.php, Zeile ~722
<td><?= $r2p_Value ?></td> // Verwundbar: Rohe Ausgabe