Injection SQL et attaques sur les bases de données

Prérequis et objectifs

1. Prérequis

Ce chapitre s’inscrit dans la continuité du chapitre précédent consacré aux vulnérabilités des applications web. Il aborde en profondeur les mécanismes, les techniques d’exploitation et les méthodes de protection contre l’injection SQL, une faille encore largement rencontrée lors des tests d’intrusion. Bien que la compréhension de cette attaque repose en partie sur des connaissances liées aux bases de données relationnelles, aucune expertise avancée en administration de bases n’est nécessaire. La maîtrise des concepts fondamentaux du langage SQL, tels que les requêtes de lecture, de filtrage ou de modification, suffit pour appréhender les exemples et scénarios exposés.

2. Objectifs

L’objectif de ce chapitre est double. Il s’agit, d’une part, de comprendre les conditions techniques dans lesquelles une application devient vulnérable à l’injection SQL et, d’autre part, de savoir exploiter cette faiblesse de manière offensive, manuellement ou à l’aide d’outils spécialisés. L’accent est mis sur la démarche méthodologique, les différents types d’injection possibles, ainsi que sur les conséquences concrètes sur l’intégrité...

Comprendre les injections SQL

1. Nature et mécanisme fondamental de l’injection

L’injection SQL constitue une technique d’attaque dans laquelle un acteur malveillant parvient à manipuler des requêtes SQL générées dynamiquement par une application. L’objectif est de forcer l’interpréteur de requêtes, généralement un SGBDR (Système de gestion de bases de données relationnelles) tel que MySQL, PostgreSQL, SQL Server ou Oracle, à exécuter des instructions non prévues initialement par les développeurs. Ce type d’attaque est possible lorsque les données issues de l’utilisateur sont incorporées directement dans une requête SQL sans validation ni encapsulation adéquate.

Une application vulnérable se comporte comme un pont trop permissif entre l’entrée utilisateur et la couche d’accès aux données. Au lieu de traiter l’entrée comme une valeur à insérer dans la requête, l’interpréteur SQL la lit comme du code. Cela revient à offrir à l’attaquant la possibilité d’injecter des fragments de syntaxe SQL dans une requête existante, détournant ainsi le fonctionnement prévu du système. En pratique, ce vecteur d’attaque s’exploite souvent dans des formulaires...

Types d’injection SQL

Les attaques par injection SQL se déclinent en plusieurs catégories, chacune exploitant une caractéristique spécifique du traitement des requêtes dans les bases de données relationnelles. La classification repose en grande partie sur le mode de communication entre l’application et la base de données, la capacité à extraire ou non des résultats visibles, et le comportement attendu par l’attaquant selon le niveau de filtrage ou de réponse de l’application.

1. Injection SQL classique (in-band)

L’injection dite in-band repose sur une interaction directe entre l’attaquant et le serveur de base de données, via le canal initial utilisé par l’application pour envoyer la requête. Elle se caractérise par une réponse immédiate et observable dans le navigateur ou l’interface utilisateur, ce qui en fait la forme la plus simple à exploiter.

La forme la plus élémentaire de cette injection repose sur une tautologie logique, comme l’opérateur OR 1=1, inséré dans une clause WHERE. Ce type de payload transforme la condition initiale en une expression toujours vraie, contournant ainsi les mécanismes de filtrage ou d’authentification. Par exemple, une requête initialement conçue pour vérifier la correspondance entre un nom d’utilisateur et un mot de passe peut être détournée pour accorder un accès sans authentification, si l’ensemble des lignes correspondantes est retourné par une condition toujours vérifiée.

L’injection de type UNION permet quant à elle de combiner le résultat de plusieurs requêtes...

Exploitation manuelle étape par étape

L’exploitation manuelle d’une injection SQL permet de comprendre en détail le fonctionnement de la faille, de s’adapter aux protections spécifiques de l’application cible, et de conserver un haut degré de contrôle sur les requêtes injectées. Contrairement aux outils d’automatisation, cette approche exige une bonne connaissance des mécanismes internes du langage SQL et de l’architecture de l’application. Elle s’avère essentielle lors des phases exploratoires d’un test d’intrusion ou pour contourner des systèmes de défense tels que les WAF (Web Application Firewall) ou les filtres d’entrée.

1. Identification du vecteur d’injection

