Prosygma UK Prosygma France Prosygma Italie
    
     Accueil     Commander     Clients     Téléchargements     Contacts     I-mode        Offre spéciale
   Hébergement ASP-PHP
      Pack PRO I
      Pack PRO II
      Pack PRO III
   Hébergement .NET
      Pack .NET I
      Pack .NET II
      Pack .NET III
   Revendeurs
      SEMI-DEDIE I
      SEMI-DEDIE II
      SERVEURS DEDIES
   Hébergement divers
     - WEBDEV
     - STREAMING
   Services
      NOM DE DOMAINE
      HTTPS & SSL
      E-COMMERCE
      SQL SERVEUR
      WEBMAIL
      REFERENCEMENT
      E-SAUVEGARDE
   Les + Prosygma
      NOS TARIFS
      LE RESEAU
      ASSISTANCE
      FORMATIONS
   Outils
      WHOIS
      FAQ
      Aide IIS
      Ressource KIT FP
      Composants ASP
     PARTENAIRES
     
     
     

Solutions hébergement
Support et Assistance technique.
 
Imprimer Sauvegarder Ajouter cette page à vos Favoris :-)
  SQL Injection.
  
 
Comment sécuriser les scripts ASP
  Réponse :

 

Introduction

Suite aux nombreuses vulnérabilités de types "sql injection" que l'on a pu rencontrer dans le passé, et que l'on retrouve encore et toujours aujourd'hui, j'ai décidé de vous écrire un petit article pour présenter ce qu'est vraiment une injection sql d'une part, mais nous verrons aussi comment un attaquant peut les utiliser et comment s'en protéger le mieux possible.

Ce type d'attaque vise les serveurs web et plus particulièrement les erreurs de programmation au niveau des scripts asp, cgi, php, etc. Ces mêmes scripts exécutant des requêtes sql... Ce sujet, comme nous l'avons vu auparavant, est assez ancien mais on peut qu'il est toujours resté d'actualité ne serait-ce que suite à l'utilisation abondante du asp et du php. Aussi, pas mal d'articles sur ce sujet ont précéder celui-ci et il est bien entendu que certains n'y verront, pour sûr, que le côté rébarbatif. Mais l'important pour nous, en écrivant cet article est d'expliquer cela par nos propres mots de façon à aider les débutants, et d'adapter ce type de vulnérabilité à l'actualité.

Qu'est qu'une attaque de type sql injection ?

Comme vous le savez certainement déjà, SQL (Structured Query Language) est un language de base de données, celles-ci représentant le coeur de beaucoup d'applications web de nos jours. C'est un language basé sur des requêtes utilisant des instructions telles que INSERT (insertion de données dans la base de données), DELETE (pour en supprimer), UPDATE (pour en mettre à jour), SELECT (pour en sélectionner et lire), et bien d'autres. Mais cette simplicité en fait aussi une proie facile aux détections de failles.

Exemple de reqûete :

SELECT * FROM users WHERE login = 'damien';

Cette requêtes aura pour effet de sélectionner l'utilisateur (extrait de la table "users") dont le login est "damien". "SELECT *" signifiant qu'on sélectionne tous les champs de cette table mais peu importe pour le moment.

Continuons sur cet exemple pour bien vous faire comprendre ce qu'est une attaque de type sql injection (Mon exemple n'étant pas du pur hasard puisqu'une attaque de ce type dans le but de récuperer un mot de passe ou de s'identifier est certainement la plus courante). Maintenant imaginons que ma page contienne un formulaire d'identification utilisateur de ce type :

Login :

Password :



La requête associée à ce formulaire permettant de vérifier que les login / password entrés sont valides par rapport à notre base de données serait :

mysql_query("SELECT * FROM users WHERE utilisateur = '$login' AND motdepasse = '$password'");

Cette requête aurait pour effet de sélectionner l'utilisateur en question si le nom d'utilisateur ET le mot de passe entrés sont dans notre base de données. Si l'un des deux est erroné, la requête ne renverra aucun résultat.

L'attaque en question

Sachant que sur mon exemple la variable $login contient ce que j'ai tapé dans mon premier champ de texte et que la variable $password contient de même ce que j'ai tapé dans le deuxième champ de texte (mot de passe), imaginez ce que cela pourrait donner si j'entrais ceci dans le premier champ de texte



Si nous allons voir ce qui se passe du côté du code, ma requête deviendrait alors :

mysql_query("SELECT * FROM users WHERE utilisateur = '' OR 1=1"); //' AND motdepasse = '$password'");

Et elle permettrait certainement d'identifier car la requête est vraie si un utilisateur "" existe OU si 1=1. Comme il est évident que 1 est égal à 1, elle serait vraie. Le signe "//" signifiant un commentaire en php, le reste serait rendu inutile. il est vria que ma requête est un peu tirée par les cheveux, mais imaginez maintenant que je sache qu'un certain damien est possède les droits administrateurs et que je rentre ceci dans mon champ de texte :



