(SQLI) SQL Injection - PortSwigger (Writeup)

L'injection SQL (SQLI) est une technique d'attaque utilisée pour exploiter les vulnérabilités dans les applications web qui ne valident pas correctement l'entrée utilisateur dans la requête SQL envoyée à la base de données. Les attaquants peuvent utiliser cette technique pour exécuter des requêtes SQL malveillantes et obtenir des informations confidentielles telles que les noms d'utilisateur, les mots de passe et d'autres informations stockées dans la base de données.

SQL Injection Attacks:

Vulnerability in WHERE clause allowing retrieval of hidden data:

Ce labo contient une vulnérabilité d'injection SQL dans le filtre de catégorie de produits. Lorsque l'utilisateur sélectionne une catégorie, l'application exécute une requête SQL telle que:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

Pour résoudre le labo, effectuez une attaque par injection SQL qui amène l'application à afficher un ou plusieurs produits non publiés.

Vulnerability allowing login bypass:

Pour résoudre le laboratoire, effectuez une attaque par injection SQL qui se connecte à l'application en tant qu'utilisateur administrator. Ce laboratoire contient une vulnérabilité d'injection SQL dans la fonction de connexion.

UNION attack, determining the number of columns returned by the query:

Ce laboratoire contient une vulnérabilité de type injection SQL dans le filtre de catégorie de produit. Les résultats de la requête sont retournés dans la réponse de l'application, vous pouvez donc utiliser une attaque UNION pour récupérer des données d'autres tables. La première étape de cette attaque est de déterminer le nombre de colonnes retournées par la requête. Vous utiliserez ensuite cette technique dans les laboratoires suivants pour construire l'attaque complète.

Pour résoudre le laboratoire, déterminez le nombre de colonnes retournées par la requête en effectuant une injection SQL UNION qui retourne une ligne supplémentaire contenant des valeurs nulles.

Pour déterminer le nombre de colonnes dans une table, on peut introduire un ORDER BY jusqu'à ce que le serveur ne renvoie aucune erreur. Le numéro correspondant sera le nombre de colonnes dans la table. Dans ce cas, il y a uniquement 3 colonnes :

Maintenant que nous connaissons le nombre de colonnes, affichons-le à l'écran en utilisant union select. Cela nous permet d'extraire des informations sensibles de la base de données, telles que la version SQL, le nom de la base, lister des fichiers du serveur, exécuter des commandes, insérer du contenu dans des fichiers, etc...

UNION attack, finding a column containing text:

Ce laboratoire contient une vulnérabilité d'injection SQL dans le filtre de catégorie de produit. Les résultats de la requête sont renvoyés dans la réponse de l'application, vous pouvez donc utiliser une attaque UNION pour récupérer des données d'autres tables. Pour construire une telle attaque, vous devez d'abord déterminer le nombre de colonnes renvoyées par la requête. Vous pouvez utiliser une technique apprise dans un laboratoire précédent. L'étape suivante consiste à identifier une colonne compatible avec les données de type chaîne.

Le laboratoire fournira une valeur aléatoire que vous devez faire apparaître dans les résultats de la requête. Pour résoudre le laboratoire, effectuez une attaque par injection SQL UNION qui renvoie une ligne supplémentaire contenant la valeur fournie. Cette technique vous aide à déterminer quelles colonnes sont compatibles avec les données de type chaîne de caractères.

UNION attack, retrieving data from other tables:

Ce laboratoire contient une vulnérabilité de type injection SQL dans le filtre de catégorie de produits. Les résultats de la requête sont retournés dans la réponse de l'application, vous pouvez donc utiliser une attaque UNION pour récupérer des données d'autres tables. Pour construire une telle attaque, vous devez combiner certaines des techniques que vous avez apprises dans les laboratoires précédents.

La base de données contient une table différente appelée users, avec des colonnes appelées username et password

Pour résoudre le lab, effectuez une attaque d'injection SQL UNION qui récupère tous les noms d'utilisateur et mots de passe, et utilisez les informations pour vous connecter en administrator.

Tout d'abord, listons toutes les bases de données existantes avec leur nom de schéma. On trouve les bases pg_catalog, public et information_schema.

