Attaques par injection SQL

I. Introduction à l’injection SQL

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 voir 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é.

II. Explications

1. 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 requête :

Tutorial SQL Injection image



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 :

Tutorial SQL Injection image 2


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.

2. 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 :

Tutorial SQL Injection image 3


Et elle permettrait certainement de s’identifier car la requête est vraie si un utilisateur “” (chaine vide) 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 vrai que ma requête est un peu tirée par les cheveux, mais imaginez maintenant que je sache qu’un certain damien 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 que précédemment.

3. 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êter 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.

4. 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 AddSlashes() en php (voire 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 contourné 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.

III. Conclusion du tutorial

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ême 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à…gardez 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éoccupez pas.

Cet article a été repris d’un autre de mes anciens sites qui est fermé désormais, je trouvais approprié de le remettre ici puisqu’il est toujours d’actualité, même si le tuto date de 2003

Soyez le premier à commenter

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*