begin process at 2010 02 10 01:36:48
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > INJECTION SQL EVITEZ LES FAILLES DANS VOS REQUETTES

INJECTION SQL EVITEZ LES FAILLES DANS VOS REQUETTES


 Information sur le tutoriel

Note :
6,17 / 10 - par 6 personnes
6,17 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10


 Description

Dans le tutorial suivant,je vais vous expliquer ce que c'est les injections SQL, pour connaitre et savoir comment vous protéger.

Tutorial

Injection SQL

Bonjour !

Je m'appel François Gingras. J'écris ici mon premier tutorial. J'ai choisi se sujet tout simplement parce qu'il m'intéresse. Bon fini le blabla et commençons.

Je vais, dans le tutorial qui va suivre, vous donner une formation basique sur les attaques SQL, communément appeler Injection SQL. Il est aussi évident que je vais aussi vous montrez comment vous protéger de ce type d'attaque. Vous pouvez voir dans la table des matières le déroulement de l'article. Il est aussi important de savoir que l'injection SQL est plus fréquente dans les scripts ASP ou JSP, à cause de leur configuration par défaut.

 

Table des matières :

1 . L'injection SQL en gros.

2 . Injection par SELECT / INSERT / UPDATE

3 . Comment se protége

4 . Conclusion / Référence

 

1. L'injection SQL en gros

Une injection SQL consiste à lire, écrire ou même supprimer des données. À première vue, nous pouvons penser que le plus grave est la suppression mais en fait les 3 sont aussi dangereux les un des autres, car si on peu lire, éventuellement, nous pourrons écrire si nous avons accès aux codes administratifs et encore supprimer. 

Premier exemple, un administrateur configure mal un formulaire d'authentification. Quand l'utilisateur envoie les données, la requête SQL devrait ressembler à ça : 

SELECT uid FROM members WHERE account='$var_login' AND password='$var_password'   

Si nous prenons par exemple le login Terri et le password Monkey nous avons une requête qui ressemblera à :

SELECT uid FROM members WHERE account='Terri' AND password='Monkey'

Mais si le pirate décide de mettre le login : ' OR 1=1  et la même chose dans le password la requête va devenir :  

SELECT uid FROM members WHERE account='' OR 1=1 AND password='' OR 1=1

La requête va prendre le premier compte de la liste (UID 1) et va renvoyer TRUE car 1=1. Alors le pirate va être sur le compte sans avoir le mot de passe. Disons que cet exemple est un peu tiré par les cheveux, mais il illustre bien le principe d'une injection SQL. En passant, le nombre de chance que vous trouvez une situation du genre est de 1 sur 1 000 000. Cet exemple est aussi valide si le pirate veut prendre un compte précis. Il suffit de mettre le login désiré et comme mot de passe : ' OR 1=1 ce qui va renvoyer TRUE.

 

2. Injection par SELECT / INSERT / UPDATE

Voici les 3 principales commandes du SQL. SELECT sert à récolter les données, INSERT sert à insérer des données dans une table existante et UPDATE sert à mettre à jour une ou des données entrées. Je ne vais pas entrer dans les détails des formulations des requêtes SQL car ce n'est pas le but de l'article et je considère que vous connaissez déjà le SQL.

 

2.1 SELECT

SELECT est le plus utilisé, car il sert à consulter la base de donnée. Il sert par exemple à l'authentification d'un compte ou encore la recherche d'information dans une BD (Base de Données). Le but principal d'une attaque SQL de base est que la requête renvoie vrai même quand c'est faux. Comme l'exemple plus haut il existe plusieurs façons de rendre une requête vraie. Voici une petite liste :

