Attaquespar injectionSQL:
Menaceset Solutions
Le sitesur lequelvoustravaillezest écriten PHPet utiliseune base
de donnéessousMySQL 4. Cetarticlevouspermetsdétudierdescas
commel'identification
d'utilisation d'unutilisateur, d'unnouvel
lasaisie
d'uncompte.
et la modification
utilisateur
3
correctesilarequêteselect * from user where tor t1t <'2
Vous allez étudier des requêtesde types se- Comme vous avez pu le constater la requête
lect, insertet update.Ensuite, vous allez ap- l o g i n = " ' . $ _ P O S [T' J . o g i n '] . " ' retourne le premier enregistrement de la table
prendre comm'nt sécuriserle code source qu'elle trouve.
et la base de données pour éviter ce type et Il y a de forte chance pour que ce soit ce-
d'attaque. lui de I'administrateur bien qu'ici ce ne soit
Lesdonnéesdu site que vousallezétudier p a s s w o r d = " ' . $ _ P O S T [ ' p a s s w o r d]' . " ' pas le cas.
sont stockéesdans une table (..,".r) ayant
Tabf eau 1. Liste des enregistrements
une structure similaire à celle ci. Le script
correspondantest dans le Listing l. Vous
devrez au préalablementcréer une basede nCag€ ncage@nprod.com
données nornmée injectionsql(par exemple
avecphpMyAdmin ) et la sélectionneravant
T I
jbiel jBi€l jbielEfree.com jessica
d'exécuterle script qui crée la table aser.
Dans une situation réelleles mots de pas-
se doivent être cryptés. Le profil I corres-
n jbarth jBOrth jbarth@leneuf.com
I
pond au profil de I'administrateurdu site,
le 2 à un profil intermédiaire et le profil 3
NI
à un utilisateur lambda. Tabfeau2.Voicilecontenude la pagesituéà l'adresse
3);
permet de savoir si lc mot de passe de npajon I N S E R TI N T O ' u s e r ' V A L U E S 2 , ' j m o o r e ' , , j m 0 0 r € ' , , j m o o r e G a l i c e . c o m ' ,' j u l i a n n e ' ,
c ( ) m m e n c ep a r u n n . 'mooret,3,;
ncage' and password like ' C%' # I N S E R TI N T O ' u s e r ' V A . L U E S i 6 , 'adminj.stratort, 'PG$$w0rd', 'administratorGnprod.com',
'or '1'='f i n t o o u t f . i l e' p a s s w o r d . t x t ' # <!--Le contenu du fornulaire serd envoyé au script identification.php-->
< r'bodY>
.-.:'htmL.>
www.phpsolmag.org
S6curité
Injectiondans
Listing 3. Scriptd'identification en php une requêteINSERT
.: ?php La saisie d'un nouvel utilisateur se fait à tra-
if t i s s e t ( $ P O S T [ ' I o g i n ' ] )a n d i s s e t ( S - P O S T l ' p a s s w oI r) d) ' i qui envoi les données saisies à un script PHP.
$requete="selecÈ * from user where login='".$_POST"Iogin't and password L'injection SQL doit nous permettre de
""
t
".$ P O S T
I
t P a s s w o r d I' . " t , '
" ; m o d i f i e r c e l a .S i o n t a p e p c r u z Gi t g o l d . c o m ' ,
$ resuf tat= rnysql-query ( $ requete, $connexion ) ; 1) #, dans le dernier champ la requête devien-
$ I igne=mysql_fetch_array ( $resultat ); drait :
// si aucun enregistrement est retourné affichage du formufaire
('pcruz'r'PcruZ'r'PeneloPe'r'cruz',
include lrindex.PhPr ) ;
'pcruzGitgold.com', 1) ;
. else r
include i'Compte.phP' ) ;
Ce qui suit le + n'est pas pris en compte. Pâr
contre si la requête s'était présentée ainsi :
en html
Listing 4. Formulaired'inscription $ POST['Password' ] ."', nu*"="'.
'Surnarne'
..body S POST | I ."' , mail='" .
" t r ' " . $ - P o s T i ' s u r n a m e 'I . " ' r t " . $ - P O S T [ ' M a i 1] .' " ' , 3);"; i d u s e r = ' ". 9 P O S[T' i d ' ] . " ' #
n p a j o n G w a n a d o o . c o mp'r, o f i J - = 1w h e r e
n a m e = r n i c o f a sa' n d s u r n a m s = ' p a j o #
n'
06/2007
rendra I'utilisateur administrateur. La cré-
dibilite des informations laissées par un uti- Listing 6. Formulairede modifrcationd'un utilisateur
lisateur peut être mesurée grâce à son indi- < html)-'
A L T E RT A B L Eu s e r À D Di n d r c e i n t ( 3 ) D E F A U L T <-?php
if {$connexion)
champs incrémentera le score de 54 unités, mysql_select_db ( " in I ect ionsql ", gconnexion ) ;
jbiel@wanadoo.com,
//Recherche de )'enregistrement à nodjfier
indj-ce=indice+54 where name=' jessica' $requete="select * from user where iduser="'.$ POSTi'id,I."';";
and surname='biel-'# $ resul tat= mysql_query ( g requete, $connexion ) ;
mettent de spécifier des privilèges sur des $connexion = mysql connect("localhost", "root",,"') ;
champs d'une table choisis afin d'empêcher if ($connexion) {
leur lecture, de leur insérer une valeur ou mysql_select_db (" in j ec t ionsql ", $connexion ) ;
leur modification. Dans le code source il va
falloir remplacer ces lignes : //Uodificaùion des chanps d'un enregistrement dont l-'jd est dans le where
S R ê d r ê t ê = r r i n < a r j - i n f n r r q a r l l n n i n
\ f v Y r r r a
^.ôôr.'^rd
yoJJwu!ur lldrrrE, rurrrqrLrs, rmr :oi a f I ,
www.phpsolmag.org
5ÉcurltÉ
$ p a s s w o r d = a d d s l a s h e s( $ _ P O S T t ' p a s s w o r d ' I ) ;
) MySQL enregistre les utilisateurs du serveur
else dans la table user de la base de données mys-
i ql.Par concéquentil ne faut en aucun donner
$ 1 o g i n = $ _ e o |s'rl o g i n ' l ; I'accèsà cette table voir même à cette baseà un
$password=$_PO
I 'S
PTa s s w o r d I' ; autre utilisateur que root.
) Faitesattention aux droits que vousaccordez
aux utilisateurs les commandesgrant permet
$password= nd5 ($_POSTi'password' I ) ; d'ajouterdesdroits et la commandereuohed'en
$requete="select * from user where login=t".$login."' and passhlord="'. supprimer. Ne donnez pas plus de droit que
S p a s s w o r d ." ' , ' " ; nécessaire.
$resultat= nysql-Erery ( $requete, $connexionl ; Vous ajoutez les droits de lecture, insertion
$ I igne=nrysql_fetch_array ( I resu I tat ) ; et modification pour I'utilisateur userdbisql.
Ces droits s'appliquentseulementà toutes les
if (Sligne['iduser' I=="") tablesde la baseinjeaionsql.
{
include ( ' index. php' 1 ; GRANTSELECT , INSERT , UPDATE
0N 'injectionsql' . *
I
else TO 'userdbisql'G 'Localhost' ,'
{
include (' compte.php' ) ; Cette commande supprime le droit de modi-
S S E S S I O N T ' u s e rI' = $ l i g n e [ ' i d u s e r ' ] , ' fication.
REVOKEUPDATE
)
ON 'injectionsgl' .r
'
'?> F R O M u s e r d b i s q l G' l o c a l h o s t , '
' '
Shost = "loca1host";
'userdbisql";
Suser =
$passnd = "user'i
556 = "gestion_prets4";
lfCannexian à f{Ysgl
)
l
06/2007
'userdbisql'@'localhost': MD5 étant considérée comme plus rapide
?.'t flflsateur Changcrles prlvllèges
alors que SHAl étant réputée comme plus
globaucr
Privlèges ( TrLit,-ot
ner/ T'-,irt
de,,r i Irer) robuste.
Veuiilozndet qe b6 rnno depiilàgeo uû 4nnâe n eryleio Dans notre script sécurisé (voir Listing 8),
le mot de passe saisie est crypté à I'aide de la
Adminisûaùon fonction md5. S' il est assezlong, et utilise des
! cnnrz I cnrrr chiffres, des majuscules ou encore des carac-
Unevehude0 (zen)enlln le limile
Nd.e:
! urzn I suPrR
! DrDrx û PRocEss
r r oulRM prn coûn0
tères comme € ou @, son cassagedevrait être
! DRoP n nnou prn roun0 très difficile.
E cRnrr rrrPoRlrY Tlllgg ! sEvrDoril !Àt IrPDrrEs
! cnrrrr vrrr I ssoc orruÀsrs f,Àt cc$frcrtolts PEnEom0 On recherche dans la base de données un
I sBorvlrg E LocKTTELES f, r ncERcoaotlcrtcilg0 login et un mot de passe qui correspond à ce-
! cnnrr norrur ! nrrrnnscrs
I urrn nournn I ntpltcrrrcr clrnn lui saisi. Si les données sont trouvées la page
fl rscurr ! RlPLIclrIctf slrw
compte s'affiche et une variable de session
! cRrlrE uslR
est créée sinon on reste sur le formulaire...
Externaliserle script
Vous devez définlr un mot de passe pour vo- Le mysql real escape_string O réalise de connexionà la basede données
tre utilisateur root. l a m ê m e c h o s e q u e l e a d d s t - a s h e sO m a i s d e - Jusqu'à présent vous vous connectiez à la base
mande une connexion à la base de données si- dans chaque script pour mettre en évidence la
Sécuriser I'accèsau serveur non un messâge d'erreur sera retourné. Seuls connexion à la base de données et éviter de ren-
Mettez votre serveur derrière un pare-feu ou les caractères %oet ne seront pas protégés. dre complexe I'architecture du site. Cependant
dans une D}i4Z. MySQL écoute par défaut Si la directive PHP magj-c_quotes_gpc €St il est plus juste de faire un fichier contenant
sur le port 3306. Ilne doit être accessible
que déjà activée et que vous utilisez I'une des deux une classe comme dans le Listing 9 que I'on
par les machinesautorisées.Pour savoirquels fonctions précédentes vos données seront prù appellera qu'une fois et que I'on ne modifiera
ports sont accessiblesvous pouvez scanner tégées par deux fois. La fonction get masic plus. Cela permet d'avoir les paramètres de
votre machine. quotes_gpc O permet de savoir si cette direc- connexion à un seul endroit ce qui facilite les
La commande telnet adr serveur 3306 tive est activée. modifications.
permet de tenter une connexion au serveur Essayez de faire boguer votre application
sur le port désigné. Si une connexion est établie pour corriger les erreurs. Tèstez la taille des Conclusion
c'est que le port est ouvert. variables, des champs. Insérez des caractères Voilà, nous espéronsvous avoir présenté un
spéciaux comme dièses des pourcentages, des tour complet du problème. Encore une fois,
Filtrerlessaisiesde l'utilisateur guillemets ou des apostrophes dans les champs Vous avezdonné que des exemples.Il est tou-
Au niveaudu codesourcefiltrez toutesles ou les URL dynamiques. jours possibled'améliorerla technique.Nous
données saisies par un utilisateur. J'utilise la Dans notre cas, si les données sont valides noussommesservitd'un systèmede gestionde
fonction addslashes o mais il existe aussi on se connecte au serveur et à la base avec basede donnéesMySQL, mais sousOracle ou
mysqJ-_real_escape_string O afin de proté- I'utilisateur que I'on a créé avec des droits Ms SQL celafonctionne aussi.Les sitesInter-
g., dÀ ...*,è.., qr.,i po,rr.rit faire planter restreints. net ne sont pas les seulescibles potentielles.
I'application. Les applications en Java,VB ou C++ peuvent
Le addslashes O retourne une chaîne, Crypter les mots de passe égalementêtre vulnérablessi les champssont
après avoir protégé par un \ tous les caractè- En cas d'infiltration de votre ordinateur, les pas protégés.
res spéciaux, pour être utilisée dans une re- m o t s d e p a s s ec o n s e r v é s e n c l a i r d a n s v o s b a -
quête SQL. sesde données pourront facilement être ré-
Ces caractères sont les guillemets sim- cupérés et utilisés. Pour éviter cela, utilisez DAVIDMICHAUD
ples ('), guillemets doubles ("), anti-sla.sà[\) la fonction PHP MD5 qui permet de crypter L'outeur est étudiant en informotique de gestion.
et NUL (le caractère NULL). Le nom S/za- le mot de passe avant stockage. PHP four- ll est spéciolisé dans le développement d'opplico-
quilLe Rashaun O'Neal deviendra Shaquille nit également la fonction SHAI. Le choix tion informatique. ll crée des boses de données et
Rashaun OVNea/, le \ ne sera pas écrit dans la entre les deux fonctions s'effectuera en lesexploite grâce à des applications lnternet ou ou-
base de données. fonction de la balance rapidité/robustesse. tre qu'ildéveloppe.
www.phpsolmag.org