Aller au contenu
gaetancottrez.dev

Découvrez les dangers des injections SQL

Published:le  à 20:41 | (6 min de lecture)
Découvrez les dangers des injections SQL

Table des matières

Ouvrir table des matières

Découvrez les dangers des injections SQL

Un de mes collègues Administrateur réseau et système devait réaliser un audit de sécurité de l’infrastructure d’un client.

Cet audit de sécurité avait pour but de déceler des éventuelles problèmes de sécurité au niveau du réseau et au niveau logiciel.

Dans le cadre de cet audit, j’ai été sollicité pour tester la sécurité de leur site Internet en parcourant le site pour trouver de potentielle faille de sécurité et les exploiter :).

Quand on dit “test de sécurité d’un site Internet”, on pense aux injections SQL. Les injections SQL permettent de détourner la nature d’une requête pour arriver à un autre résultat comme récupérer des informations sur la base de données et récupérer des données sensibles qui en temps normal le site Internet ne renvoi pas.

Les injections SQL peuvent être employé via les URL d’un site Internet en passant des paramètres en méthode GET ou en méthode POST via un formulaire mal sécurisé où il est possible par soumission de celui-ci d’exécuter du code SQL. Je m’attarderais donc sur le premier cas ;).

On pourrait s’amuser à tester soi-même des injections SQL sur un site Internet mais il existe des outils qui permettent de faire ses tests de façon automatisée dont un appelé SQLMAP 🔗.

SQLMap est un outil permettant d’effectuer des requêtes SQL de manière automatisée dans le but de trouver et d’exploiter une mauvaise configuration sur votre serveur Web. Cet outil a été développé en Python ce qui le rend portable sur beaucoup de système d’exploitation et il a l’avantage de supporter plusieurs moteurs de base de données (MySQL, Oracle, PostgreSQL, Microsoft SQL Server et bien d’autres).

Je dis votre serveur web car c’est un outil qui permet de vérifier la sécurité de son site Internet et pas celui d’une personne qu’on apprécie peu Smiley clin d'oeil

Cet outil est intégré nativement dans la distribution Linux de l’époque nommé BackTrack 🔗 qui est une distribution orientée test de sécurité car il intègre bien d’autres outils. Maintenant, elle s’appelle Kali Linux 🔗 et c’est la distribution linux que j’utilise au quotidien pour mon privé.

Je me suis basé sur cette distribution pour faire mes tests.

Si vous voulez utiliser l’outil autre que sur Kali Linux, il vous suffit de télécharger l’outil GitHub 🔗 en ayant préalablement installer Python sur votre système d’exploitation.

Pour des questions de confidentialité et de sécurité, je ne citerais pas directement le site Internet sur lequel j’ai exécuté cet outil.

Commençons :

Il faut lancer la commande SQLMAP pour ce faire cliquer sur BackTrack>Exploitation Tools>Web Exploitation Tools>sqlmap :

backtrack1

Vous vous retrouverez avec une console comme celle-ci :

backtrack2

SQLMAP exécute principalement des injections SQL via les URL par méthode GET. La méthode GET est un paramètre que l’on passe par l’URL du genre : http://www.monsite.com/index.php?id=101 🔗. La valeur 101 est passée par méthode GET via le paramètre « id ».

Prenons comme exemple le site http://www.p*******n.net/ 🔗.

backtrack3

Ce site propose des galeries d’images et exécute comme URL  par exemple http://www.p*******n.net/galerie.php?id=9 🔗.

Nous sommes donc sur la galerie 19.

Si on rajoute une apostrophe après le 9, on se retrouve avec un beau message erreur :

backtrack4

Cela indique potentiellement qu’il y a une faille SQL via ce paramètre car l’apostrophe est un caractère utilisé pour entourer les valeurs que l’on passe dans une requête et il se peut que ces mêmes valeurs puissent contenir ces apostrophes, nous dirons donc qu’il faut « échapper » ces caractères pour éviter un erreur SQL ce qui n’est pas le cas ici.