SELECT * FROM table WHERE 1=1
SELECT * FROM table WHERE 'uuu'='uuu'
SELECT * FROM table WHERE 1<>2
SELECT * FROM table WHERE 3>2
SELECT * FROM table WHERE 2<3
SELECT * FROM table WHERE 1
SELECT * FROM table WHERE 1+1
SELECT * FROM table WHERE 1--1
SELECT * FROM table WHERE ISNULL(NULL)
SELECT * FROM table WHERE ISNULL(COT(0))
SELECT * FROM table WHERE 1 IS NOT NULL
SELECT * FROM table WHERE NULL IS NULL
SELECT * FROM table WHERE 2 BETWEEN 1 AND 3
SELECT * FROM table WHERE 'b' BETWEEN 'a' AND 'c'
SELECT * FROM table WHERE 2 IN (0,1,2)
SELECT * FROM table WHERE CASE WHEN 1>0 THEN 1 END

Référence : Voir chapitre 4

Maintenant, je vais vous montrer une des principaux principes de l'injection SQL, les commentaires. Le caractère # fait que le reste de la requête (après le #) est ignorer par la DB. Les caractères /* et */ mettrons tout ce qu'il y a entre les 2 en commentaire. Par exemple, vous entrez le login : Terri'# 

SELECT * FROM membres WHERE account='Terri' #  ' AND password='$var_password'

Alors il va prendre le compte Terri en ignorant le mot de passe. C'est encore une injection plutôt rare. J'ai oublié de mentionner que les attaques SQL demande de la patience et de la persévérance mais je ne suis pas ici pour vous montrer comment démolir un site, mais plutôt pour vous protéger en les évitants. 

Avec de l'imagination et une bonne connaissance du SQL vous pouvez récupérer le compte et mot de passe de l'administrateur si le site est mal protégé. Mais comme je l'ai dit plus haut ce n'est pas facile du tout au contraire car la plupart des sites sont bien protégés. 

Je vais maintenant passer au INSERT et par la suite le UPDATE.

 

2.2 INSERT   

Une requête INSERT est faite pour ajouter des données dans une table existante. Les cas d'injection par INSERT sont plus rares mais il en existe quelques un. Par exemple une requête INSERT peut ressembler à cela :

INSERT INTO membres (login,password,nom,prenom,email,level) VALUES ('$login','$password','$nom','$prenom','$email','$level')

Si le pirate écrit, dans le champ du email, le code suivant : monemail@monsite.com', '1'# la requête deviendra :

INSERT INTO membres (login,password,nom,prenom,email,level) VALUES ('Terri','MonPass','Terri','Terri','monemail@monsite.com',1'# ','$level')  

Alors le pirate aura le level 1 qui peut vouloir dire par exemple : 1=Administrateur, 2= Modérateur et 3=Utilisateur. 

Le problème de ce type d'attaque c'est qu'il faut savoir comment est construit la requête SQL. C'est pour cela que ce genre d'attaque est plus présent dans les systèmes pré faits où le code source est public. Mais il existe des méthodes pour réussir à reconstruire la requête SQL, mais ce n'est pas encore le but de l'article.

 

2.3 UPDATE

Les requêtes UPDATE sont faites pour mettre à jour des données déjà présente dans la DB. Les injections UPDATE sont encore moins présentes que les injections INSERT, mais ça l'existe. 

Nous pouvons trouver des requêtes du genre quand il est temps de changer les informations du compte (mot de passe, email, etc..). Alors une requête pourrait ressembler à cela : 

UPDATE membres SET password='$var_pass',nom='$var_nom',email='$var_email' WHERE id='$id'   

Ici par exemple nous pourrions changer une valeur que nous ne sommes pas supposer changer. Par exemplesi nous inscrivons dans le champ du mot de passe le code suivant : ',level='3 le code deviendrait le suivant. 

UPDATE membres SET password='',level='3',nom='$var_nom',email='$var_email' WHERE id='$id'   

Alors le pirate deviendrait administrateur du site en question. C'est sur que cet exemple est encore tiré par les cheveux car il est rare qu'un site accepte un compte sans mot de passe. Il serait mieux de prendre le champ nom ou encore d'écrire quelque chose de bidon dans le champ avant de faire l'injection. Je vous laisse imaginer les possibilités. 

Je ne voie pas vraiment l'intérêt de s'attarder encore plus sur l?UPDATE car les cas de faille UPDATE sont très rares et encore plus dur à trouver. 

 

3. Comment se protéger