Ensuite, nous allons lister les tables existantes uniquement pour une base de données spécifique, en utilisant la clause WHEREtable

La base de données publique possède les tables users et products.

On continue en listant les colonnes de la table users en remplaçant les variables tables par column là où c'est nécessaire.

Une fois que le nom de la base de données, des tables et des colonnes est connu, on peut procéder à lister les données, comme les adresses email, les mots de passe et les noms d'utilisateur en clair.

UNION attack, retrieving multiple values in a single column:

Ce laboratoire contient une vulnérabilité de type injection SQL dans le filtre de catégorie de produit. Les résultats de la requête sont renvoyés dans la réponse de l'application, vous pouvez donc utiliser une attaque UNION pour récupérer des données d'autres tables.

La base de données contient une table différente appelée users, avec des colonnes nommées username et password.

Pour résoudre le laboratoire, effectuez une attaque par injection SQL UNION qui récupère tous les noms d'utilisateur et mots de passe, et utilisez ces informations pour vous connecter en tant qu'utilisateur administrateur.

Querying the database type and version on Oracle:

Ce laboratoire contient une vulnérabilité d'injection SQL dans le filtre de catégorie de produit. Vous pouvez utiliser une attaque UNION pour récupérer les résultats d'une requête injectée.

Dans les bases de données Oracle, chaque instruction SELECT doit spécifier une table à partir de laquelle sélectionner avec FROM. Si votre attaque UNION SELECT ne fait pas de requête sur une table, vous devrez quand même inclure le mot-clé FROM suivi d'un nom de table valide.

Il y a une table intégrée dans Oracle appelée dual que vous pouvez utiliser à cette fin. Par exemple : UNION SELECT 'abc' FROM dual

Nous avons constaté une erreur avec la commande UNION SELECT sur Oracle Database.

Pour résoudre cette erreur, il suffit d'indiquer toujours une table, par défaut la table DUAL

Pour vérifier la version d'Oracle, exécutez simplement une requête pour v$instance ou v$version

Querying the database type and version on MySQL and Microsoft:

Ce laboratoire contient une vulnérabilité SQL dans le filtre de catégorie de produit. Vous pouvez utiliser une attaque UNION pour récupérer les résultats d'une requête injectée.

Pour résoudre le labo, affichez la version de la base de données..

Pour connaître le type et la version de la base de données, vous pouvez interroger celle-ci avec la variable @@version, qui est compatible avec Microsoft SQL Server et MySQL.

Listing the database contents on non-Oracle databases:

Ce labo contient une vulnérabilité d'injection SQL dans le filtre de catégorie de produit. Les résultats de la requête sont renvoyés dans la réponse de l'application, donc vous pouvez utiliser une attaque UNION pour récupérer des données d'autres tables.

L'application a une fonction de connexion, et la base de données contient une table qui stocke les noms d'utilisateur et les mots de passe. Vous devez déterminer le nom de cette table et les colonnes qu'elle contient, puis récupérer le contenu de la table pour obtenir le nom d'utilisateur et le mot de passe de tous les utilisateurs.

Pour résoudre le laboratoire, connectez-vous en tant qu'utilisateur administrator.

Listing the database contents on Oracle:

Cette lab contient une vulnérabilité de type injection SQL dans le filtre de catégorie de produit. Les résultats de la requête sont renvoyés dans la réponse de l'application, vous pouvez donc utiliser une attaque UNION pour récupérer des données d'autres tables.

L'application possède une fonction de connexion, et la base de données contient une table qui détient des noms d'utilisateur et des mots de passe. Vous devez déterminer le nom de cette table et les colonnes qu'elle contient, puis récupérer le contenu de la table pour obtenir le nom d'utilisateur et le mot de passe de tous les utilisateurs.

Pour résoudre le lab, connectez-vous en tant qu'utilisateur Administrator.

1. On pourrait utiliser la technique du filtrage à travers toutes les tables existantes.

2. Une autre stratégie consiste à filtrer par les créateurs (propriétaires) de toutes les tables.

Ensuite, filtrez pour afficher uniquement les tables créées par Peter.

Une fois qu'on a trouvé la table USERS_OXGXNO, on cherche à identifier les colonnes.

