Pages

lundi 25 mai 2015

PROTEGER SON APPLICATION WEB CONTRE LES ATTAQUES PAR INJECTION SQL



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 entrons simplement la commande « sqlmap  –u « l’url_de_l’erreur » « options » » : où « l’url_de_l’erreur » correspond à l’url se trouvant dans la barre de navigation
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 !!!

1 commentaire :