Exploiter les vulnérabilités d'injection SQL avec Nmap

Beginner

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous allez apprendre ce qu'est l'injection SQL, une technique utilisée par les attaquants pour exploiter les vulnérabilités des applications web interagissant avec des bases de données. Les attaques d'injection SQL peuvent permettre un accès non autorisé aux données sensibles, la manipulation des données et même la compromission complète du système.

L'objectif de ce laboratoire est d'acquérir une expérience pratique en matière d'injection SQL en exploitant les vulnérabilités d'une application web vulnérable. Vous apprendrez à identifier les vulnérabilités potentielles d'injection SQL, à élaborer des requêtes SQL malveillantes et à extraire des informations sensibles de la base de données. De plus, vous apprendrez les mécanismes de défense et les meilleures pratiques pour atténuer les attaques d'injection SQL.


Skills Graph

Configurer l'environnement de laboratoire

Dans cette étape, vous allez configurer l'environnement de laboratoire, qui comprend une application web vulnérable et un serveur de base de données.

  1. Ouvrez le terminal et accédez au répertoire /home/labex/project.

    cd /home/labex/project
  2. Il y a deux fichiers Python dans le répertoire project : app.py et setup_db.py. Le fichier app.py contient le code source de l'application web vulnérable, et le fichier setup_db.py contient le code pour configurer la base de données.

  3. Exécutez le script setup_db.py pour créer la base de données et la remplir avec des données d'exemple.

    python3 setup_db.py
  4. Démarrez le serveur d'application web.

    python3 app.py

Vous devriez voir un message indiquant que le serveur est en cours d'exécution sur http://localhost:5000.

Identifier les vulnérabilités d'injection SQL

Dans cette étape, vous apprendrez à identifier les vulnérabilités potentielles d'injection SQL dans l'application web.

  1. Ouvrez un navigateur web et accédez à http://localhost:5000.
    Page d'accueil de l'application web
  2. Recherchez les champs de saisie où les données utilisateur sont envoyées au serveur, comme les boîtes de recherche.
  3. Essayez d'entrer des caractères spéciaux ou des mots - clés SQL (par exemple, ', ", --, ;) dans les champs de saisie et observez le comportement de l'application.
  4. Si l'application affiche des messages d'erreur ou se comporte de manière inattendue, cela peut indiquer une vulnérabilité potentielle d'injection SQL.
    Test de saisie dans la boîte de recherche
    Lorsque vous entrez une apostrophe (') dans la boîte de recherche et que vous cliquez sur le bouton "Search", l'application affiche simplement No results found sans aucun message d'erreur. Ce comportement suggère que l'application peut être vulnérable à l'injection SQL.

Exploiter les vulnérabilités d'injection SQL

Dans cette étape, vous apprendrez à exploiter les vulnérabilités d'injection SQL identifiées pour extraire des informations sensibles de la base de données.

  1. Localisez le champ de saisie ou le paramètre vulnérable identifié à l'étape précédente.

  2. Essayez d'insérer différents payloads (charges utiles) d'injection SQL dans le champ de saisie ou le paramètre.

  3. Essayez d'extraire des informations sensibles de la base de données en utilisant des payloads d'injection SQL. Par exemple, vous pouvez utiliser le payload suivant pour extraire des données de la base de données :

    ' UNION SELECT username, password FROM users --

    Le payload ci - dessus peut être utilisé pour récupérer les noms d'utilisateur et les mots de passe de la table users dans la base de données.

  4. Observez la réponse de l'application et recherchez toute information sensible affichée ou toute erreur qui pourrait révéler des informations sur la structure ou le contenu de la base de données.

Atténuer les vulnérabilités d'injection SQL

Dans cette étape, vous apprendrez les mécanismes de défense et les meilleures pratiques pour atténuer les vulnérabilités d'injection SQL.

  1. Examinez le code source de l'application web vulnérable et identifiez les zones où les entrées utilisateur sont utilisées dans les requêtes de base de données sans nettoyage approprié.

  2. Mettez en œuvre des techniques de validation et de nettoyage des entrées, telles que :

    • Requêtes paramétrées ou instructions préparées
    • Validation et nettoyage des entrées (par exemple, suppression ou échappement des caractères spéciaux)
    • Principe du moindre privilège pour les comptes de base de données
  3. Mettez à jour le code de l'application pour utiliser des requêtes paramétrées ou des instructions préparées lors de l'exécution de requêtes de base de données avec des entrées utilisateur.
    Modifiez le fichier app.py de :

    sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query)
    cur.execute(sql_query)

    en :

    sql_query = "SELECT username, password FROM users WHERE username LIKE?"
    cur.execute(sql_query, ('%' + query + '%',))

    Et déplacez results = cur.fetchall() sous la ligne logging.info(f"Search query: {query}").

    logging.info(f"Search query: {query}")
    
    results = cur.fetchall()
  4. Après les modifications ci - dessus, enregistrez le fichier et redémarrez le serveur d'application web.

    Utilisez ctrl+c pour arrêter le serveur, puis démarrez - le à nouveau en utilisant :

    python3 app.py
  5. Testez l'application mise à jour pour vous assurer que les attaques d'injection SQL ne sont plus possibles.

Résumé

Dans ce laboratoire, vous avez appris ce qu'est l'injection SQL, une technique utilisée par les attaquants pour exploiter les vulnérabilités des applications web interagissant avec des bases de données. Vous avez configuré une application web vulnérable et un serveur de base de données, identifié les vulnérabilités potentielles d'injection SQL et les avez exploitées pour extraire des informations sensibles de la base de données. De plus, vous avez appris les mécanismes de défense et les meilleures pratiques pour atténuer les attaques d'injection SQL, telles que la validation des entrées, le nettoyage et l'utilisation de requêtes paramétrées ou d'instructions préparées.

Grâce à cette expérience pratique, vous avez acquis une compréhension plus approfondie des attaques d'injection SQL et de la manière de les prévenir dans les applications web. Vous avez également compris l'importance des pratiques de codage sécurisé et les conséquences potentielles de l'échec à nettoyer correctement les entrées utilisateur lors de l'interaction avec les bases de données.