Il est certain de que la protection à 100% contre les injections SQL est quasiment impossible si ce ne l'est pas. Mais je vais quand même vous montrer quelques trucs pour éviter se genre de faille qui peuvent vous faire perdre beaucoup. 

Premièrement, le plus important, filtrer les variables dans les formulaires. Moi personnellement j'utilise une fonction PHP qui me permet de savoir si il a un espace ou tous autres caractères spéciaux non désirés. Il est aussi important de préciser que si vous protéger votre formulaire par une fonction JavaScript un pirate va recopier votre formulaire et exploiter en local rien de plus facile, alors à ne pas faire.  

Il existe aussi la commende 'htmlentities' qui convertie tous les caractères éligibles en entités HTML. Ce qui empêche les attaques Injection et XSS (Cross Scripting) peut être le sujet d?un autre tutorial. 

Mais comme je l'ai dit précédemment, les web masters ne sont pas stupides, ils vont protéger leur site le mieux possible, alors ne vous attendez pas a trouver une faille SQL en 2 temps 3 mouvements.

   

4. Conclusion / Référence   

Pour conclure ce tutorial, il est aussi bon de savoir les autres sortent de failles car si vous n'avez aucune faille SQL il se peu que vous aillez plusieurs failles de types différents. Le pirate ne va pas juste chercher les failles SQL mais va aussi tenter de BruteForcer votre FTP par exemple. Je vous laisse sur cette conclusion, peu rassurante, en vous disant qu?il faut mieux filtrer 2 fois les variables plutôt qu?une.

Référence :

http://www.phpsecure.info/v2/article/InjSql.php

 Historique

28 juillet 2006 08:15:05 :
Remplacement des ? par des ' (Aller voir pourkoi ils ont toute ete changer) Et ajour de couleur (La couleur n'a pas ete transferer avec le copier coller de MS Word)
29 juillet 2006 20:29:03 :
changement du titre apret la proposition de f0xi

Commentaires

Commentaire de malalam le 28/07/2006 15:07:26 administrateur CS

Hello,

en voilà un joli tuto.
je n'ai pas tout lu, mais l'ensemble me parait très bien, et je n'ai vu aucune erreur.
Merci (les tutos sont rares).

Commentaire de f0xi le 29/07/2006 13:48:16 administrateur CS

Je suggere la modification du titre du tuto par :
"Injection SQL evitez les failles dans vos requettes"

car le titre pour l'instant evoque l'idée qu'on puisse apprendre a faire des attaques SQL ... et non pas apprendre a les eviter.

bon tuto en tout cas sur le sujet ...
bien que le chapitre 3 soit beaucoup trop cours et peu fournis en exemples ou on aurait pus y voir :
la verification avec les expressions regulieres,
les fonctions de convertions de characteres speciaux (il n'existe pas qu'htmlentities)
le cryptage des données envoyées avec MD5 pour les comparaisons,
la position des elements plus ou moins important en debut ou fin de requette ect...
ect...

Commentaire de bizzard4 le 29/07/2006 20:25:17

Bonjour !

Malalam : Merci pour le compliment :)

F0xi : Je suis d'accord pour le titre moi aussi j'ai esite pour le titre. Je vais le changer a l'instant j'aime ta proposition.

Il est sur aussi que je suis pas expert dans le php et que je ne connait pas toute les possibilitees pour la protection. J'ai tenter d'emglober le tout en disant de filtrer les varaibles. Je vais tenter de faire les modifications adecates durant les prochains jours pour le plairsir de tout le monde et mes connaissances.

Merci pour les commentaires.

Une source de ma creation devrait bientot etre publiee avec un exemple d'injection SQL et comment je me protege.

Commentaire de f0xi le 30/07/2006 04:37:34 administrateur CS

pour te donner une base de recherche :
comme fonction utile en PHP pour faire des systemes de verification protection tu as

Convertions/Remplacement des caracteres :
htmlentities
htmlspecialchars
str_replace
str_ireplace
strtr
eregi_replace
preg_replace
stripcslashes
stripslashes
addcslashes
addslashes

