Applications, sites et API

Particuliers et entreprises

Injection SQL

SQL injection — SQLi

Une entrée mal traitée modifie une requête vers la base de données.

Révision éditoriale : Comprendre : 2 min · Cas technique et détails : 6 min
Je pense être concerné : que faire ?
Illustration pédagogique : injection sql.

Comprendre et agir

À la fin de cette lecture, vous pourrez expliquer le piège et choisir une première réaction adaptée à votre rôle. Aucun prérequis informatique n’est nécessaire.

Une situation concrète

Un formulaire de recherche sert normalement à retrouver une commande. Si le site confond le texte saisi avec des instructions pour sa base de données, une personne peut obtenir des résultats qui ne lui appartiennent pas.

Comment cela fonctionne

Une injection SQL détourne la façon dont un service interroge sa base de données. Le problème se situe dans la construction de la requête, pas dans la présence d’un caractère « interdit » à lui seul. L’attaquant cherche à faire traiter son entrée comme une partie des instructions. Il peut parfois lire, modifier ou supprimer des informations. Un visiteur ordinaire n’a pas à réparer ce défaut : c’est au développeur et à l’exploitant du service de le corriger.

Comment le piège fonctionne
  1. Une valeur arrive au site

    Recherche, formulaire ou autre entrée.

  2. Elle devient une instruction

    La requête est construite sans séparation sûre.

  3. La base répond autrement

    Lecture ou modification non autorisée.

Ce que vous pouvez faire

Vos premiers réflexes

Vous n’avez pas à réparer la base de données du site. Si une recherche montre des documents d’autrui, arrêtez la consultation et signalez au service la page et l’heure.

Si vous êtes responsable du service ou de l’organisation

Développeurs : passez les valeurs par les paramètres du pilote SQL et vérifiez les droits de chaque utilisateur. Limitez aussi le compte de base de données de l’application.

Le détail qui change toutUne idée reçue à corriger

Masquer les messages d’erreur ne corrige pas une injection SQL.

À vous de décider

Une recherche affiche la facture d’un autre client. Faut-il essayer d’autres recherches pour prouver le problème ?

Choisissez votre réponse et expliquez pourquoi avant de lire la correction.

Voir la réponse expliquée

Non. Arrêtez la consultation et signalez la page, l’heure et votre action au responsable, sans diffuser les documents d’autrui. Le service doit vérifier la cause : une donnée affichée à tort est un problème, mais ne suffit pas à identifier une injection SQL plutôt qu’un autre défaut d’accès.

Analyser un cas technique

Pour les personnes qui développent, administrent ou analysent les systèmes concernés. Commencez par « Comprendre et agir » si ces notions sont nouvelles pour vous.

Étude de cas fictive

Une recherche de factures renvoie les données d’un autre client

Une injection SQL apparaît lorsque l’application assemble une requête en y insérant directement une valeur reçue du navigateur. La base peut alors interpréter cette valeur comme une instruction. Dans le cas présenté, une recherche effectuée par le client A renvoie aussi une facture du client B : le filtre qui devait séparer leurs données a été contourné.

Les lignes portant req=r41 permettent de suivre la même requête du serveur web jusqu’à la réponse. Le champ returned_tenants=A,B révèle ici la fuite entre clients. Ce champ a été ajouté par l’application ; il n’existe pas dans tous les journaux. Sans lui, status=200 indique seulement que le serveur a répondu, sans préciser quelles données il a livrées.

La correction consiste à séparer la structure SQL des valeurs transmises, avec les paramètres du pilote de base de données. Il faut conserver le contrôle des droits du client connecté. Les noms de colonnes et les options de tri demandent un traitement différent : l’application doit les choisir dans une liste définie à l’avance. Vérifier aussi les exports, les tâches différées et les droits du compte SQL, car ils peuvent utiliser le même défaut.

Le déroulement en schéma

Qui échange avec quiLisez les échanges de haut en bas. Le point marque le départ et la flèche l’arrivée. Les vérifications après correction ne sont pas la suite de l’attaque.

Faites défiler le diagramme pour suivre les échanges ; les noms des acteurs restent en haut. Sur petit écran, faites aussi défiler de gauche à droite.

