Sécurité

Tutoriel sur les techniques d'injection SQL en aveugle

Tutoriel sur les techniques d'injection SQL en 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 entraîner l'exécution de code à distance en fonction de l'environnement de l'application Web et de la version de la base de données.

L'injection SQL se produit en raison d'une mauvaise désinfection des entrées de l'utilisateur. Si vous prenez l'entrée 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 une vulnérabilité d'injection SQL.

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

// L'entrée utilisateur est stockée dans la variable id
$id = $_GET['id'] ;
// L'entrée utilisateur est directement exécutée dans la base de données
$getid = "SELECT first_name, last_name FROM utilisateurs WHERE user_id = '$id'" ;
// En cas d'erreur ou de succès, les résultats sont retournés à l'utilisateur
$result = mysql_query($getid) ou die('
' . mysql_error() . '
' );
$num = mysql_numrows($result);

D'autre part, 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 en filtre tous les caractères malveillants, puis les transmet à la base de données.

$id = $_GET['id'] ;
$id = barres obliques($id);
$id = mysql_real_escape_string($id);

Injection SQL normale ou aveugle

Injection SQL normale

En injection SQL normale, si un attaquant essaie de mettre un guillemet simple (') en entrée, lorsque ce guillemet simple est exécuté dans la base de données, la base de données répond par une erreur. L'erreur est imprimée sur le navigateur de l'attaquant.

Le code responsable de cette erreur est

// si la base de données répond avec une erreur, la fonction "or die()" est exécutée
pour imprimer l'erreur
$result = mysql_query($getid) ou die('
' . mysql_error() . '
' );

Dans Normal SQL Injection, l'attaquant peut voir les résultats de l'erreur et est facile à identifier et à exploiter.

Injection SQL aveugle

Dans le cas de Blind SQL Injection, lorsqu'une requête malveillante telle qu'un guillemet simple est exécutée, l'erreur de base de données n'est pas affichée sur le 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 cela est donné ci-dessous

$result = mysql_query($getid); // Suppression de 'or die' pour supprimer les erreurs mysql

Dans Blind SQL Injection, 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 SQL aveugle

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

Détection basée sur VRAI et FAUX

L'une des caractéristiques des bases de données, y compris MySQL, est le comportement différent des déclarations True et False. Même si la base de données ne montre aucune erreur, nous pouvons décider d'utiliser les instructions True et False. Considérez le scénario suivant,

La page suivante est vulnérable à l'injection SQL aveugle, lui donner une instruction vraie affichera toutes les entrées de la base de données

1' ou 1=1#

Donner une fausse requête en entrée n'affichera 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 basée sur le TEMPS

Il existe une fonction dans les 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, cela signifie que notre requête est exécutée avec succès et que la page Web est vulnérable à l'injection SQL aveugle.

1' ET dormir(15)#

Il existe une autre fonction chronophage « BENCHMARK » qui peut être utilisée pour retarder la réponse de la base de données

1' ET RÉFÉRENCE(10000000,SHA1(1337))#

La ligne ci-dessus exécutera la fonction SHA1() 10000000 fois dans la base de données, ce qui ajoutera un délai de réponse important.

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

MS SQL : ID=1 ; attendre le délai '0:0:10'-

ORACLE SQL : AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])

PostgreSQL : AND [RANDNUM]=(SELECT [RANDNUM] FROM PG_SLEEP([SLEEPTIME]))

SQLite : AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))

Extraction des informations de la base de données

La première étape de l'extraction de la base de données consiste à déterminer les numéros de colonne dans la base de données. Essayez ensuite de trouver des colonnes vulnérables pour extraire des données supplémentaires.

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

1' commande par 1#

La déclaration ci-dessus est vraie car au moins 1 colonne existe toujours dans une base de données. Essayez maintenant avec un très grand nombre.

1' commande par 10000 #

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

L'instruction 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 n'a que 2 colonnes. Maintenant, nous allons essayer de vider la liste des tables dans la base de données, nous allons utiliser la requête suivante pour cela

1' union all select 1,group_concat(table_name) from information_schema.
tables où table_schema=database()#

Il y a deux tables dans la base de données principale « livre d'or et utilisateurs ». La table « utilisateurs » peut contenir des noms d'utilisateur et des mots de passe. Pour extraire les noms de colonnes de la table, insérez la requête suivante.

1 'union all select 1,group_concat(column_name) de information_schema.
colonnes où table_schema=database()#

Maintenant, nous avons extrait les noms de colonnes, cela inclut les colonnes d'utilisateur et de 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 à l'aide de la requête suivante

1 'union all select 1,group_concat(user,password) from users#

Et c'est ainsi que vous pouvez exploiter l'injection SQL aveugle sans vous fier aux erreurs. Les mots de passe de sortie sont hachés la plupart du temps, ce qui peut être déchiffré à l'aide d'outils tels que John The Ripper ou Hashcat.

Conclusion:

Blind SQL Injection est le type de SQLi qui n'affiche pas les erreurs de base de données ou répond avec un message très générique. C'est pourquoi il est très difficile d'identifier la vulnérabilité Blind SQL Injection dans une page Web. Une fois détecté, vous pouvez l'exploiter facilement par processus manuel ou automatisé à l'aide de SQLmap.

Meilleures distributions Linux pour les jeux en 2021
Le système d'exploitation Linux a parcouru un long chemin depuis son apparence originale, simple et basée sur le serveur. Ce système d'exploitation s'...
Comment capturer et diffuser votre session de jeu sur Linux
Dans le passé, jouer à des jeux n'était considéré qu'un passe-temps, mais avec le temps, l'industrie du jeu a connu une croissance énorme en termes de...
Meilleurs jeux à jouer avec le suivi des mains
Oculus Quest a récemment introduit l'idée géniale du suivi manuel sans contrôleurs. Avec un nombre toujours croissant de jeux et d'activités qui exécu...