Bonjour,
Aujourd’hui je vais vous montrer comment éviter que
son application web ou son site web ne soit victime d’attaques par injection
SQL (Structured Query Langage).Tout d’abord
Qu’est ce qu’une attaque par injection SQL ?
Une attaque
par injection SQL consiste à insérer dans des champs de saisies qui
interagissent avec une base de données (généralement des formulaires d’authentification
d’utilisateurs de l’application web, ou même encore des formulaires d’inscription
de nouveaux utilisateurs) du code SQL non prévue par le développeur de l’application,
entrainant ainsi un comportement imprévisible de l’application, ceci pourrait être
exploité par une personne à des fins malveillantes (usurpation de comptes, vol
d’informations privées, …).
Par exemple, essayons de faire une attaque par
injection SQL sur l’application web suivante qui vérifie si les informations
(login et password) entrées par un internaute sont valides en faisant une correspondance
avec les informations déjà présentent dans la base de données associée à l’application:
l’application
en question dispose de deux fichiers PHP (Personal Home Page) : un fichier
index.php qui est la page d’acceuil où les utilisateurs entrent leur pseudo et
leur mot de passe et un fichier test.php qui vérifie si les données entrées par
l’utilisateur au niveau du fichier index.php sont présentent dans la base de
données avec laquelle elle communique, si les informations sont valides un
message positif est retourné à l’utilisateur, dans le cas contraire l’utilisateur
est redirigé sur la page d’acceuil (index.php)?,la page d’acceuil est la suivante :
Et la base de données s’appelle « bd_test_blog_jg »
La base de données « bd_test_blog_jg »
contient une seule table ; la table « utilisateur »
j’ai crée deux
utilisateurs dans la table et je leur attribué à chacun un mot de passe
Si nous testons l’application en entrant un nom d’utilisateur
valide (jacques goueth par exemple) et son mot de passe (monblog) l’application
réagit comme nous le souhaitons
Tout semble
marcher convenablement, mais que se passe-t-il si une personne entre un code
SQL non prévu par l’application ? par exemple une personne pourrait plutôt
entrer dans la zone de saisie prévu pour un nom ceci :
« ‘ or 1 = 1 -
- » à la place.
Notre application n’étant pas préparé à ce genre de
situation réagira inévitablement en
produisant une erreur du genre :
Et l’erreur engendrée peut être exploité par un
hacker pour diverses raisons. Supposons maintenant que je sois un hacker (ce
que je ne suis pas en réalité) comment je pourrais exploiter la faille de cette
application web ?
Sur ma plateforme KALI LINUX je dispose de plein d’outil
pouvant m’aider à exploiter pleinement l’erreur générée ; l’un de ces
outils s’appel « sqlmap ».
Comment faire ?
Pour commencer lançons notre « terminal »
Et « options » peut prendre plusieurs
valeurs selon ce que l’on souhaite faire, par exemple si l’on souhaite extraire
des informations de la base de données l’on peut entrer la commande « sqlmap
–u « l’url_de_l’erreur » - - dbs »
Et comme résultat, on à les informations sur le
nombre de base de sonnées présentent sur le serveur web où est hébergé la base
de données de notre application « bd_test_blog_jg »
On peut même avoir des informations sur les
différentes tables qui constituent les différentes bases de données, grace à l’option
« - - tables »
Et voilà nos tables
On peut aller encore plus loin et récupérer les
informations privées des utilisateurs de l’application en occurrence ici leur
nom d’utilisateur et leur password :
Et voilà on a obtenu les noms des utilisateurs et leur mot de passe (ps : tiens à préciser que même si les informations avaient été crypté l’outil sqlmap les aurait décrypté quand même, d’où toute sa puissance). On peut encore aller d’avantage mais nous allons nous arrêter là. J’espère simplement que vous avez compris à quel point une erreur de programmation peut avoir des répercussions aussi grande, imaginez qu’une tel attaque réussisse sur une application gérant des comptes bancaires, …
Bien surement que vous vous demandez
Comment se protège-t-on des attaques par injection
SQL ?
Pour ce faire il existe plusieurs méthodes, ici je
ne donne que celles que l’on peut employer directement lors du codage de l’application :
En PHP par exemple il existe des fonctions qui
permettent de se prémunir des attaques par injections SQL : « addslashes() »
et « mysqli_real_escape_string() » qui ajoute un antislash devant
toutes les valeurs qu’on lui passe en paramètres ; pour éviter par exemple
une erreur comme précédemment à la suite
d’un nom du genre « ‘ or 1 = 1 - - », en lui appliquant la fonction « mysqli_real_escape_string() »
on obtient « \’ or 1 = 1 - - », ce qui neutralise l’erreur. On peut également
utiliser des messages d’erreurs personnalisés et non laisser ceux par défaut
fournit avec la fonction « mysql_error() ».
On peut encore avoir recours aux requêtes préparées qui
consiste à la séparation des instructions SQL et des données issues des entrées
des utilisateurs ; l’utilisation des procédures stockées est également recommandée.
Une autre méthode est l’utilisation des Expressions
Régulières (REGEX), si l’on désire par exemple qu’un champ n’accepte que comme valeur
indiqué pour un nom une chaine de caractère on peut entrer l’expression #^[a-zA-Z]+$#
ou bien pour un champ supposé être un numéro de téléphone #^[0-9]+$#
ou encore une adresse email
#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#.
Merci d’avoir suivi le tutoriel jusqu’au bout.
A très bientôt !!!
Merci pour cet article très utile!
RépondreSupprimer