De plus, on voit bien la requête complète et l’erreur en question. L’injection SQL consiste à introduire du code SQL dans un paramètre qui n’est pas censé en recevoir. Ainsi il est tout à fait possible d’introduire à la place de 9 dans l’URL ceux-ci : 9 OR 1=1. Notre galerie s’affiche toujours avec les mêmes photos mais la galerie est maintenant positionnée sur 4 et non plus sur 19 et plus d’erreur SQL :

backtrack5

Sur base de ces tests, il est fort possible que le site en question possède une faille à l’injection SQL via cette URL et son paramètre et nous allons voir comment l’exploiter.

SQLMAP va tenter d’exploiter la faille SQL en lançant diverses commandes et techniques d’injection. Les injections SQL permettent de récupérer le nom de la base de données, le nom des tables, le nom des colonnes et mêmes les données stockées dans celle-ci. Si un serveur Web est mal configuré au niveau des droits de MySQL (ce qui est le cas ici) il est possible de récupérer toutes les bases de données qu’héberge le serveur à partir d’un seul site Internet.

Pour ce faire, il faut lancer cette commande en premier lieu :

python sqlmap.py -u [Nom_du_site_internet_avec_url_et_parametre_get] —dbs

Ce qui donne dans notre exemple :

python sqlmap.py -u http://www.p******n.net/galerie.php?id=9 --dbs

Nous appelons en python le fichier sqlmap.py pour l’url http://www.p******n.net/galerie.php?id=9 🔗. Le « —dbs » veut dire que l’on veut avoir le nom de la base de données.

Dans mon exemple il récupère 396 base de données dont une qui m’intéresse : p******net

backtrack6

Si vous récupérez le nom de la base de données alors vous aurez accès à toute son entièreté.

Pour récupérer la liste des tables qui la compose, il faut exécuter cette commande :

python sqlmap.py -u [Nom_du_site_internet_avec_url_et_parametre_get] -D [nom_de_la_db_recupéré] --tables

Ce qui donne :

python sqlmap.py -u http://www.p******n.net/galerie.php?id=9 -D p******nnet --tables

On obtient ceux-ci :

backtrack7

Si je veux afficher le nom des colonnes de la table alphonse, j’exécute la commande suivante :

python sqlmap.py -u [Nom_du_site_internet_avec_url_et_parametre_get] -D [nom_de_la_db_recupéré] -T [nom_de_la_table_recupérée] --columns

Ce qui donne :

python sqlmap.py -u http://www.p******n.net/galerie.php?id=9 -D p******nnet -T alphonse --columns

backtrack8

La dernière étape consiste à récupérer les données de chaque colonne avec cette commande :

python sqlmap.py -u [Nom_du_site_internet_avec_url_et_parametre_get] -D [nom_de_la_db_recupéré] -T [nom_de_la_table_recupérée] -C [Nom_de_la_colonne_recupérée] --dump

Ce qui donne :

python sqlmap.py -u http://www.p******n.net/galerie.php?id=9 -D p******nnet -T alphonse -C pwd --dump

backtrack9

Hallucinant, pas vrai ?

Ça peut faire peur mais il faut savoir qu’on peut éviter ses problèmes. Déjà éviter d’activer l’affichage des erreurs SQL car oui en créant son site Internet ou en le debuggant ça vous aide mais ça aide aussi la personne malveillante.

Lorsque vous récupérez des valeurs par un formulaire ou par une URL, traiter vos données récupérées en échappant les caractères qui permettent de faire les injections SQL comme les simples quotes. Et si vous le pouvez, encryptez vos paramètres passés en URL et décryptez lorsque vous en avez besoin.

Pour rappel, SQLMAP est un outil pour tester la sécurité de son site Internet.

Si vous l’utilisez à des fins néfastes, ce blog et moi même ne sommes responsables de vos actes concernant son utilisation.

Vous pourriez aussi aimer

NestJS : un framework Backend JavaScript pour réaliser des API

NestJS : un framework Backend JavaScript pour réaliser des API

Comment être productif en programmation ?

Comment être productif en programmation ?

Article précédent
Docker : Pourquoi les développeurs doivent l’utiliser ?
Article suivant
Apprenez comment sécuriser correctement vos formulaires en PHP