Tutoriel de techniques d'injection SQL aveugle

Tutoriel de techniques d'injection SQL aveugle

Qu'est-ce que l'injection SQL?

L'injection SQL est un type d'attaque de base de données dans laquelle un attaquant essaie de voler des informations dans la base de données d'une application Web. Cela peut même résulter de l'exécution du code distant en fonction de l'environnement d'application Web et de la version de la base de données.

L'injection SQL se produit en raison d'une mauvaise désinfection de l'entrée des utilisateurs. Si vous prenez les commentaires de l'utilisateur dans un langage de codage (PHP, ASP.Net) et le transmettre directement à la base de données du serveur sans appliquer de filtre sur l'entrée, cela peut entraîner la vulnérabilité de l'injection SQL.

Par exemple, le code PHP suivant est vulnérable à l'attaque d'injection SQL car il transmet directement l'entrée de l'utilisateur à la base de données. L'attaquant peut élaborer sa propre requête de base de données malveillante pour extraire les données de la base de données.

// L'UserInput est stocké en variable d'ID
$ id = $ _get ['id'];
// L'UserInput est directement exécuté dans la base de données
$ getID = "SELECT FIrst_name, last_name chez les utilisateurs où user_id = '$ id'";
// En cas d'erreur ou de succès, les résultats sont renvoyés à l'utilisateur
$ result = mysql_query ($ getID) ou die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ result);

D'un autre côté, un exemple de code sécurisé d'un tel code pour interagir avec la base de données est donné. Il prend les entrées de l'utilisateur et filtre les caractères malveillants, puis le transmet à la base de données.

$ id = $ _get ['id'];
$ id = stridslashes ($ id);
$ id = mysql_real_escape_string ($ id);

Injection SQL normale vs aveugle

Injection SQL normale

En injection SQL normale, si un attaquant essaie de mettre un seul devis (') en entrée, lorsque cette citation unique est exécutée dans la base de données, la base de données répond par une erreur. L'erreur est imprimée au navigateur de l'attaquant.

Le code responsable de cette erreur est

// Si la base de données répond avec une erreur, la fonction «ou die ()» est exécutée
Pour imprimer l'erreur
$ result = mysql_query ($ getID) ou die ('
' . mysql_error () . '
');

En injection SQL normale, l'attaquant peut voir les résultats d'erreur et il est facile d'identifier et d'exploiter.

Injection de SQL aveugle

Dans le cas d'une injection de SQL aveugle, lorsqu'une requête malveillante comme une seule citation est exécutée, l'erreur de base de données n'est pas affichée au navigateur de l'attaquant ou elle est affichée de manière très générique qui ne peut pas être identifiée et exploitée facilement par l'attaquant.

Le code backend responsable de ceci est donné ci-dessous

$ result = mysql_query ($ getID); // supprimé «ou mourir» pour supprimer les erreurs mysql

Dans l'injection de SQL aveugle, l'attaquant ne peut pas voir les résultats complets, donc ce type de SQLI est difficile à identifier et à exploiter, mais il a le même niveau de risque que le SQLI normal.

Techniques pour détecter l'injection de SQL aveugle

Bien que l'injection SQL normale puisse être détectée en envoyant un seul devis (') en entrée et en examinant l'erreur de sortie, l'injection de SQL aveugle ne peut pas être détectée en utilisant cette technique car elle n'affiche aucune erreur SQL. Il existe de nombreuses techniques pour détecter une injection de SQL aveugle, certaines d'entre elles sont données comme suit

Détection vraie et fausse

L'une des caractéristiques des bases de données, y compris MySQL, est le comportement différent sur les déclarations vraies et fausses. Même si la base de données n'affiche aucune erreur, nous pouvons décider d'utiliser l'utilisation de déclarations vraies et fausses. Considérez le scénario suivant,

La page suivante est vulnérable à l'injection de SQL aveugle, ce qui lui donne une déclaration vraie affichera toutes les entrées de la base de données

1 'ou 1 = 1 #

Donner une fausse requête en entrée ne montrera aucune donnée.

1 'ou 1 = 2 #

Même la page Web ne montre aucune erreur, la différence entre les deux pages indique que nos requêtes sont exécutées avec succès dans la base de données.

Détection dans le temps

Il existe une fonction dans des bases de données, notamment MySQL, MS-SQL et autres pour les retards. Nous pouvons utiliser la fonction Sleep () dans notre requête, si la réponse de la base de données est lente, ce qui signifie que notre requête est exécutée avec succès et que la page Web est vulnérable à l'injection de SQL aveugle.

1 'et sommeil (15) #

Il y a une autre fonction «de référence» longue qui peut être utilisée pour retarder la réponse de la base de données

1 'et Benchmark (10000000, SHA1 (1337)) #

La ligne ci-dessus exécutera la fonction sha1 () 10000000 fois dans la base de données, ce qui ajoutera un nombre significatif de retard en réponse.

Injection de SQL aveugle basée sur le temps dans d'autres bases de données

MS SQL: Id = 1; Waitfor Delay '0: 0: 10'-

Oracle SQL: Et [Randnum] = DBMS_PIPE.Reçoile_message ('[randstr]', [temps de sommeil])

PostgreSQL: Et [randnum] = (sélectionnez [Randnum] sur pg_sleep ([Sleeptime])))