Expressions regulieres :
ereg
eregi
preg_match

Cryptage :
md5
crc32
sha1

Autres :
strlen
str_word_count
str_split
explode
preg_split

et bien sur deux autres qui sont specialement conçue pour cela :
mysql_real_escape_string
mysql_escape_string

Commentaire de bizzard4 le 31/07/2006 07:07:32

Wouahawe jva surement pas tout tutorialise tout ca mais je vais men servir pour la complession du volet Protection
Merci !

Commentaire de bizzard4 le 31/08/2006 20:47:29

Je voie un jolie (1 / 10). J'aimerais que la personne qui a écrit cette note vienne se manisfester pour savoir les motifs.

Merci

(Il est sure que je n'est pas modifié le tutorial par manque de temps. J'ai débuté le CEGEP et il a  beaucoup de travail.)

Commentaire de farzit le 16/09/2006 00:04:27

si l'utilisateur utilise  ' OR 1=1
php va le transformer \' OR 1=1

Commentaire de bizzard4 le 16/09/2006 00:06:10

Pas si ton serveur est vieu ou mal configuré. Il existe encore des failles du genre. Par exemple, dans Php-Nuke une veille version la faille est possible malgré la veriso de PHP.

Commentaire de webdeb le 10/10/2006 10:57:37

>> php va le transformer \' OR 1=1

Faux ! Il faut que les magic_quotes_gpc() du php.ini soient à ON. Si elles sont à off, il faudra les échapper manuellement avec addslashes()

Commentaire de bizzard4 le 10/10/2006 19:32:16

Voila tout est dit :)

Commentaire de kerneltony95 le 28/10/2006 16:04:50

ui magic_quote_gpc() permet de mettre un \ devant les '

