Cet article explique comment tester si un site web est à l’abri d’une injection SQL à l’aide de l’outil de test de pénétration SQLMAP.
Qu’est-ce que l’injection SQL ?
L’injection SQL est une technique d’injection de code où un attaquant exécute des requêtes SQL malveillantes qui contrôlent la base de données d’une application web. Avec le bon ensemble de requêtes, un utilisateur peut avoir accès aux informations stockées dans les bases de données. SQLMAP teste si un paramètre ‘GET’ est vulnérable à l’injection SQL.
Par exemple, considérez le segment de code php suivant:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Si l’utilisateur entre « value’) ; DROP TABLE table;- » comme entrée, la requête devient
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
ce qui n’est pas souhaitable pour nous, car ici l’entrée de l’utilisateur est directement compilée avec la requête sql pré-écrite. Par conséquent, l’utilisateur pourra entrer une requête sql nécessaire pour manipuler la base de données.
Où pouvez-vous utiliser SQLMAP?
Si vous observez une url web qui est de la forme http://testphp.vulnweb.com/listproducts.php?cat=1, où le paramètre ‘GET’ est en gras, alors le site web peut être vulnérable à ce mode d’injection SQL, et un attaquant peut être en mesure d’accéder aux informations de la base de données. De plus, SQLMAP fonctionne lorsqu’il est basé sur php.
Un test simple pour vérifier si votre site web est vulnérable serait de remplacer la valeur du paramètre de la requête get par un astérisque (*). Par exemple,
http://testphp.vulnweb.com/listproducts.php?cat=*
Si cela aboutit à une erreur telle que celle donnée ci-dessus, alors nous pouvons dire de manière concluante que le site web est vulnérable.
Installation de sqlmap
SQLMAP est livré pré – installé avec kali linux, qui est le choix préféré de la plupart des testeurs de pénétration. Cependant, vous pouvez installer sqlmap sur d’autres systèmes linux basés sur debian en utilisant la commande
sudo apt-get install sqlmap
Usage
Dans cet article, nous allons utiliser un site web qui est conçu avec des vulnérabilités à des fins de démonstration :
http://testphp.vulnweb.com/listproducts.php?cat=1
Comme vous pouvez le voir, il y a un paramètre de requête GET (cat = 1) qui peut être changé par l’utilisateur en modifiant la valeur de cat. Ce site Web pourrait donc être vulnérable à une injection SQL de ce type.
Pour tester cela, nous utilisons SQLMAP. Pour regarder l’ensemble des paramètres qui peuvent être passés, tapez dans le terminal,
sqlmap -h
Les paramètres que nous utiliserons pour l’injection SQL de base sont montrés dans l’image ci-dessus. Avec ceux-ci, nous utiliserons également le paramètre -dbs et -u, dont l’utilisation a été expliquée à l’étape 1.
Utilisation de SQLMAP pour tester un site web pour la vulnérabilité d’injection SQL:
- Étape 1 : Lister les informations sur les bases de données existantes
Donc, tout d’abord, nous devons entrer l’url web que nous voulons vérifier avec le paramètre -u. Nous pouvons également utiliser le paramètre -tor si nous souhaitons tester le site web en utilisant des proxies. Maintenant, typiquement, nous voudrions tester s’il est possible d’accéder à une base de données. Pour ce faire, nous utilisons l’option -dbs. -dbs liste toutes les bases de données disponibles.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Nous obtenons la sortie suivante qui nous montre qu’il y a deux bases de données disponibles. Parfois, l’application vous dira qu’elle a identifié la base de données et vous demandera si vous voulez tester d’autres types de bases de données. Vous pouvez aller de l’avant et taper ‘Y’. En outre, elle peut demander si vous voulez tester d’autres paramètres pour les vulnérabilités, tapez ‘Y’ par ici car nous voulons tester en profondeur l’application web.
Nous observons que leurs deux bases de données, acuart et information_schema
- Étape 2 : Lister les informations sur les tables présentes dans une base de données particulière
Pour essayer d’accéder à l’une des bases de données, nous devons modifier légèrement notre commande. Nous utilisons maintenant -D pour spécifier le nom de la base de données à laquelle nous souhaitons accéder, et une fois que nous avons accès à la base de données, nous voudrions voir si nous pouvons accéder aux tables. Pour cela, nous utilisons la requête -tables. Accédons à la base de données acuart.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tables
Dans l’image ci-dessus, nous voyons que 8 tables ont été récupérées. Donc maintenant, nous savons définitivement que le site web est vulnérable.
- Étape 3 : Lister les informations sur les colonnes d’une table particulière
Si nous voulons voir les colonnes d’une table particulière, nous pouvons utiliser la commande suivante, dans laquelle nous utilisons -T pour spécifier le nom de la table, et -columns pour interroger les noms des colonnes. Nous allons essayer d’accéder à la table ‘artists’.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Colonnes
- Étape 4 : Extraire les données des colonnes
De même, nous pouvons accéder aux informations d’une colonne spécifique en utilisant la commande suivante, où -C peut être utilisé pour spécifier plusieurs noms de colonnes séparés par une virgule, et la requête -dump récupère les donnéessqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
D’après l’image ci-dessus, nous pouvons voir que nous avons accédé aux données de la base de données. De même, dans ces sites Web vulnérables, nous pouvons littéralement explorer les bases de données pour extraire des informations
Prévenir l’injection SQL
L’injection SQL peut généralement être évitée en utilisant des instructions préparées . Lorsque nous utilisons une instruction préparée, nous utilisons essentiellement un modèle pour le code et analysons le code et la saisie de l’utilisateur séparément. Elle ne mélange pas la requête saisie par l’utilisateur et le code. Dans l’exemple donné au début de cet article, la saisie de l’utilisateur est directement insérée dans le code et ils sont compilés ensemble, ce qui permet d’exécuter un code malveillant. Pour les déclarations préparées, nous envoyons essentiellement la requête sql avec un espace réservé pour l’entrée de l’utilisateur, puis nous envoyons l’entrée réelle de l’utilisateur comme une commande séparée.
Considérez le segment de code php suivant.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
Dans ce code, l’entrée de l’utilisateur n’est pas combinée avec la déclaration préparée. Elles sont compilées séparément. Ainsi, même si un code malveillant est entré en tant qu’entrée utilisateur, le programme traitera simplement la partie malveillante du code comme une chaîne de caractères et non comme une commande.
Note : Cette application doit être utilisée uniquement à des fins de test
Article connexe
Injection SQL de base et atténuation
Referece:stackoverflow.com
Cet article est contribué par Deepak Srivatsav. Si vous aimez GeeksforGeeks et souhaitez contribuer, vous pouvez également écrire un article en utilisant contribute.geeksforgeeks.org ou envoyer votre article par courrier à [email protected]. Voyez votre article apparaître sur la page principale de GeeksforGeeks et aidez d’autres Geeks.