attaques par injectoin sql menaces et solutions
Post on 07-Jun-2015
110 Views
Preview:
DESCRIPTION
TRANSCRIPT
Sécurité
Attaques par injection SQL :Menaces et SolutionsLe site sur lequel vous travail lez est écrit en PHP et uti l ise une basede données sous MySQL 4. Cet article vous permets détudier des casd'uti l isation comme l' identif ication d'un uti l isateur, la saisie d'un nouveluti l isateur et la modification d'un compte.
Niveau de difficulté
Cet article explique:. comment explo i ter cet te fa i l le dans un s i te In-
ternet en PHP.
. Comment protéger son code source contre ce
type de fa i l le a insi que sa base de données.
Ce qu'i l faut savoir:. Administrat ion de MySQL.
. Programmation PHP et SQL.
doivent retourner vrai pour pouvoir retourner
un résultat. C'est là que I' injection SQL inter-
v ient , s i nous sais issons 'or 'a ' : 'a ' dans le
champ login et le champ mot de passe, c'est cet-
te requête qui va être exécutée select * from
u s e r w h e r e l o g i - n : ' ' o r ' a t : ' a ' a n d
n a q q w o r r ] = l l ô r t A t = r a t r ' .
Évidement cela marche avec n'importe
quel le condi t ion du moment qu'e l le est
vrale :
r ^ - r 1 l - r 1
t o r t 1 t < ' 2
' o r t b t > t a
t o r t b t < > t a
t o r ' b ' b e t w e e n ' a t a n d ' c
' o r 1 5 1 5 i n ( 1 7 8 9 , 1 5 1 5 , 1 9 8 7 ) #
Comme vous avez pu le constater la requête
retourne le premier enregistrement de la table
qu'elle trouve.
Il y a de forte chance pour que ce soit ce-
lu i de I 'administrateur b ien qu' ic i ce ne soi t
pas le cas.
1 2
3
I'utilisateur vers le formulaire dans le cas con-
traire. Le login saisi est stocké dans la variable
S Posr [ ' login' ] et le mot de passe dans Ia varia-
ble s posr [ 'password' ] . Une identification est
correctesi larequêteselect * f rom user where
l o g i n : " ' . $ _ P O S T [ ' l o g i n ' ] . " ' a n d p a s s w o r d
= " ' . $ P O S T [ ' p a s s w o r d ' ] . " ' , ' r e t o u r n e u n e n -
registrement. Seul à première vue un login et un
mot de passe correct permettent de retourner un
enregistrement. Les expresstons
l o g i n = " ' . $ _ P O S T [ ' J . o g i n ' ] . " '
et
p a s s w o r d = " ' . $ _ P O S T [ ' p a s s w o r d ' ] . " '
Tabf eau 1. Liste des enregistrements
nCag€ ncage@nprod.com
ous al lez voir dans une première
part ie des s i tuat ions non sécur i -
sées pour comprendre le fonct ion-
nement des attaques de type inject ion SQL.
Vous al lez étudier des requêtes de types se-
lect, insert et update. Ensuite, vous allez ap-
prendre comm'nt sécuriser le code source
et la base de données pour éviter ce type
d'attaque.Les données du site que vous al lez étudier
sont stockées dans une table (. . ," .r) ayant
une structure similaire à cel le ci. Le script
correspondant est dans le List ing l . Vous
devrez au préalablement créer une base de
données nornmée injectionsql (par exemple
avec phpMyAdmin ) et la sélectionner avant
d'exécuter le script qui crée la table aser.
Dans une situation réel le les mots de pas-
se doivent être cryptés. Le profil I corres-
pond au profi l de I 'administrateur du site,
le 2 à un profil intermédiaire et le profil 3
à un ut i l isateur lambda.
lnjection dansune requête SELECTVous allez utiliser un formulaire HTM, voir
Listing 2 pour s'identifier. Il enverra les don-
nées saisies à un script PHB voir Listing 3
pour traiter les données. Il vérifie si le login
et le mot de passe sont corrects et redirige
jBi€l jbielEfree.com jessica
paJon
Tjbiel
njbarth jBOrth jbarth@leneuf.com
jm00r€ jmoore@alice.com
nP@jon npajon@wanadoo.com
I
I
NI
jmoore
npajon
Tabfeau 2.Voicile contenu de la page situé à l'adresse
administrator P@SSwOrd administrator@nprod.com
jul ianne
II
Le # permet de mettre des commentaires
dans le SQL tout ce qui le suit n'est pas exé-
cuté. En tapant jbarth + dans le login la re-
quê te dev ien t se lec t * f rom user where
J - o g i n : ' ; b a r t h ' , ' .
En combinant les deux méthodes précédentes,
S l o n t a p e ' o r ' 1 ' : ' 1 ' a n d n a m e = ' j e s s i c a '
and surname='bi -e l - '# , la requête devient :
s e f e c t * f r o m u s e r w h e r e l o g i n = r r o r
r f r _ r 1 ' a n d n a m e = ' j e s s i c a ' a n d
s u r n a m e : ' b i e I ' ;
On se connecte au compte de Jessica Biel.
Maintenant que vous savez comment modi
fier une requête, on peut aller plus loin. L'ins-
truction lilze peut vous permettre de faire des
recherches . La sa is ie de ' j ba r th ' and ma i f
l ike '% Leneuf %' # permet de savoir s i I 'u t i l i -
sateur héberge sa messagerie électronique chez
LeNeuf. Ce clui donnc une requête comme:
s e l e c t * f r o m u s e r w h e r e l o g i n = ' j b a r t h '
a n d m a i l 1 j - k e ' ' ; l e n e u f ? ' ;
Si la connexion à son compte est établie, elle
ut i l ise cet te messâger ic.
n p a ' 1 o n ' a n d p a s s w o r d l i k e ' #
passe de npajonpermet de savoir si lc mot de
c()mmence par un n.
n p a j o n ' a n d p a s s w o r d I i k e ' n ô f ' #
permet de savoir si le mot de passe commence
par un n et f in i par un/
n c a g e ' a n d p a s s w o r d l i k e ' C % ' #
teste s i la deuxieme let t re du mot de pas-
s e e s t u n C . L e i n t o o u r f i f e e t l e i n t o
dumpf i le permettent d 'extra i re des enre-
gist rements et les sauvegarder dans un f i -
chier . L ' insert ion de ce scr ipt dans un
c h a m p d e s a i s i e n c a g e ' i n t o o u t f i . l - e'password . r x r ' # c rée râ le f i ch ie r password
contenant à la racine. Il contiendra les infor-
mat ions de la base concernant le login ncage.
On peu t a l l e r p lus l o in , s i on tape
' o r ' 1 ' = ' f i n t o o u t f . i l e ' p a s s w o r d . t x t ' #
www.phpsolmag.org
se sera I'ensemble de la table qui sera enregis-
tré dans le fichierpa ssword. La requête devien-
drait :
s e l - e c t * f r o m u s e r w h e r e l o g i n = r ' o r
r 1 r - r f i n t o o u t f i l - e ' p a s s w o r d . t x t ' # ; .
Il suffit d'aller à l'adresse http://localhost/injectionsql/password.txt pour le consulter.
L'ensemble des données des utilisateursy sont lisibles. Les mots de passe n'étant pascryptés apparaissent en clair.
Cependant, ce cas est extrêmement rare,
I'uti l isation d'un outfi le ou d'un dumpfile ne
peut se faire que si vous avez les privilèges de
la gestions des fichiers. Le fichier ne doit pas
déjà exister.
Ces quelques exemples ne sont pas stati-
ques. Vous pouvez les adapter, les améliorer
ou juste s 'en inspirer .
C'est le principe qui compte, ensuite c'est
la connaissance du language SQL qui permet
de faire ce que I'on veut sur une base de don-
nees.
Listing 1. Script SQL de la base de données
# S t r u c L u r e d e l a t a b f e u s e r
# A c réer dans la base de données << in jec t ionsq l >>
CREATE TÀBLE 'user ' i
' i d u s e r ' i n t i 2 ] N O T N U L L a u t o j . n c r e m e n t ,
' l o g j - n ' v a r c h a r t l 2 B ) N O T N U L L d e f a u l t " ,' p a s s w o r d ' v a r c h a r i l 2 B r N O T N U L L d e f a u l t " ,'na i l - ' varchar L 128 i NOT NUIL de fau l t ' ' ,' n a m e ' v a r c h a r i 1 2 8 ) d e f a u l t N U L L ,' s u r n a m e ' v a r c h a r ( L 2 B r d e f a u l t N U L I ,' p r o f i l ' j - n t i 1 1 ) N O T N U L L d e f a u l t ' 0 ' , P R I M A R Y K E y
( ' idUSEr I ) ) TYPE=MYISAM AUTO INCREMENT=7 ;
# Contenu de l -a tab le user
T N S E R T r N T o ' u s e r ' V À r , u E S ( 1 , ' n c a g e ' , ' n c a g € ' , ' n c a g e G n p r o d . c o m ' , ' n i c o l a s ' , ' c a g e ' ,
3 ) ;
I N S E R T I 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 ' ,
' m o o r e t , 3 , ;
T N S E R T r N T o ' u s e r r v A r , u E S i 3 , ' j b j - e 1 ' , ' j B j - € l ' , ' j b i e r @ f r e e . c o m ' , ' j e s s i c a ' , ' b i e r ' ,
3 ) ;
T N S E R T r N T o ' u s e r ' v A r , u E S i 4 , ' n p a j o n ' , ' n P G j o n ' , ' n p a j o n G w a n a d o o . c o m ' , ' n i c o l a s ' ,
' p a j o n ' , 2 \ ;
I N S E R T I N T O r u s e r ' V À J , U E S , 5 , ' ; b a r t h ' , ' j B 0 r t h ' , ' j b a r t h G J - e n e u f . c o m ' , ' j e s s i c a ' ,
' b a r t h ' , 2 ) ;
I N S E R T I N T O ' u s e r ' V A . L U E S i 6 , ' a d m i n j . s t r a t o r t , ' P G $ $ w 0 r d ' , ' a d m i n i s t r a t o r G n p r o d . c o m ' ,
N U L L , N U L L , 1 i ;
Listing 2. Formulaire d'identifrcation en html: h t m f '
< h e a d : '
, t i t l e ' i n j e c t i o n S Q L : : . I d e n t i f i c a t i o n , : / t i t t e r
r , / h e a d '
< b o d y ;
, . . h 1 ' . I d e n t l i i c a t i o n , : / h 1 '
< ! - - L e c o n t e n u d u f o r n u l a i r e s e r d e n v o y é a u s c r i p t i d e n t i f i c a t i o n . p h p - - >
' f o r m a c t i o n = " i d e n t i . f i c a t i o n . p h p " * " 1 5 q 6 = " p o s t " '
L o g i n : - , i n p u t t y p e = " t e x t " n a m e = " . 1 - o g i n ' , t '
, r b r : ' P a s s w o r d : i n p u t t y p e = " p a s s w o r d " n a m e = " p a s s w o r d " > , < . b r : >
. : i n p u t t y p e = " s u b m i t " v a l u e = " V a I i d e r " : .
'1 / f orm>
< r 'bodY>
.- . : 'h tmL.>
Identification
Figure 1. lnterfoce d'identifrcation
S6curité
Listing 3. Script d'identification en php
.: ?php
//Vér i f icat ion que les champs sont renpl is
i f 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 o r d ' I ) ) i
/ / Connect ion au serveur de base de données
$connex ion = mysq l -connect ( " foca lhos t " , r r roo t r r , r r r r ) ;
i f ( $ c o n n e x i o n ) i
/ / Connect ion à fa base de données << in jec t ionsqT >>
mysql_select_db ( " i n j ect i onsqI ", $ connexion ), '
/ / Requete gu i ressor t 1 'enreg i t rement ayant ce Tog in e t ce mot de passe
$ r e q u e t e = " s e l e c È * f r o m u s e r w h e r e l o g i n = ' " . $ _ P O S T " I o g i n ' t " "
a n d p a s s w o r d
t " . $ P O S T I t P a s s w o r d ' I . " t , ' " ;
$ resuf tat= rnysql-query ( $ requete, $connexion ) ;
$ I igne=mysql_fetch_array ( $resultat ) ;
/ / s i aucun enreg is t rement es t re tourné a f f i chage du fo rmufa i re
/ / d ' iden t i f i ca t ion s inon a f t i chage du fo run
i f ( $ I i g n e l ' i d u s e r r : = = r r r r ) i
i n c l u d e l r i n d e x . P h P r ) ;
. e lse r
inc lude i 'Compte .phP ' ) ;
Listing 4. Formulaire d'inscription en html
. : htmf :
. .body
h3 Nouve l u t i l i - sa teur 'h3 : . '
< ! - -Le contenu du fo rnuLa i re sera envoyé au scr ip t AddUset .php- ->
' . fo rm ac t ion="AddUser .php" method="POST"
. . I i ; Iden t i f ian t . : inpu t type=" tex t " name="Log inr ' : ' : l i '
. : l i "Mot de passe. input type=" tex t " name="Password" ' ' 1 i
' : l i I 'NOM I inpu t type=r ' tex t " name="Name" ' : ' l - i '
, t I i : P r é n o m i n p u t t y p e = " t e x t " n a m e = " S u r n a m e " : " : ' L i
. . I i :E -Mai l inpu t type=" tex t " name="Mai - .1 - " ; " : .1 l - i >
. :1 i . . inpu t type="submi t " va lue="Enreg is t re r " " " : 1 i
. fo rm:
body
r h tn l
Listing 5. Ce script enregistre les données saisies dons la base de données
. : lphp
// Connexion au serveur MYSQL
$connex ion = nysq l_connect ( " foca lhos t t ' r " roo t " r " " ) ;
i f t $ c o n n e x i o n ) r
/ / Connexion à la base de données << inject ionsq)
nysgl_select_db ( " in j ect ion sqI ", $connexion ) ;
/ / Insert ion d'un nouvef enregistrement dans - la table user
// par défaut le prof i l est le nunéro 3
$Requete= "ingert into user ( login, paSsword, nane' Surname, mai1, prof i l ) values
( ' " . $ _ P O S T i ' L o g i n ' 1 . " ' , ' " , $ _ P O S T i ' P a s s w o r d ' 1 . " ' , ' " , $ - P O S T I r N a m e ' ] .
" 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 ) ; " ;
$resultat= rysql_guery ( $Requete ) ;
/ / Redirection vers la page d' identi f icat ion
inc lude ( ' index .php ' ) ;
Injection dansune requête INSERTLa saisie d'un nouvel uti l isateur se fait à tra-
vers un formulaire en HTML, voir Listing 4
qui envoi les données saisies à un script PHP.
Il les insère dans la base de données et redi-
rige I'uti l isateur vers la page d'identification
(List ing 5) .
L'analyse de la requête nous montre que
par défaut, un nouvel uti l isateur a le profil
numéro 3.
L'injection SQL doit nous permettre de
mod i f i e r ce la . S i on tape pc ruz G i t go ld . com ' ,
1) #, dans le dernier champ la requête devien-
drai t :
i n s e r t i n t o u s e r ( 1 o g i n , p a s s w o r d , n a m e ,
s u r n a m e f m a i l , p r o f i l ) v a l u e s
( ' p c r u z ' r ' P c r u Z ' r ' P e n e l o P e ' r ' c r u z ' ,
' p c r u z G i t g o l d . c o m ' , 1 ) ;
Ce qui suit le + n'est pas pris en compte. Pâr
contre si la requête s'était présentée ainsi :
( Q o n r r o t o = r r i n q o r t i n f ô r s ê r s ê t l o o i n = t "v r \ c Y u s L ç
$ P O S T [ ' L o g i n ' ] . " ' , p a s s w o r d = r " .
$ P O S T [ ' P a s s w o r d ' ] . " ' , n u * " = " ' .
$ P O S T [ ' N a m e ' ] . " ' , s u r n a m e : ' " .
S P O S T | ' S u r n a r n e '
I . " ' , m a i l = ' " .
$ P O S T [ ' M a i ] ' I . " ' , P r o f i l = 1 # '
Dans le dernier champ de saisie i l aurait fallut
marquer:
pc ruzG i tgo ld . com ' , p ro f i -L -1 #
pour initialiser le profil à l. La requête devenait
i n s e r t j - n t o u s e r s e t I o g i n = ' p c r u z ' ,
n e c c u r n r r l = t D a r - - n - l - ^ - ^ 1 ^ * - |- - - u L I l l d l l l E - P s l r ç ! u y s ,
s u r n a m e = ' c r u z ' ,
m r i l = r n o r t r z Q i t n n l r l c n m r n r o f i l = ly e ! u ! v r ç Y v f v r v v r r ' t t s !
Injection dansune requête UPDATELa modification d'un utilisateur se fait à travers
un formulaire similaire à celui de I' insertion
mais affiche en plus les données de I'utilisateur,
voir Listing 6. Une fois modifiées ces données
vont être envoyées au Listing 7 qui va modifier
I'enregistrement correspondant dans la base de
données.
Comme pour I'insertion, vous pouvez modi-
fier le profil en tapant cette fois ci :
pc ruzGJ . tgo ld .com ' , p ro f i l =1 where
i d u s e r = ' " . 9 P O S T [ ' i d ' ] . " ' #
dans le dernier champ. On peut modifier le
profil d'une autre personne dont on connaît le
nom et le prénom :
npajonGwanadoo.com', prof iJ-=1 where
name=rn ico fas ' and su rnams= 'pa jon ' #
06/2007
rendra I 'ut i l isateur administrateur. La cré-
dibil ite des informations laissées par un uti-
l isateur peut être mesurée grâce à son indi-
ce de confiance laissé par les visiteurs du si-
te. Rajoutez un champ indice dans la base de
données.
ALTER TABLE user ÀDD indrce int(3) DEFAULT
0 NOT NULL AFTER surname;
L'insertion de ce script dans le dernier
champs incrémentera le score de 54 unités,jbiel@wanadoo.com,
i n d j - c e = i n d i c e + 5 4 w h e r e n a m e = ' j e s s i c a '
a n d s u r n a m e = ' b i e l - ' #
Au lieu d'insérer des morceaux de code dansles champs de saisie rien ne vous empêchede modifier une url comme celle ci : http://mo n sit e. net/in d ex. phpT p a ge : me mb re &, id : 1 5.Vou s pouvez éc ri re htt p //monsit e. net/index. p hp 7pa ge :membrek id: I or Lo gin:' administrator' . D emême certains sites utilisent des cookies pouréviter d'avoir à toujours se reloguer. Eux aussipeuvent être modifiés.
Sécuriser la base de donnéeVous al lez commencer par sécur iser au ni -
veau de la base de données. En effet si quel-
qu'un réut i l ise la base de données pour déve-
lopper une autre appl icat ion, e l le sera déià
sécurisée. Commencezpar créer un util isateur
userdbisql qui ne pourra qu'accéder à la base
de données injectionSQl. Pour cela dans php
MyAdmin allez dans localhost, privilèges, ajou-
tez un util isateur :
. Nom utilisateur : userdbisql;
. Serveur: localhost;
. Mot de passe: user;
Décochez tous les privilèges globaux, puis cli-
quer sur exécuter.
Dans le cadre Priuilèges spécifiques à une base
de données sélectionnez la base injectionSQl
et cochez les privilèges select, insert et update.
Privilèges spécifiques à une table per-
mettent de spécifier des privilèges sur des
champs d 'une table chois is af in d 'empêcher
leur lecture, de leur insérer une valeur ou
leur modification. Dans le code source il va
falloir remplacer ces lignes :
9connexion = mysql connect
( " 1 o c a 1 h o s t " , " r o o t " , " " ) ; p a r c e J - 1 e
c i , $ c o n n e x i o n = m y s q l c o n n e c t ( " l o c a J -
h o s t " , " u s e r d b i s g l - " , " u s e r " ) ;
Afin de ne plus avoir à sbccuper du profil dansla requête
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 . ' ^ r d m : i Iy o J J w u ! u r l l d r r r E , r u r r r q r L r s , r r o a f ,
www.phpsolmag.org
Listing 6. Formulaire de modifrcation d'un utilisateur
< html)-'
<body>
< h 3 > M o d i f i c a t i o n u t i l l s a t e u r < : / h 3 >
<- ?php
$ c o n n e x i o n = m y s q l c o n n e c t ( " 1 - o c a I h o s t " , " r o o t " , " ' , ) ;
i f { $ c o n n e x i o n )
I
m y s q l _ s e l e c t _ d b ( " i n I e c t i o n s q l " , g c o n n e x i o n ) ;
/ / R e c h e r c h e d e ) ' e n r e g i s t r e m e n t à n o d j f i e r
$ r e q u e t e = " s e l e c t * f r o m u s e r w h e r e i d u s e r = " ' . $ P O S T i ' i d , I . " ' ; " ;
$ r e s u l t a t = m y s q l _ q u e r y ( g r e q u e t e , $ c o n n e x i o n ) ;
$ I igne=rnysql_fetch_array ( $ resu I ta t ) ;
a ' >
< ! - - L e c o n t e n u d u f o r n u L a j r e s e r a e n v o y é a u s c r i p t l J p d a t e u s e r . p h p - - >
( f o r m a c t i o n = " U p d a t e U s e r . p h p " m e t h o d = " p O S T ' , - '
: : iphp
( . 1 i . , " - i n p u t t y p e = t s u b m i t ' v a f u e = ' M o d i f i e r ' ) { i ' f i )
< , , f ormt . ,
t : 'body:
< r h t m l >
Listing 7. Ce script enregistre en base de données les modifrcations.r ?php
$ c o n n e x i o n = m y s q l c o n n e c t ( " l o c a l h o s t " , " r o o t " , , " ' ) ;
i f ( $ c o n n e x i o n ) {
mysq l_se lec t_db ( " in j ec t ionsq l " , $connex ion ) ;
/ /Uod i f i caù ion des chanps d 'un enreg is t rement dont l - ' j d es t dans le where
$ R e q u e t e = " u p d a t e u s e r s e t l o g i n = ' " . $ _ P O S T i ' L o g i n ' ] . " ' , p â s s e J o 1 6 [ = r " .
$ _ P O S T i ' P a s s w o r d ' I . " ' , n a * " = " ' . $ P O S T I ' N a m e ' I . ' , ' , s u r n a m e : " ' .
$ _ P O S T i ' S u r n a m e ' . . " ' , m a i l = " ' . $ _ P O S T i ' M a i l ' j . " ' , p r o f i l = 3 w h e r e
i d u s e r = " ' . $ P O S T | ' i d ' i . " ' ; " i
$ resu l ta t= mysq l_guery ($Requete) ;
i n c l u d e ( ' i n d e x . p h p ' ) ;
Listlng S.Script d'identification en php
<?Php
s e s s i o n s t a r t O ;
// vétification que Jes champs sont rernp-lis
i f ( i s s e t ( $ P o S T I r t o g i n ' i ) a n d i s s e È ( $ - P o S T [ ' p a s s w o r d ' ] ) )
/ / Véri l icat ion de la val idité des champs on protège Les caractères gui pourrait
/ / nuires au fonctionnenent de Ja regueête
if ( !9et_magic_quotes_9pc O )
{$Iog i n=646" lashes ($_POST[ ' log in ' ] ) ;
$password=adds lashes ( $_POSTt 'password ' I ) ;
)else
i
$1og in=$_eosr | ' l og in ' l ;
$password=$_POST I 'Password' I ;
)
$password= nd5 ( $_POST i 'password ' I ) ;
$ requete="se lec t * f rom user where log in= t " .$ log in . " ' and passh lo rd=" ' .
S p a s s w o r d . " ' , ' " ;
$resultat= nysql-Erery ( $requete, $connexionl ;
$ I igne=nrysql_fetch_array ( I resu I tat ) ;
i f ( S l i g n e [ ' i d u s e r ' I = = " " )
{include ( ' index. php' 1 ;
I
e lse
{i nc lude ( ' compte .php ' ) ;
S S E S S I O N T ' u s e r ' I = $ l i g n e [ ' i d u s e r ' ] , '
)
'?>
Lfstlng 9. Script d'identifrcation en php
<?phP
// Ce script sert a se conrecter au serveur MySQL puis à -la base de données
/ / 'injectionsq-l '
l/ Cfasse de connexion
class Connexion {
// r4e. ùode permettant de se connecter à -la base
function connexionBase O {
llvariable de connexion à .La base
Shost = " loca1host " ;
Suser = 'userdbisql";
$passnd = "user' i
556 = "ges t ion_pre ts4" ;
lfCannexian à f{Ysgl
$connexion = mysql-connect ( $host, $user, $Passwd) ;
llCannexion à la àase de donnée concernant le projet
nysql_select_db($bd) or die( ' ,Erreur de connexion à La base de données");
)l
5ÉcurltÉ
p r o f i l ) v a l u e s ( ' " . S P O S T [ ' L o g i n ' ] .
i " , " ' . g P o s r [ ' P a s s i o r d ' ] . " ' , " ' . $
P O S T [ ' N a m e ' ] . " ' , ' " . S P O S T I
t s u r n a m e t l . t t t , ' u . $
P O S T [ ' M a i l ' ] . " ' ) ; " ;
Définissez le par défaut à 3. Si le cas se présen-
te, entourez les constantes numériques d'apos-
trophes. MySQL les retraduira en numérique
au moment de les inserer dans la base si il y
a besoin.
ALTER TABLE user CHANGE pro f i l p ro { i l INT(1)
DEFAULT 3 NOT NULL;
MySQL enregistre les utilisateurs du serveur
dans la table user de la base de données mys-
ql.Par concéquent il ne faut en aucun donner
I'accès à cette table voir même à cette base à un
autre utilisateur que root.
Faites attention aux droits que vous accordez
aux utilisateurs les commandes grant permet
d'ajouter des droits et la commande reuohe d'en
supprimer. Ne donnez pas plus de droit que
nécessaire.Vous ajoutez les droits de lecture, insertion
et modification pour I'utilisateur userdbisql.
Ces droits s'appliquent seulement à toutes les
tables de la base injeaionsql.
GRANT SELECT , INSERT , UPDATE
0 N ' i n j e c t i o n s q l ' . *
T O ' u s e r d b i s q l ' G ' L o c a l h o s t ' , '
Cette commande supprime le droit de modi-
fication.
REVOKE UPDATE
O N ' i n j e c t i o n s g l ' . r
FROM ' userdb isq l ' G ' loca lhos t ' , '
La commande sHow cRANTS permet de connai-
tre les privilèges des utilisateurs.
S H O W G R À N T S F O R ' u s e r d b i s q l ' G ' l o c a l h o s t ' ,
affiche les privilèges de I'utilisateur userdbis-
ql. Dans I'invité de commande DOS tapez
firysql -u root, si la connexion se fait sans qu'un
mot de passe vous est demandé tout le mon-
de peut se connecter à votre serveur MySQL.
06/2007
?.' t flflsateur 'userdbisql'@'localhost': Changcr les prlvllèges
Privlèges globaucr ( TrLit,-ot ner / T'-,irt de,, r i I rer )
Veuiiloz ndet qe b6 rnno de piilàgeo uû 4nnâe n eryleio
Adminisûaùon
I cnrrrI suPrRû PRocEss
n nnou! sEvrDoril
Nd.e: Une vehu de 0 (zen) enlln le limile
r r oulRM prn coûn 0
!Àt IrPDrrEs prn roun 0
f,Àt cc$frcrtolts PEn Eom 0
f, r ncER coaotlcrtcilg 0
I ssoc orruÀsrsE LocK TTELES! nrrrnnscrsI ntpltcrrrcr clrnn! RlPLIclrIctf slrw! cRrlrE uslR
f Exéqrdl
spécifiques â une base de données
Brrc dc donnôæ PrMlôgrr
injec[onsql srllcr, II{sERr, ItPDÀrE
Ajouter des pnvrlèges sur cefte base de données.
"Gnnt' Pdvllôg.r ryaclllquc. I unr bDlc ActonNon Non t' S
Entrez unevaleur: ' 0
t Exécuttl
! cnnrz! urzn! DrDrx! DRoPE cRnrr rrrPoRlrY Tlllgg! cnrrrr vrrrI sBor vlrg! cnnrr norrurI urrn nournnfl rscurr
Figure 2.lnterfoce de gestion des privilèges de l'utilisoteur userdbisql
Vous devez définlr un mot de passe pour vo-
t re ut i l isateur root .
Sécuriser I'accès au serveurMettez votre serveur derrière un pare-feu oudans une D}i4Z. MySQL écoute par défautsur le port 3306. I lne doit être accessible quepar les machines autorisées. Pour savoir quelsports sont accessibles vous pouvez scannervotre machine.
La commande te lnet adr serveur 3306
permet de tenter une connexion au serveur
sur le port désigné. Si une connexion est établie
c'est que le port est ouvert.
Filtrer les saisies de l 'uti l isateurAu niveau du code source filtrez toutes lesdonnées saisies par un util isateur. J'uti l ise la
fonct ion addslashes o mais i l ex iste aussi
mysqJ-_real_escape_str ing O af in de proté-
g., dÀ ...*,è.., qr.,i po,rr.rit faire planter
I 'appl icat ion.
Le addslashes O retourne une chaîne,
après avoir protégé par un \ tous les caractè-
res spéciaux, pour être util isée dans une re-
quête SQL.
Ces caractères sont les guillemets sim-
ples ('), guil lemets doubles ("), anti-sla.sà [\)
et NUL (le caractère NULL). Le nom S/za-
quilLe Rashaun O'Neal deviendra Shaquille
Rashaun OVNea/, le \ ne sera pas écrit dans la
base de données.
www.phpsolmag.org
Le mysq l rea l escape_s t r i ng O réa l i se
la même chose que le addst-ashes O mais de-
mande une connexion à la base de données si-
non un messâge d'erreur sera retourné. Seuls
les caractères %o et ne seront pas protégés.
Si la directive PHP magj-c_quotes_gpc €St
déjà activée et que vous utilisez I'une des deux
fonctions précédentes vos données seront prù
tégées par deux fois. La fonction get masic
quotes_gpc O permet de savoir si cette direc-
tive est activée.
Essayez de faire boguer votre application
pour corriger les erreurs. Tèstez la taille des
variables, des champs. Insérez des caractères
spéciaux comme dièses des pourcentages, des
guillemets ou des apostrophes dans les champs
ou les URL dynamiques.
Dans notre cas, si les données sont valides
on se connecte au serveur et à la base avec
I'uti l isateur que I'on a créé avec des droits
restreints.
Crypter les mots de passeEn cas d'infi ltration de votre ordinateur, les
mots de passe conservés en c la i r dans vos ba-
ses de données pourront faci lement être ré-
cupérés et ut i l isés. Pour évi ter cela, ut i l isez
la fonct ion PHP MD5 qui permet de crypter
le mot de passe avant stockage. PHP four-
ni t également la fonct ion SHAI. Le choix
entre les deux fonct ions s 'ef fectuera en
fonct ion de la balance rapid i té/robustesse.
MD5 étant considérée comme plus rapide
alors que SHAl étant réputée comme plus
robuste.
Dans notre script sécurisé (voir Listing 8),
le mot de passe saisie est crypté à I'aide de la
fonction md5. S' i l est assez long, et uti l ise des
chiffres, des majuscules ou encore des carac-
tères comme € ou @, son cassage devrait être
très difficile.
On recherche dans la base de données un
login et un mot de passe qui correspond à ce-
lu i sais i . Si les données sont t rouvées la page
compte s'affiche et une variable de session
est créée s inon on reste sur le formulai re. . .
Util iser des variables de sessionLorsqu'un utilisateur se connecte, une variable
de session est définie. Elle permet d'afficher la
page de compte ou de modification. Sans elle, il
suffirait de connaître l'adresse de la page pour
l'afficheq, de plus l'utilisateur n'est pas obligé
de se reconnecter à chaque fois pour changer de
page. On aurait aussi pu utiliser un cookie, afin
de retenir les paramètres de l'utilisateur. Cette
technique est moins flable car vu qu'ils
sont stockés sur l'ordinateur client, ils peuvent
être facilement modifié s. Le cookie spoofing vise
justement à modifier le contenu des cookies
afin de tromper le système sur son identité par
exemple.
Externaliser le scriptde connexion à la base de donnéesJusqu'à présent vous vous connectiez à la base
dans chaque script pour mettre en évidence la
connexion à la base de données et éviter de ren-
dre complexe I'architecture du site. Cependant
il est plus juste de faire un fichier contenant
une classe comme dans le Listing 9 que I'on
appellera qu'une fois et que I'on ne modifiera
plus. Cela permet d'avoir les paramètres de
connexion à un seul endroit ce qui facilite les
modifications.
ConclusionVoilà, nous espérons vous avoir présenté untour complet du problème. Encore une fois,Vous avez donné que des exemples. Il est tou-jours possible d'améliorer la technique. Nousnous sommes servit d'un système de gestion debase de données MySQL, mais sous Oracle ouMs SQL cela fonctionne aussi. Les sites Inter-net ne sont pas les seules cibles potentielles.Les applications en Java, VB ou C++ peuventégalement être vulnérables si les champs sontpas protégés.
DAVID MICHAUDL'outeur est étudiant en informotique de gestion.
ll est spéciolisé dans le développement d'opplico-
tion informatique. ll crée des boses de données et
les exploite grâce à des applications lnternet ou ou-
tre qu'ildéveloppe.
top related