La première étape consiste à détecter un comportement suspect dans les interactions entre l’application web et la base de données. Cela passe généralement par l’observation attentive des zones où des entrées utilisateur sont traitées : champs de formulaire, paramètres d’URL, valeurs de cookies, ou encore corps des requêtes POST. L’injection peut également s’opérer via des vecteurs moins visibles, comme les en-têtes HTTP ou les champs stockés dans des bases internes. La méthode consiste à injecter une syntaxe anormale, souvent un simple caractère comme une apostrophe (’) ou un guillemet ("), dans le champ cible, dans le but de provoquer une erreur de parsing SQL. La présence d’un message d’erreur explicite ou d’un comportement...

Outils d’automatisation

L’exploitation manuelle d’une injection SQL permet une compréhension fine du comportement de l’application et de la base de données, mais elle présente rapidement des limites dès lors que les vecteurs d’injection deviennent multiples, que le schéma de la base est complexe ou que l’objectif est d’automatiser l’exfiltration de données. Pour répondre à ces problématiques, des outils spécialisés ont été développés, dont SQLmap, devenu au fil des années la référence incontestée dans le domaine de l’automatisation des attaques par injection SQL.

SQLmap est un outil en ligne de commande, écrit en Python, capable de détecter, exploiter, et automatiser toutes les étapes d’une attaque SQLi, depuis la détection initiale jusqu’à l’extraction complète d’une base de données. Il supporte de nombreux moteurs de bases (MySQL, PostgreSQL, SQL Server, Oracle, SQLite) ainsi que les méthodes d’injection les plus courantes (in-band, blind, error-based, time-based), avec des modules spécialisés pour chaque scénario.

1. Fonctionnement et utilisation de base

L’approche initiale de SQLmap consiste à fournir une URL vulnérable ou suspecte, que l’outil...

Contre-mesures et bonnes pratiques

Une sécurité robuste repose sur une combinaison de pratiques de codage défensif, de configuration rigoureuse, de limitation des privilèges et de supervision continue. Dans un contexte professionnel, l’évaluation d’un système ne se limite pas à la recherche de failles, mais inclut la capacité à recommander des mesures concrètes pour y remédier. Les contre-mesures contre les injections SQL doivent être pensées à tous les niveaux du cycle de développement et d’exploitation d’une application.

1. Requêtes préparées et séparation des données et du code

L’une des défenses les plus efficaces contre les injections SQL repose sur l’utilisation de requêtes paramétrées, également appelées requêtes préparées. Ce mécanisme, supporté par la majorité des pilotes SQL modernes, impose une séparation stricte entre le code SQL et les données injectées, empêchant ainsi l’interpréteur SQL de confondre les entrées utilisateur avec des instructions exécutables.

Dans ce modèle, la structure de la requête est compilée à l’avance avec des marqueurs de substitution (?, :param, etc.), puis les données sont transmises séparément au moteur d’exécution. Par exemple, en PHP avec PDO, une requête préparée s’écrit sous la forme SELECT * FROM users WHERE id = :id, suivie d’un bindParam() pour transmettre la valeur. En Python, les bibliothèques comme psycopg2 ou sqlite3 permettent une syntaxe similaire en utilisant des placeholders (%s) et une exécution différée. En JavaScript, avec...

Travaux pratiques

1. Exploitation d’une injection SQL sur DVWA

Règles éthiques et légales

  • Tester uniquement le périmètre autorisé et documenter l’activité.

  • Ne pas utiliser de données réelles ou respecter le RGPD si nécessaire.

  • Préférer des environnements isolés et des données factices (VM, sandbox, serveurs de test).

Préparation de l’environnement

L’environnement utilisé est DVWA (Damn Vulnerable Web Application), une application web PHP/MySQL volontairement vulnérable, conçue pour les tests de sécurité. Elle peut être installée localement sur une machine virtuelle ou via Docker.

Si l’environnement Docker est utilisé, la commande suivante permet de l’installer rapidement :

git clone https://github.com/digininja/DVWA.git 
cd DVWA 
docker-compose up -d 

Une fois l’environnement lancé, l’application est accessible depuis un navigateur à l’adresse suivante :

http://localhost:8080 

La page d’accueil invite à finaliser la configuration. Un mot de passe administrateur par défaut peut être défini, et la base de données initialisée depuis l’interface web.

Dans l’onglet DVWA Security, il convient de définir le niveau de sécurité à Low, ce qui permet une exploitation directe sans filtrage ni protection.

Étape 1 - Identification du point d’entrée vulnérable

 Accédez au module SQL Injection via le menu latéral. Ce module affiche un formulaire...

Validation des acquis : questions/réponses

Si l’état de vos connaissances sur ce chapitre vous semble suffisant, répondez aux questions ci-après.

1. Questions

1 Pourquoi une application devient-elle vulnérable à l’injection SQL ?

2 En quoi consiste une injection SQL dite « in-band » et pourquoi est-elle plus simple à exploiter que les autres formes ?

3 Quelle est la différence entre une injection SQL boolean-based et une injection SQL time-based ?

4 Qu’est-ce qu’une « Second Order SQL Injection » et en quoi diffère-t-elle d’une injection classique ?

5 Pourquoi le nombre de colonnes dans une requête SQL est-il crucial lors d’une attaque par UNION SELECT ?

6 Quel rôle joue la fonction xp_cmdshell dans une injection SQL sur SQL Server ?

7 En quoi consiste le principe du moindre privilège dans le contexte des bases de données, et pourquoi est-il essentiel ?

8 Pourquoi le whitelisting est-il plus efficace que le blacklisting pour la validation des entrées utilisateur ?

9 À quoi sert l’option --tamper dans SQLmap et dans quel contexte doit-elle être utilisée ?

10 Pourquoi est-il nécessaire de combiner plusieurs mesures défensives pour se protéger efficacement contre les injections SQL ?

2. Résultats

Référez-vous aux pages suivantes pour contrôler vos réponses. Pour chacune de vos bonnes réponses, comptez...