addslashes prend en compte quote ("), apostrophe (') et backslash(\)

ex :

  $nom = addslashes($nom);
  $email = addslashes($email);

  # Definition de la requete :
  $query = "INSERT INTO $table ('$nom', '$email');

Commentaire de kankrelune le 08/11/2006 15:37:08

Utilisez mysql_real_escape_string() et non pas addslashes()... addslashes() n'échappe pas les # ou les bytes null (par exemple)... .. .

@ tchaOo°

Commentaire de bizzard4 le 08/11/2006 15:48:37

Pour de vrai !!

J'étais pas au courant du # mais c'es quoi au juste une Byte Null ?

Commentaire de kankrelune le 13/11/2006 17:34:38

Un byte null c'est un byte qui est null... lol... pour faire simple... .. .

var_dump("\0");
var_dump(chr(0));

Les attaques null byte sont assez courante pour exploiter des failles à l'upload ou des failles includes... pour les fonctions qui ne sont pas protégées des données binaire le byte null signifie la fin de la chaine de caractère en cours d'évaluation... ainsi...

include("monfichier.php\0.html");

reviendra à

include("monfichier.php");

Les attaques null byte peuvent aussi servir aux injections SQL bien que ce soit moins fréquent que pour les failles précédament citées... .. .

@ tchaOo°

Commentaire de mrjulien le 27/11/2006 12:38:47

Sans étre négatif et en ne voulant pas étre grossier, je ne vois pas réellement l'intéret de cet articles sachant que le sujet est extrêment documenté, et que l'articles que tu cite, est accompagné d'autres articles qui ont étudiés le sujet sous quasi toutes les formes possibles.

Commentaire de bizzard4 le 27/11/2006 14:03:28

Possible !

Il y aura toujours du monde de meilleur. Cette recherche a seulement un but perosnnel et non profesionnel. Le but était que je comprenne le principe des injections pour protéger mon site web. Après avoir tout rasemblé ce que j'avais comprit j'ai réécrit en tutorial et je l'ai posté.

Commentaire de kankrelune le 08/12/2006 14:36:12

@ mrjulien... donc à se moment là dès qu'un tutos, un article ou un code existe il est inutile de le poster... et bah on va aller loin avec ce genre de raisonnement... je suis d'accord qu'il ne faut pas poster tout et n'importe quoi mais ce genre de piqûre de rappel ne fait pas de mal surtout pour les débutants... .. .

@ tchaOo°

Commentaire de alibaba2212 le 12/12/2006 02:15:50

En gros ce tuto est utile que lorsque magic_quotes_gpc est à off ... ce qui n'est jamais le cas. Donc c'est surtout a titre culurel, sans plus.

Commentaire de xPluton le 19/12/2006 13:37:30

Bonjour à tous,
Il y en a qui sont vraiment de mauvaise foi...
Trés bien ce tuto.

Commentaire de qisbug le 05/03/2007 21:48:50

Intéressant ce tuto ! Je commence à apercevoir ... des choses !

Dis-moi donc comment je peux trouver un moyen de protéger ma base de données ??

Merci

qis

Commentaire de arhitekte le 15/03/2007 18:14:56

Bonjour
Merci pour ce tutoriel que je ne me permettrai de noter car ma connaissance du sql est plutôt légère pour ne pas dire quasi inexistante, j’aimerais juste ajouter un petit point a certains parmi nous qui dans leur post mette il manque ça, il manque ça etc. Je pense que plutôt que de mettre etc. partout se serait mieux de faire évoluer le tutoriel et non la critique en jumelant vos connaissances, je trouve que la communauté anglophone de l’informatique a une approche moins stérile du «moi je » et c’est pour cela que les communautés se mettent vite en place. Par demande que je vous fais à tous Artiste numérique que nous sommes, plutôt que de dire ce qu’il manque mentionnons déjà ce qui est présent et rajoutons le manque et nous verrons ont ira plus vite.

Commentaire de bbeenn007 le 27/03/2007 09:59:22

Bonjour,
j'aime bien ton approche,
par contre pourrais tu mettre stp dans ton tutoriel la fonction de vérification en question stp,
Moi je passe par des expressions régulières pour cela mais j'ai un peu de mal tout de m, c'est pourquoi je suis interessé par ta focntion si tu la rends disponible.
bon php

Commentaire de skt310 le 14/05/2007 14:35:37

Quand une requête fini comme ça (la parenthèse fermante sur la même ligne:
#tout le commentaire)
mysql revoye une belle erreur (en tout cas sur mon serveur!
par contre ceci marche:
#tout le commentaire
)

Commentaire de morrokan le 18/10/2007 15:47:21

merci pour l'effort...

Commentaire de MartinEden le 16/01/2008 12:09:30

Pour ma part, j'utilise des procédure stockées.

Commentaire de REHOBOTH le 20/02/2008 13:50:09

Je pense que l'auteur de ce tuto merite des encouragements ,le mieux pour nous serait de continuer le tuto ,
bravo.....

Commentaire de hip9 le 25/02/2008 23:56:54

Meric pour ton Tuto, c'est vrai que tu ne peux pas tout citer, mais les commentaires sont la pour ajouter des idées.
si quelqu'un pourra expliquer plus le sujet et les techniques de protection  contre ces attaques, ca serai bien de partager sont savoir.
merci a tous.

Commentaire de 001hoyem le 21/04/2008 15:50:41

j'ai une problemes  avec la requete de mise ajour

Commentaire de cochise75 le 25/08/2008 11:23:37

Bonjour,
Personnellement je vous que vous conseille de consulter la documentation PHP de la fonction mysql_real_escape_string() que vous pourrez consulter ici :
http://fr3.php.net/function.mysql-real-escape-string
En particulier l'exemple 3 qui traite tout particulièrement des injections et de la façon de les prévenir.
Cordialement.

Commentaire de coloneloneil le 06/09/2008 07:57:40

Excellent petit tuto, qui sera bon de rappeler avec le passage à php6 car ca sera la fin théorique des magiques quote me semble t-il ^^

Commentaire de bizzard4 le 06/09/2008 20:05:18

Effectivement, il ne faut surtout pas oublier la date de publication du tutorial 2006 ...
Il n'est plus à jour et il serait bien d'en faire un nouveau

Commentaire de lycanges le 20/01/2009 14:58:11

je trouve ton tutorial plutôt bien, je te remercie

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,062 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales