Qu'est-ce qu'une injection SQL (SQLi)?

La faille SQLi, abréviation de SQL Injection, soit injection SQL en français, est un groupe de méthodes d'exploitation de faille de sécurité d'une application interagissant avec une base de données. Elle permet d'injecter dans la requête SQL en cours un morceau de requête non prévu par le système et pouvant en compromettre la sécurité. Plus d'info : https://www.hacksplaining.com/exercises/sql-injection

Exploitation d'une faille SQLi sur un site E-commerce

Rappel sur les Risques Juridiques

Le fait d'entraver ou de fausser le fonctionnement d'un système de traitement automatisé de données est puni de cinq ans d'emprisonnement et de 150 000 € d'amende.Lorsque cette infraction a été commise à l'encontre d'un système de traitement automatisé de données à caractère personnel mis en œuvre par l'Etat, la peine est portée à sept ans d'emprisonnement et à 300 000 € d'amende. Le but est de comprendre le principe de l'attaque afin de mettre en place la sécurité adéquate.

Exemple de Risque d'Injection SQL

Imaginons un formulaire de connexion où l'utilisateur entre son nom d'utilisateur et son mot de passe. Une requête SQL classique pourrait ressembler à ceci :

        SELECT * FROM utilisateurs WHERE username = '$username' AND password = '$password';        

Si un utilisateur malveillant entre ' OR '1'='1 comme nom d'utilisateur et laisse le mot de passe vide, la requête devient :

        SELECT * FROM utilisateurs WHERE username = '' OR '1'='1' AND password = '';        

Cela permet à l'attaquant de contourner l'authentification et d'accéder au système sans fournir de mot de passe valide.

Correction pour Éviter les Injections SQL

Pour éviter ce type d'attaque, il est essentiel d'utiliser des requêtes préparées avec des paramètres. Voici un exemple en PHP avec PDO :

        <?php        // Connexion à la base de données        $pdo = new PDO('mysql:host=localhost;dbname=ma_base', 'utilisateur', 'mot_de_passe');        // Requête préparée avec des paramètres        $stmt = $pdo->prepare('SELECT * FROM utilisateurs WHERE username = :username AND password = :password');        $stmt->execute([          ':username' => $username,          ':password' => $password        ]);        // Vérification des résultats        if ($stmt->rowCount() > 0) {          echo 'Connexion réussie';        } else {          echo 'Nom d\'utilisateur ou mot de passe incorrect';        }        ?>        

En utilisant des requêtes préparées, les entrées utilisateur sont automatiquement échappées, ce qui empêche l'injection de code malveillant dans la requête SQL.

Contexte du Projet

Mario-no est un site E-commerce spécialisé dans la vente de parfums. Une cliente a informé le service support d'une usurpation d'identité. Elle fait appel à votre entreprise spécialisée dans la sécurité informatique et plus spécifiquement dans les attaques présentes dans le Top Ten de l'OWASP. Vous êtes le consultant qui a été choisi pour trouver la faille et produire un exemple d'attaque pour faire une démonstration au client, puis proposer de mettre des protections en place pour que le problème ne se reproduise pas.

Méthodologie

Pour résoudre ce problème, nous avons suivi une approche structurée :

  1. Installation

    Installer la solution en local sur votre poste (pensez à récupérer le script de base de données).

  2. Chercher une Faille

    Trouver une faille dans le site puis essayez de trouver une façon d'injecter du code malveillant. L'objectif : Vous devez rediriger tous les utilisateurs sur https://btssio-fulbert.fr/.

  3. Sécuriser le Site

    Sécuriser le site en proposant et mettant en place un correctif pérenne dans le temps.

Fonctionnalités Clés

Les mesures de sécurité mises en place offrent plusieurs avantages :

Fonctionnalité Description
Validation des Entrées Empêche l'injection de code malveillant via les formulaires.
Requêtes Préparées Protège contre les injections SQL en utilisant des requêtes paramétrées.
Tests de Sécurité Assure que le site est protégé contre les attaques SQLi.

Contexte du TP

Pour mieux comprendre les failles SQLi et comment les exploiter à des fins éducatives, consultez le TP disponible sur GitHub. Ce TP vous guide à travers le processus de découverte d'une faille SQLi, l'injection de code malveillant, et la mise en place de mesures correctives.

Le but est de comprendre le principe de l'attaque afin de mettre en place la sécurité adéquate. Il est crucial de noter que l'accès ou le maintien frauduleux dans un système de traitement automatisé de données est puni par la loi.

Sécuriser l'application

Toi aussi tu veux apprendre ou renforcer tes compétences en sécurité web et en gestion de projets de cybersécurité ? Alors Inscris-toi pour nous rejoindre.

Équipe du projet

Photo de profil de Kévin FERRANDON
Kévin FERRANDON

Enseignant / Developpeur freelance chartres

Spécialisation : Développeur Web