Sqlite: Et [randnum] = like ('abcdefg', upper (hex (randomblob ([sleeptime] 00000000/2)))))

Extraction d'informations sur la base de données

La première étape de l'extraction de la base de données est de déterminer les numéros de colonne dans la base de données. Ensuite, essayez de trouver des colonnes vulnérables pour extraire d'autres données.

L'injection de SQL aveugle se comporte différemment avec différents numéros de colonne dans la requête «Ordre par».

1 'commande par 1 #

L'instruction ci-dessus est vraie car au moins 1 colonne existe toujours dans une base de données. Maintenant, essayez avec un très grand nombre.

1 'commande par 10000 #

La réponse à la base de données est différente de la précédente. Essayez maintenant avec 2 colonnes.

La déclaration a fonctionné, cela signifie que la base de données a 2 colonnes ou plus. Essayez maintenant avec 3 colonnes.

1 'commande par 3 #

La base de données n'a envoyé aucune réponse, cela signifie que la base de données a uniquement 2 colonnes. Nous allons maintenant essayer de vider la liste des tables dans la base de données, nous utiliserons la requête suivante pour cela

1 'Union All Select 1, Group_Concat (Table_Name) dans Information_Schema.
Tables où table_schema = base de données () #

Il y a deux tableaux dans la base de données backend «Guestbook & Users». La table «Utilisateurs» peut contenir des noms d'utilisateur et des mots de passe. Pour extraire les noms de colonne de la table, insérez la requête suivante.

1 'Union All Select 1, Group_Concat (Column_name) dans Information_Schema.
colonnes où table_schema = base de données () #

Maintenant, nous avons extrait les noms de colonnes, cela inclut les colonnes utilisateur et mot de passe. Ces colonnes stockent les noms d'utilisateur des clients et leurs mots de passe.

Nous allons maintenant essayer d'extraire les données en utilisant la requête suivante

1 'Union All Select 1, Group_Concat (utilisateur, mot de passe) dans les utilisateurs #

Et c'est ainsi que vous pouvez exploiter l'injection de SQL aveugle sans compter sur les erreurs. Les mots de passe de sortie sont hachés la plupart du temps, qui peuvent être déchiffrés à l'aide d'outils comme John the Ripper ou Hashcat.

Conclusion:

L'injection de SQL aveugle est le type de SQLI qui ne montre pas d'erreurs de base de données ou ne répond par un message très générique. C'est pourquoi il est très difficile d'identifier la vulnérabilité d'injection de SQL aveugle dans une page Web. Une fois détecté, vous pouvez l'exploiter facilement par processus manuel ou automatisé à l'aide de SQLMAP.