Étape
Client de testEntrée non fiable
API facturesAutorisation métier
Pilote SQLSéparation code/données
SGBDDroits web_read
  1. Action

    Recherche + session du client A

    Client de test vers API factures

    Trace r41 / identité serveur

  2. Action

    Vulnérable : SQL concaténé

    API factures vers Pilote SQL

    Trace Version du code

  3. Action

    Condition SQL détournée

    Pilote SQL vers SGBD

    Trace Audit des lectures

  4. Réponse

    Factures A et B

    SGBD vers API factures

    Trace db_rows / portée

  5. Réponse

    Le client A reçoit aussi des factures du client B

    API factures vers Client de test

  6. Action

    Corrigé : SQL fixe + valeurs liées

    API factures vers Pilote SQL

    Trace Test de non-régression

  7. Action

    Même entrée traitée comme donnée

    Pilote SQL vers SGBD

  8. Réponse

    Aucune correspondance

    SGBD vers API factures

Comment repérer cette attaque

Indices à rechercher

  • Des erreurs de base de données apparaissent dans l’interface.
  • Des requêtes inhabituelles provoquent des réponses ou temps de traitement anormaux.
  • Des lectures ou modifications ne correspondent pas aux actions autorisées.

Rechercher les réponses qui contiennent des données d’un autre client, les lectures hors du périmètre autorisé et les erreurs SQL inhabituelles autour d’une recherche ou d’un export.

Éléments à croiser

Suivre un même identifiant de requête du frontal au service. Rapprocher ensuite la session PostgreSQL si ce lien a été instrumenté ; une simple proximité horaire entre deux requêtes concurrentes ne suffit pas.

Limites de l’interprétation

Sans audit des objets retournés, on peut établir une requête suspecte sans connaître exactement les données exposées. Ne pas activer une journalisation indiscriminée des paramètres sur une base de production.

Comment réagir

Corriger les requêtes vulnérables et vérifier les autres fonctions qui utilisent la même construction. Conserver la version exposée et les journaux pour retrouver les lectures ou écritures possibles. Renouveler les secrets accessibles après avoir fermé la faille. Si des données ont été modifiées, comparer avec les sauvegardes et les journaux transactionnels avant restauration.

Vérifier la correction

Ces contrôles s’adressent à l’équipe responsable du système. Les simulations se préparent dans un environnement de test autorisé ; la lecture du cas ne nécessite aucune manipulation.

  1. Une recherche ne doit jamais renvoyer les factures d’un autre client, même avec une valeur inattendue.
  2. Les tris, exports et tâches différées doivent appliquer la même séparation entre instructions SQL et données.
  3. Le compte utilisé par l’application doit avoir uniquement les droits nécessaires sur la base.

À vous de raisonner

La recherche utilise désormais des paramètres SQL. Quel contrôle faut-il encore tester avec deux comptes de clients différents ?

Formulez votre décision et l’élément qui la justifie avant d’ouvrir la correction.

Comparer avec le raisonnement expliqué

Vérifiez que chaque compte ne reçoit que les factures auxquelles il a droit. Les paramètres empêchent une valeur de modifier la structure SQL ; ils ne remplacent pas l’autorisation sur les données. Testez aussi les exports et tris, et vérifiez les données renvoyées plutôt que le seul statut HTTP.

Consulter les détails techniques

Pour aller plus loin après l’étude du cas : les extraits servent à s’exercer à la lecture des traces ; le guide de collecte aide les personnes qui disposent des outils et des accès nécessaires.

Lire les extraits commentés — reconstitution fictive

Ces extraits utilisent des valeurs fictives. Certains reprennent des champs documentés ; d’autres regroupent plusieurs sources dans un format pédagogique. Ce ne sont pas des exports bruts à retrouver tels quels dans vos outils. Commencez par les champs expliqués, puis retrouvez-les dans les extraits.

returned_tenants
Champ pédagogique : liste des clients auxquels appartiennent les objets renvoyés. PostgreSQL et nginx ne produisent pas spontanément cette liste.
db_called=false
Dans le cas, le service a refusé la requête avant l’appel à la base ; cela exige une trace applicative de cette décision.

Corrélation requête → base → réponse

Journal

Traces synthétiques normalisées ; les champs db_rows et tenant sont ajoutés ici par l’instrumentation de l’application.

10:02:11.040Z edge req=r41 actor=u17 tenant=A route=/factures status=200
10:02:11.045Z app  req=r41 db_role=web_read query=invoice_search db_rows=2
10:02:11.047Z app  req=r41 returned_tenants=A,B response_bytes=4210
10:03:08.002Z edge req=r42 actor=u17 tenant=A route=/factures status=403
10:03:08.004Z app  req=r42 reason=invalid_sort_field db_called=false
Préparer une collecte dans votre environnement

