Second-Order SQL Injection
hackingDéfinition
L'injection SQL du second ordre (Second-Order SQL Injection, aussi appelée Stored SQL Injection) est une variante d'injection SQL où le payload malveillant est d'abord stocké dans la base de données (lors d'une première requête) et n'est exploité qu'ultérieurement, lors d'une seconde requête qui récupère et utilise les données stockées sans assainissement suffisant.
Contrairement à l'injection SQL classique (first-order) qui est exécutée immédiatement lors de la première requête, le second-order bypass les protections appliquées uniquement à l'entrée de données. Une application peut sanitiser correctement les données lors de l'insertion (premier ordre) mais faire confiance aux données stockées en base lors de leur réutilisation (second ordre), supposant à tort que les données en base sont sûres.
Scénario typique : un utilisateur s'inscrit avec le username admin'--. L'application échappe correctement ce username lors de l'INSERT (stocké tel quel avec l'apostrophe dans la base). Plus tard, quand l'utilisateur change son mot de passe, l'application exécute une requête utilisant le username stocké : UPDATE users SET password='nouveau' WHERE username='admin'--'. Le -- commente le reste de la requête, modifiant le mot de passe de l'utilisateur 'admin' plutôt que du compte actuel.
Cette vulnérabilité est particulièrement insidieuse car elle ne se manifeste pas immédiatement lors du test de l'entrée originale et peut être difficile à détecter dans les revues de code. Les scanners automatiques simples qui ne suivent pas les flux de données entre requêtes peuvent manquer les second-order SQLi.
Des cas réels documentés incluent des applications de changement de mot de passe, des fonctions de gestion de profil, et des traitements batch qui réutilisent des données stockées dans des requêtes SQL non paramétrées.
Fonctionnement
Étape 1 : s'inscrire avec username admin'-- (l'apostrophe est échappée lors de l'INSERT, stockée comme admin'-- en base). Étape 2 : utiliser la fonction 'changer mot de passe' qui génère : UPDATE users SET password='[newpass]' WHERE username='admin'--'. Le -- commente AND old_password='xxx', permettant de changer le mot de passe sans connaître l'ancien. L'injection ne s'exécute pas lors de l'inscription mais lors du changement de mot de passe.
Exploitation offensive
Les second-order SQLi permettent souvent de prendre le contrôle de comptes d'autres utilisateurs (admin) sans injection visible lors du test initial. Les fonctions de réinitialisation de mot de passe, de recherche basée sur le profil, et de traitement de messages sont des zones à fort risque. La cartographie des flux de données (où les données d'un utilisateur sont réutilisées dans des requêtes SQL) est nécessaire pour trouver ces injections.
Détection et mitigation
Les requêtes préparées (paramétrisées) au niveau des deux requêtes (insertion ET réutilisation) protègent contre les second-order SQLi. Un ORM (Object-Relational Mapper) bien utilisé offre une protection similaire. La revue de code doit tracer les flux de données depuis leur origine jusqu'à leur utilisation dans des requêtes SQL, même indirecte.
Articles liés
Expert en cybersécurité offensive et intelligence artificielle. Pentest, audit et développement IA sur-mesure.
Services
- Audit Infrastructure
- Audit Kubernetes
- Audit Microsoft 365
- Audit Sécurité Réseau
- Analyse de Risques
- Audit Active Directory
- Audit Application Web
- Audit Cloud (AWS/Azure/GCP)
- Audit Messagerie
- Audit API (OWASP Top 10)
- Audit DevSecOps & CI/CD
- Audit Code Source (SAST)
- Audit Postes de Travail
- Audit Sauvegarde & Résilience
- Audit OT/SCADA (IEC 62443)
- Développement IA
- Formations
Ressources
Projets & Outils
© 2026 Ayi NEDJIMI Consultants. Tous droits réservés. 2.1.7
Un projet cybersécurité ?
Expert dispo · Réponse 24h