6
Sécurité Attaques par injectionSQL : Menaces et Solutions Le sitesur lequel vous travaillez est écriten PHP et utilise une base de données sous MySQL 4. Cetarticle vous permets détudier descas d'utilisation comme l'identification d'unutilisateur, lasaisie d'unnouvel utilisateur et la modification d'uncompte. Niveau de difficulté Cet article explique: . comment exploitercette faille dans un site In- ternet en PHP. . Comment protéger son code source contre ce type de failleainsi que sa basede données. Ce qu'il faut savoir: . Administration de MySQL. . Programmation PHP et SQL. doivent retourner vrai pour pouvoir retourner un résultat. C'est là que I'injection SQL inter- vient, si nous saisissons '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 user where logi-n:' 'or 'at : 'a' and naqqworr] = l lôr tAt = rat r'. Évidement cela marche avec n'importe quelle condition du moment qu'elle est vrale : r^- r1l - r1 tor t1t <'2 'or tbt > ta tor tbt <> ta tor 'b' between 'at and 'c 'or 1515 in (1789,1515,1987)# 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- lui de I'administrateur bien qu'ici ce ne soit pas le cas. 12 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 correctesilarequêteselect * from user where login: "' . $_POST [ 'login' ] . "' and password = "'.$ POST['password' ] ."',' retourneunen- registrement. Seul à première vue un login et un mot de passe correct permettent de retourner un enregistrement. Les expresstons login="'. $_POST [' J.ogin'] . "' et password = "'.$_POST['password' ] ."' Tabf eau 1. Liste des enregistrements nCag€ [email protected] ous allez voir dans une première partie des situations non sécuri- sées pour comprendre le fonction- nement des attaques de type injection SQL. Vous allez é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éespour éviter ce type d'attaque. Lesdonnées du site que vousallezétudier sont stockées dans une table (..,".r) ayant une structure similaire à celle ci. Le script correspondant est dans le Listing l. Vous devrezau préalablement créer une basede données nornmée injectionsql (par exemple avec phpMyAdmin ) et la sélectionner avant 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- pond au profil de I'administrateur du site, le 2 à un profil intermédiaire et le profil 3 à un utilisateur lambda. lnjection dans une requête SELECT Vous 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 T jbiel n jbarth jBOrth [email protected] jm00r€ [email protected] nP@jon [email protected] I I NI jmoore npajon Tabfeau 2.Voicile contenu dela page situé à l'adresse administrator P@SSwOrd [email protected] julianne II

attaques par injectoin sql menaces et solutions

Embed Size (px)

DESCRIPTION

PHP SOLUTIONS

Citation preview

Page 1: attaques par injectoin sql menaces et solutions

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€ [email protected]

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 [email protected]

jm00r€ [email protected]

nP@jon [email protected]

I

I

NI

jmoore

npajon

Tabfeau 2.Voicile contenu de la page situé à l'adresse

administrator P@SSwOrd [email protected]

jul ianne

II

Page 2: attaques par injectoin sql menaces et solutions

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

Page 3: attaques par injectoin sql menaces et solutions

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

Page 4: attaques par injectoin sql menaces et solutions

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,[email protected],

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 ' ) ;

Page 5: attaques par injectoin sql menaces et solutions

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

Page 6: attaques par injectoin sql menaces et solutions

?.' 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.