Enfin, on affiche le contenu des colonnes username et password.

Blind SQL Injection:

Conditional responses:

Ce laboratoire contient une vulnérabilité d'injection SQL aveugle. L'application utilise un cookie de suivi pour les analyses et effectue une requête SQL contenant la valeur du cookie soumis.

Les résultats de la requête SQL ne sont pas renvoyés, et aucun message d'erreur ne s'affiche. Cependant, l'application inclut un message "Bon retour" sur la page si la requête renvoie des lignes.

La base de données contient une table différente appelée users, avec des colonnes nommées username et password. Vous devez exploiter la vulnérabilité d'injection SQL aveugle pour découvrir le mot de passe de l'utilisateur Pour résoudre le labo, connectez-vous en tant qu'utilisateur Administrator.

On remarque que le site ne traite pas notre SQL et aucune erreur n'est renvoyée.

La requête est interceptée en utilisant le logiciel BurpSuite.

Si nous ajoutons une apostrophe à l'identifiant de session "TrackingId" ou à l'identifiant du produit, le message "Welcome back" n'apparaît plus.

Voici la requête actuellement en cours d'exécution en arrière-plan :

Si une condition de vérité du type and 1=1 est exécutée, le message "welcome back" apparaît. En revanche, si la condition est fausse, par exemple 2=1, le message n'apparaît pas.

Nous allons profiter de cette condition pour filtrer les utilisateurs dans la table users dont le nom commence par la lettre "a".

Pour vérifier si le deuxième caractère est un "d", nous allons filtrer en utilisant la deuxième lettre, et ainsi de suite.

Nous utiliserons l'outil Intruder de Burpsuite pour effectuer une attaque par force brute de type snipper pour trouver le mot de passe de l'utilisateur Administrator

Nous commençons une attaque et découvrons que le premier caractère du mot de passe est "e", car la longueur de la réponse diffère pour ce caractère par rapport aux autres.

Script Python automatisant entièreuests, signal, time, pdb, sys, string

Conditional errors:

Ce laboratoire contient une vulnérabilité d'injection SQL aveugle. L'application utilise un cookie de suivi pour l'analyse et exécute une requête SQL contenant la valeur du cookie soumis.

Les résultats de la requête SQL ne sont pas retournés et l'application ne réagit pas différemment en fonction du retour de la requête. Si la requête SQL provoque une erreur, l'application renvoie un message d'erreur personnalisé.

La base de données contient une table différente appelée utilisateurs, avec des colonnes nom d'utilisateur et mot de passe. Vous devez exploiter la vulnérabilité d'injection SQL aveugle pour découvrir le mot de passe de l'utilisateur administrateur. Pour résoudre le problème, connectez-vous en tant qu'utilisateur administrateur.

Si l'on ajoute une apostrophe à la fin du trackingID, cela génère un code d'erreur "Internal Server Error".

Nous allons maintenant essayer de vérifier si 1 équivaut à 2 pour voir si une erreur est générée, ainsi que pour confirmer que des résultats corrects comme a = a ne génèrent pas d'erreur.

Maintenant, nous observons que grâce à l'interprétation de la commande suivante, le serveur répond correctement, ce qui signifie que la base de données est Oracle

Pour vérifier si la table "users" existe, on teste l'existence de sa première colonne. Si elle est présente, on renvoie un code 200, sinon un code 500.

La requête SQL vérifie l'existence de l'utilisateur 'administrator' dans la table 'users'. Si l'utilisateur est trouvé, elle déclenche une division par zéro, causant une réponse avec un code d'erreur 500. Si l'utilisateur n'existe pas, elle renvoie un code 200.

L'utilisateur 'jdjdjdj' n'existe pas, mais 'administrator' est présent.

Pour énumérer le mot de passe, il est nécessaire de suivre les étapes suivantes :

  1. Filtrer par longueur : Commencez par filtrer le mot de passe en fonction du nombre de caractères.

Cette injection provoque une division par zéro lorsque la condition est vraie, ce qui permet de confirmer que le mot de passe contient au moins 20 caractères.

Mis à jour

Ce contenu vous a-t-il été utile ?