ILIAS: SQL Injection in den MyStaff-Listen

Ein niedrig privilegierter Kursstab-Nutzer kann in ILIAS über einen Whitelist-Bypass in den MyStaff-Listen eine Blind-SQL-Injection ausführen und eine Admin-Session übernehmen.

Advisory-ID: TP-2026-005
Produkt: ILIAS (Open-Source-Lernplattform)
Schwachstellentyp: SQL Injection (CWE-89)
CVE: pending
CVSS 3.1: 9.3 (Kritisch)
Behoben: in den aktuellen ILIAS-Releases (Coordinated Disclosure abgeschlossen)
Gemeldet: 23. April 2026

Zusammenfassung

ILIAS ist eine weit verbreitete Open-Source-Lernplattform (LMS). Über einen Whitelist-Bypass in der zentralen Tabellen-Komponente gelangt ein angreiferkontrollierter Sortierwert ungeprüft in das ORDER BY dreier MyStaff-Listen-Abfragen. Ausnutzbar ist dies durch jeden niedrig privilegierten Nutzer mit einer OrgUnit-Position (typische Kursstab- oder Vorgesetztenrolle), ohne Administratorrechte. turingpoint hat den End-to-End-Exploit als zeitbasierte Blind-SQL-Injection gegen den aktuellen Entwicklungsstand verifiziert.

Ursache

ilTable2GUI::determineOffsetAndOrder() setzt nav_value direkt aus dem angreiferkontrollierten Parameter <prefix>_table_nav (components/ILIAS/Table/classes/class.ilTable2GUI.php:1197). Die Whitelist in_array($order, $this->sortable_fields) greift nur bei leerem nav_value, sodass ein gesetztes <prefix>_table_nav sie umgeht und das Sortierfeld aus dem Rohwert übernommen wird (class.ilTable2GUI.php:1211-1230). ListUsers verkettet $options['sort']['field'] und ['direction'] in ein rohes ORDER BY einer query()-Abfrage (components/ILIAS/MyStaff/classes/ListUsers/class.ilMStListUsers.php:84). Dieselbe unvalidierte Verkettung existiert in ListCourses (class.ilMStListCourses.php:121) und ListCompetencesSkills (class.ilMStListCompetencesSkills.php:87). storeProperty() persistiert den manipulierten Sortierwert in der Session, sodass das vergiftete ORDER BY bei nachfolgenden Anfragen weiterfeuert.

Proof of Concept

Mit einer gültigen Kursstab-Session löst ein präparierter myst_lu_table_nav-Parameter eine zeitbasierte Blind-Injection auf der MyStaff-Nutzerliste aus. Sechs verwaltete Mitarbeiter mal SLEEP(1) ergeben rund 6 s gegenüber einer sofortigen Baseline:

GET /ilias.php?baseClass=ilDashboardGUI&cmdNode=a4:kb:id&cmdClass=ilmstlistusersgui&cmd=index&myst_lu_table_nav=IF(1%3D1%2CSLEEP(1)%2C1)%3Aasc%3A0

Über bedingte Vergleiche lässt sich der Passwort-Hash-Präfix des globalen Administrators zeichenweise auslesen (SELECT ASCII(SUBSTRING(passwd,1,1)) FROM usr_data WHERE usr_id=6). Da der manipulierte Wert via storeProperty() in der Session persistiert, feuert das vergiftete ORDER BY auch bei nachfolgenden, sauberen Anfragen weiter. sqlmap bestätigt den Parameter als time-based blind injizierbar (current user: ilias@%, MariaDB 10.11).

Auswirkung

  • Niedrig privilegierter Kursstab-Nutzer erhält vollständigen DB-Lesezugriff: usr_data, usr_session, Zertifikate, API-Tokens.
  • Direktes Auslesen von usr_session liefert die aktive Session-ID des Administrators für sofortige Session-Übernahme, ohne Hash-Cracking.
  • Admin-Übernahme der ILIAS-Instanz aus einer niedrig privilegierten Rolle.
  • Das vergiftete ORDER BY persistiert in der Session und feuert weiter, bis der Nutzer manuell neu sortiert.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.