il sélectionnera alors l'utilisateur damien sans se préoccuper du mot de passe en suivant le même raisonnement de précedemment. .

Démonstration d'autres types d'attaques

Dans notre exemple précédent, nous ne faisions que nous identifier et nous aurions très bien pu récuperer un mot de passe de la même façon. Mais ce n'est pas tout ce qu'on pourrait faire avec une injection sql. Maintenant que vous avez compris comment vous "fabriquer" vos propres requêtes, voici quelques exemples de requêtes venant à effectuer des modifications sur les données ou même le système cette fois-ci.

login : ' OR 1=1"); drop table users;

password : n'importe lequel

Celle-ci supprimerait complètement la table users.

login : '; exec master..xp_cmdshell 'net stop firewall'; --

password : n'importe lequel

Sachant que je suis repassé dans une syntaxe sql utilisée sur asp, cette requête ci-dessus aurait pour effet d'exécuter une commande shell "net stop firewall" qui stopperait l'exécution du service "firewall". Et puisque le serveur sql est lancé en tant que SYSTEM par défaut, nous aurions tout à fait ce droit d'arrêt des services.

login : '; shutdown with nowait; --

password : n'importe lequel

Ce dernier exemple aurait pour effet de stopper le serveur sql immédiatement. Ce que j'aurai pu faire aussi avec ma commande shell précédente en spécifiant le nom du service du serveur mysql bien entendu.

Mais ce ne sont que quelques exemples car les possibilités sont nombreuses.

Comment se protéger des attaques par injection sql ?

Comme vous pouvez vous en douter, le seul moyen de prévenir ces attaques se trouve au niveau de la programmation. Si celle-ci est bien réalisée, elles ne sont normalement plus possibles. Alors...quelles sont les règles de programmation à prendre en compte ?

- Tout d'abord, évitez d'utiliser un compte ayant tous les pouvoirs pour l'exécution de votre serveur sql si possible.

- Supprimer les fonctions que vous n'utilisez pas telle que celle que nous avons vu : master..xp_cmdshell, et de manière générale toutes celles commencant par "master..xp".

- Vérifiez les entrées utilisateurs telles que les champs de texte. Vérifiez aussi que les nombres attendus soient bien des nombres avec une fonction telle que IsNumeric() par exemple.

- Vérifiez aussi les paramètres des URL qui sont ajoutables.

- Utilisez les caractères et fonctions d'échappement telles que AddStripSlashes() en php, voir les caractéristiques de la fonction et en général les documentations de vos languages de programmation web pour plus d'infos. Cela empêchera par exemple l'entrée utilisateur du caractère ' en l'échappant à l'aide d'un slash le précédent.

- Vous pouvez aussi empêcher d'une manière générale certaines séquences d'entrées utilisateurs telles que ";", "insert", "select", "//", "--", etc.

- Attention aussi à limiter le nombre de caractères qu'un utilisateur peut entrer dans un champ de texte, car ceci peut fort bien lui compliquer la tâche.

- Pour finir, attention à ce que vous mettez dans les cookies, car un mot de passe (même crypter en md5) est vite trouvé par une attaque de ce type. Et par la suite un remplacement de cette valeur dans le cookie évite à l'attaquant une attaque de type brute force ; c'est donc un joli cadeau.

Conclusion

Nous avons pu voir différents types d'attaques réalisables par injection sql ainsi que des moyens de les prévenir, en espérant que votre vision de la programmation sql aura évoluée du côté de la sécurité, et que vous pourrez vous-mêmes essayer de remédier à ces failles dans vos applications web si besoin est puisque c'est le but.

Volontairement je ne me suis pas attardé sur l'ajout de paramètres dans une URL, qui peut provoquer une injection sql de la même façon car le principe est le même, sauf que les formulaires vulnérables seront des formulaires les plus souvent cachés cette fois-ci.

Voilà...garder en tête qu'aucune application web utilisant une base de données n'est totalement sécurisée si vous ne vous en préoccuper pas.


retour


Nos serveurs sont désormais des serveurs
Pentium 3 Ghz, 1 Go Ram

 La formule de base est à 10 Euros TTC / mois
Si vous avez des besoins plus spécifiques (composants, espace disque...), nous sommes la pour répondre à vos questions.
Rappel : les frais d'installation sont gratuits


Prosygma Hébergeur ASP élu meilleur site.
 
Trois nouveaux composants ASP sont désormais en place sur toutes nos formules.Il s'agit de ASPIMAGE, ASPPOP3 et ASPMAIL.


La dernière version de Microsoft® .NET Framework contient tout ce qu'il vous faut pour faire fonctionner des applications .NET Framework est disponible sur nos serveurs

Cliquez içi pour commander votre hébergement .Net

Votre nom de domaine en .com, .net ou .org au prix unique : 20 Euros

  Vérifiez la disponibilité d'un nom de domaine