Choisissez les sources qui correspondent à vos outils et à votre périmètre d’intervention. Cette liste n’est pas un équipement requis pour comprendre la fiche. Vérifiez que les journaux nécessaires étaient activés pendant la période étudiée. Conservez l’export original, son fuseau horaire et sa provenance dans un espace à accès restreint ; travaillez sur une copie expurgée des secrets.

  1. nginx — journal d’accès HTTP

    Où les trouver
    Sur le frontal, dans le fichier désigné par access_log ; son contenu dépend de log_format. L’hébergeur peut devoir fournir cet export.
    Quoi relever
    Relever l’heure, la route, la méthode, le statut et l’identifiant de requête s’il est configuré. Un HTTP 200 décrit une réponse, pas les lignes consultées en base.
    Accès et prérequis
    Lecture des journaux serveur. Vérifier que la route est journalisée : les temps de réponse et identifiants de requête ne figurent pas forcément dans le format configuré.
    Documentation : nginx — journal d’accès HTTP
  2. PostgreSQL — journaux du serveur de base de données

    Où les trouver
    Sur le serveur PostgreSQL ou dans la console du service géré. Avec le collecteur actif, current_logfiles indique les fichiers en cours ; log_destination et log_directory déterminent la destination.
    Quoi relever
    Chercher l’instruction ou l’erreur SQL au même instant, avec le rôle et la session de base. Une erreur de syntaxe peut signaler une tentative ; une requête réussie peut n’en produire aucune.
    Accès et prérequis
    Accès administrateur ou export par l’exploitant. log_statement détermine les instructions enregistrées : le journal d’erreurs seul n’est pas un historique complet des requêtes. Attention aux paramètres confidentiels.
    Documentation : PostgreSQL — journaux du serveur de base de données
  3. Service concerné — audit et historique à vérifier

    Où les trouver
    Dans l’outil d’administration ou les journaux du service concerné. Demander à son mainteneur où sont enregistrées les décisions d’autorisation et les opérations métier.
    Quoi relever
    Pour établir une fuite entre clients, il faut lier la requête HTTP à l’identité, au client autorisé et aux objets réellement retournés. Cette décision d’accès relève de l’application, pas du journal nginx.
    Accès et prérequis
    Il n’existe ni fichier ni vocabulaire universels. Les champs proposés ici doivent être instrumentés s’ils manquent ; ne pas enregistrer mots de passe, jetons ou contenu privé intégral.
    Documentation : Service concerné — audit et historique à vérifier

Dans l’histoire des cyberattaques

Groupes et campagnes documentés

1 repère

Des faits réels pour situer ce mécanisme. Les années sont celles des faits ; chaque notice précise qui établit le lien avec le groupe ou la campagne.

  1. GroupeCL0P

    MOVEit : une injection SQL au service du vol de fichiers

    À partir de mai 2023, une faille de MOVEit Transfer permet d’accéder à des données via une injection SQL. Les attaquants déploient un composant clandestin et volent des fichiers : cette campagne illustre l’extorsion par la fuite de données, sans supposer leur chiffrement.

    Ce qu’établit la source. Campagne attribuée à CL0P par le FBI et la CISA dans leur avis conjoint du 7 juin 2023.

    Consulter le rapport CL0P Ransomware Gang Exploits MOVEit Vulnerability (PDF) · PDF sur ECRAN22 pages · anglais · édition : 16 juin 2023 · Provenance et copie

    FBI / CISA · Mis à jour le

Sélection de cas documentés, non exhaustive. Une technique peut être utilisée par de nombreux acteurs. Les cas fictifs de la fiche ne sont attribués à aucun de ces groupes.

Si vous pensez être concerné

Si vous utilisez le service

Vous n’avez pas à réparer la base de données du site. Si une recherche montre des documents d’autrui, arrêtez la consultation et signalez au service la page et l’heure.

Pour l’équipe qui exploite le service

  1. Signalez le problème au responsable du service sans explorer les données d’autrui.
  2. Faites corriger les chemins de requête concernés.
  3. Recherchez les lectures et modifications possibles pendant la période vulnérable.

Pour qualifier votre situation et être orienté : obtenir une assistance sur 17Cyber. Dans une organisation, prévenez aussi le responsable ou prestataire chargé de la sécurité.

Sources et repères pour approfondir