Mémoire présenté en vue d'obtenir
Unité d'Enseignement ENG111
« Information et communication
pour l'ingénieur »
Spécialité : Informatique
par
HARRY Guillaume
Les principales failles de sécurité des
applications Web actuelles, telles que recensées par
l'OWASP : principes, parades et bonnes pratiques
de développement.
Soutenu le 17/01/2012
JURY
PRESIDENTE : Nicole LEVY
MEMBRES : Selma BOUMERDASSI, Axel BUENDIA
Table des matières
1. INTRODUCTION
1
1.1 Contexte
1
1.2 Enjeux
2
2. APPLICATIONS WEB
3
2.1 Architecture
3
2.2 Composants du client Web
5
2.3 Composants serveur
6
3. FAILLES DE
SÉCURITÉ
8
3.1 Injection
8
3.2 Cross-Site Scripting (XSS)
10
3.3 Violation de gestion d'authentification et de
session
13
3.4 Référence directe non
sécurisée à un objet
15
3.5 Falsification de requête inter-sites (CSRF)
16
3.6 Mauvaise configuration de sécurité
17
3.7 Stockage de données cryptographiques non
sécurisé
18
3.8 Défaillance dans la restriction des
accès à une URL
19
3.9 Protection insuffisante de la couche transport
20
3.10 Redirection et renvois non validés
21
4. BONNES PRATIQUES
23
4.1 Règles de développement
23
4.2 Configuration des composants serveur
23
4.3 Audit
24
5. CONCLUSION
25
5.1 Constat
25
5.2 Perspectives
25
6. BIBLIOGRAPHIE
26
1. TABLE DES FIGURES
Figure 1 - Transfert des données à
travers la pile de protocoles d'Internet
3
Figure 2 - Pile de protocoles d'Internet
4
Figure 3 - Mode de fonctionnement des applications Web
5
Figure 4 - Mode de fonctionnement des applications Web
2.0
6
Figure 5 - Script SQL de création de la table
« comptes »
8
Figure 6 - Requête SQL pour l'authentification
et affichage du numéro de carte
8
Figure 7 - Script PHP pour l'authentification et
l'affichage du numéro de carte
9
Figure 8 - Requête SQL incluant du code
frauduleux d'injection
9
Figure 9 - Caractères spéciaux
communément utilisés dans les attaques d'injection
10
Figure 10 - Script PHP pour remplacer les
caractères par le code HTML
10
Figure 11 - Principe d'une attaque XSS par
réflexion
11
Figure 12 - Exemple de lien malveillant exploitant une
faille XSS
11
Figure 13 - Script SQL de création de la table
« messages »
12
Figure 14 - Script PHP pour l'insertion dans la table
« messages »
12
Figure 15 - Script PHP pour la recherche dans la table
« messages »
12
Figure 16 - Caractères spéciaux à
remplacer par leur code
13
Figure 17 - Script PHP pour positionner l'attribut de
cookie HTTPOnly
13
Figure 18 - Script PHP pour l'affichage du
numéro de carte
15
Figure 19 - Principe d'une attaque CSRF stockée
16
Figure 20 - Code HTML pour réaliser une attaque
CSRF
17
Figure 21 - Script PHP vulnérable à
l'attaque par traversée de chemin
19
Figure 22 - Script PHP non vulnérable à
l'attaque par traversée de chemin
20
Figure 23 - Script PHP de redirection automatique
21
Figure 24 - Lien pour rediriger l'utilisateur vers une
page malveillante
21
Figure 25 - Exemple de redirection automatique
configurée au niveau du serveur http
22
2.
INTRODUCTION
2.1 Contexte
Comme le relatent K. Hafner et M. Lyon
[1], Internet est né il y a plus de 40 ans. Ce
réseau mondial doit son existence à une agence gouvernementale
civile américaine. L' Advanced Research Projects Agency (ARPA) fut
créée en 1958 par le Président Eisenhower suite au
lancement de Spoutnik en octobre 1957 et à la peur que cet
évènement suscita aux Etats-Unis. L'ARPA avait pour mission de
gérer l'ensemble de la recherche avancée américaine civile
et militaire. L'un de ses services, L' Information Processing Techniques Office
(IPTO) créé en 1962 pour prendre en charge des projets de
recherche et développement en informatique en toute indépendance,
permit l'émergence de nouvelles technologies telles que l'informatique
conversationnelle, le temps partagé, les interfaces graphiques
interactives et la commutation par paquet. Ces travaux ont permis de rassembler
une communauté de chercheurs et ingénieurs en informatique de
l'Université de l'Utah, du Massachusetts Institute of Technology (MIT),
du Stanford Research Institute et de l'Université de Californie à
Berkeley et à Los Angeles. Sous l'impulsion du directeur de l'IPTO
Robert Taylor, cette communauté scientifique a fait naître un
réseau de machines. Le premier lien
ARPANET (ARPA Network) fut
établi le 21 novembre 1969. En 1971, ARPANET comptait 23 hôtes,
111 en 1977 et 213 en 1981. En 1972 l'ARPA tombe sous l'autorité de la
Defense Communications Agency (DCA) et devient la Defense ARPA (DARPA). Bien
que géré par une agence de la défense américaine,
ARPANET continue à être un réseau de la recherche
universitaire, mais intègre petit à petit des sites militaires.
Au fur et mesure de la montée en puissance de ce réseau, le
besoin d'unifier les protocoles de communication se fit sentir. En 1974 les
premières ébauches du protocole TCP (Transmission Control
Protocol) furent publiées. C'est le 1er janvier 1983
qu'ARPANET basculait officiellement sur ce protocole. En 1983, la taille de
l'ARPANET posant des problèmes de coût de maintenance et de
sécurité, la DCA décide de le diviser : l'ARPANET pour la
communauté scientifique et MILNET (Military Network) pour les
données militaires. Parallèlement à la DARPA, la National
Science Foundation (NSF), une agence créée en 1950 pour la
promotion de la recherche fondamentale, s'intéresse à la
création d'un réseau pour le milieu universitaire de
l'informatique et ce dès 1974. Il devait s'étendre sur tout le
territoire américain pour des coups de gestion inférieurs
à ceux de l'ARPANET. La solution fut la création en 1985 d'un
réseau NSFNET auquel s'interconnecteraient les réseaux locaux.
Ainsi chaque boucle locale était financée et gérée
par le campus où elle est localisée, la NSF ne gèrant que
l'épine dorsale. A partir de ce moment les universités ont le
choix de se connecter à l'ARPANET ou à NSFNET. En 1989, l'ARPANET
coûte 14 milliards de dollars à la DARPA alors que NSFNET
était auto-financé par les redevances annuelles et avait un plus
grand nombre d'hôtes. A la fin de cette année la DARPA
décide de ne continuer à financer que MILNET. La fermeture de
l'ARPANET pousse ses acteurs à former des réseaux locaux pour
accueillir les ordinateurs toujours en service et à se brancher à
la toile de réseaux interconnectés par NSFNET. Cette
interconnexion de réseau fit naître le terme anglais
« internetting » puis Internet. En 1994, NSFNET perdit sa
place de colonne vertébrale d'Internet. À la fois les
institutions gouvernementales et les fournisseurs créèrent leurs
interconnexions et liaisons.
En 1984, le CERN adopte l'architecture de l'ARPANET avec le
protocole TCP pour ses échanges internes puis se connecte à
ARPANET en 1990. En 1991, un des chercheurs du CERN, Tim Berners-Lee, cherchant
à mettre à disposition de ses collègues des informations
sur ARPANET, invente les trois principales technologies du Web : les
adresses web, http (
HyperText
Transfer Protocol) et HTML (
Hypertext
Markup Language)
[2]. En
1994, il fonde le
World Wide Web
Consortium (W3C) au MIT
[3]. Ce groupement a pour objectif de créer des
standards et faire des recommandations pour améliorer la qualité
du web.
Bien que les années 2000 aient vu l'explosion de la
bulle Internet et l'arrivée du Web 2.0, les standards ont peu
évolué. Pourtant les développeurs ont réussi
à offrir de l'interactivité avec l'utilisateur et à mettre
à disposition de véritables applications sur le Web. Le W3C
définit les applications Web comme des applications basées sur le
protocole HTTP indépendantes des plateformes et langages
d'implémentation reposant sur des architectures Web. Elles peuvent
interagir avec d'autres applications de type Web ou autres.
2.2 Enjeux
Le Web est devenu un lieu où on peut échanger
des informations mais il est également devenu un marché à
part entière pour la vente et l'achat de biens matériels. Les
acteurs de ce nouveau marché ont besoin de sécurité sous
tous ses aspects, tels que définis par l'ANSSI (Agence Nationale de
Sécurité des Systèmes d'Information) « la
protection de la confidentialité, de l'intégrité et de la
disponibilité de l'information ».
Dans ce contexte, de nombreux organismes ont été
constitués afin de lutter et de prévenir les risques liés
à la sécurité des informations sur le Web.
En France, l'ANSSI est une agence rattachée au
Secrétaire général de la défense et de la
sécurité nationale. Elle met à disposition des guides sur
la gestion des menaces informatiques et des articles sur les recommandations et
bonnes pratiques pour la sécurité des systèmes
informatiques. Le CLUSIF (Club de la Sécurité de l'Information
Français) est une association d'organisations privées et
publiques dont le but est de sensibiliser les entreprises et
collectivités françaises à la sécurité de
l'information.
Aux Etats-Unis, le Web Application Security Consortium (WASC)
est une association constituée d'experts internationaux, d'industriels
et d'organisations du monde Open Source qui publie des recueils de bonnes
pratiques de sécurité pour le Web. L' Open Web Application
Security Project (OWASP) est une association de bénévoles dont
l'objectif est de promouvoir la sécurité logicielle et de
sensibiliser les organisations et les personnes sur les risques liés
à la sécurité des applications Web. Tous les 3 ans, elle
publie le classement des 10 failles de sécurité les plus
dangereuses dans le document «
OWASP
Top 10 ». Dans sa dernière version de 2010, la liste a
été réévaluée afin de prendre en compte les
risques et non plus la danger représenté par ces
vulnérabilités. En effet, les failles sont maintenant
évaluées en fonction de la facilité à trouver la
faille, à attaquer l'application Web par ce biais et du préjudice
que l'attaque peut causer.
Le présent document « Les principales failles
de sécurité des applications Web actuelles : principes,
parades et bonnes pratiques de développement » a pour
objectif de détailler chacune des failles citées dans le document
«
OWASP
Top 10 ». Afin de mieux les comprendre, l'architecture des
applications Web sera abordée dans un premier temps. Dans un second
temps chacune des failles sera détaillée en expliquant l'origine
du problème et en donnant des exemples type d'attaque. Les exemples sont
écrits pour un environnement Apache/MySQL/PHP. Puis des conseils seront
donnés pour se protéger de ce type d'attaque. Et enfin un recueil
de bonnes pratiques permettra de se prémunir contre la plupart des
risques de sécurité dans le développement des applications
Web.
3.
APPLICATIONS WEB
3.1 Architecture
3.1.1 Le réseau Internet et ses protocoles
Comme évoqué précédemment, le Web
repose sur le réseau Internet et comme tous les réseaux
informatiques, il repose sur des couches de protocoles de communication. Le
paquet est l'unité de base de la transmission de données sur
Internet.
L. Shklar et R. Rosen
[2] font la description suivante de la couche de
protocoles pour Internet dont le couple TCP/IP est la fondation :
Figure 1 - Transfert des
données à travers la pile de protocoles d'Internet
La couche « Réseau » est la couche
responsable de la transmission physique des données. Elle peut
être implémentée par les lignes
téléphoniques, par le GSM ou par du réseau Ethernet par
exemple. L'information peut cheminer sur différents supports avant
d'atteindre la destination.
La couche « Internet » est la couche qui
indique où les données doivent être envoyées, sans
garantie que la destination sera bien atteinte. Elle peut utiliser les
protocoles IP (Internet Protocol) et ICMP (Internet Control Message Protocol).
ICMP permet de vérifier que des messages peuvent être
échangés et de gérer les erreurs de transmission. Il est
particulièrement utilisé par des outils tels que
« ping » et « traceroute ». IP est
utilisé pour la plupart des communications sur Internet. Il prend les
données issues des couches supérieures, décrites
ci-dessous, et les divise en paquets de taille
prédéterminée pour faciliter leur transmission sur le
réseau
[4]. Ainsi, si un paquet est corrompu durant la transmission,
il n'est nécessaire de réémettre tout le message, mais
uniquement le paquet. Chaque paquet est transmis individuellement et peut
emprunter un chemin différent des autres. A l'arrivée la couche
Internet réassemble l'ensemble des paquets pour reformer le message
original.
La couche « Transport » repose sur deux
protocoles : TCP et UDP (User Datagram Protocol). TCP s'assure que les
paquets sont reçus dans le même ordre qu'ils ont été
envoyés et que les paquets perdus sont à nouveau envoyés.
TCP est donc un moyen de transmission fiable puisqu'il s'assure que les paquets
sont arrivés. Comme indiqué par G.Florin et S.Natkin
[5], UDP est un protocole simplifié. Cela permet
d'utiliser des moyens de communication à plus faible débit
puisqu'il y a finalement moins d'informations transmises. UDP est
utilisé notamment par NFS (Network File System) et les applications Web
sur smartphone puisqu'elles ne disposent que d'un faible débit.
La couche « Application » est celle qui
permet aux utilisateurs finaux de communiquer sur Internet avec des protocoles
tels que telnet pour agir sur un serveur, FTP (File Transfer Protocol) pour la
transmission de fichiers, SMTP (Simple Mail Tranfert Protocol) pour l'envoi de
courrier électronique et http pour le Web. Http est un protocole de
messages de type texte basé sur le paradigme
« requête/réponse ». L'utilisateur envoie via
son navigateur un message, la requête, au serveur http. Chaque
requête est traitée individuellement et de façon unique.
Ensuite le serveur renvoie un message, la réponse, au navigateur. Http
est un protocole déconnecté, c'est-à-dire que le protocole
ne permet pas d'établir des communications entre requêtes pour
partager des informations, alors qu'une application Web a besoin de conserver
les réponses des différentes requêtes d'un utilisateur pour
avoir le même comportement qu'avec une application non-Web. C'est
pourquoi la plupart des navigateurs intègrent le système de
« cookie » qui permet de conserver le résultat d'une
requête.
Figure 2 - Pile de
protocoles d'Internet
3.1.2 Evolution des architectures applicatives
Les applications Web ont suivi la même évolution
que les applications plus anciennes.
La décennie 1970-1980 était dominée par
le système Mainframe. Un serveur centralisait l'ensemble des
informations, exécutait les traitements, gérait les droits
d'accès. Le client manipulé par l'utilisateur permettait
d'envoyer des demandes de traitement au serveur et d'en afficher les
résultats. La machine était passive. Ce mode de fonctionnement
est le même que celui du protocole http. Le navigateur ne sert
qu'à afficher les réponses http.
La décennie suivante 1980-1990 a vu l'émergence
du système client/serveur. Le client récupérait des
données depuis le serveur de base de données, exécutait
les traitements puis affichait les informations à l'écran et
enfin mettait à jour les données sur le serveur si
nécessaire. Le serveur ne servait plus qu'à stocker les
informations et à exécuter éventuellement des traitements
de nuit. Cette architecture posait des problèmes de maintenance des
applications sur chacun des postes utilisateur concerné. Les
applications Web ont suivi cette évolution avec les
« applets » au début des années 90. Il
s'agissait d'applications écrites dans un langage de
développement, exécutées par le navigateur depuis un site
Web.
A partir des années 90, les architectures
étaient composées de plusieurs tiers. L'application cliente
présentait alors les informations à l'utilisateur et invoquait
des services. Les services étaient responsables de l'exécution
des processus. Les processus pouvaient être distribués sur
plusieurs serveurs. Enfin des serveurs étaient responsables du stockage
des données. Dans le milieu des années 90, les applications Web
ont également intégré plusieurs composants. Le navigateur
Web ne s'occupe plus que de l'affichage. Le serveur http pour répondre
aux requêtes génère dynamiquement l'interface graphique
dans les pages HTML en faisant appel à des services ou en interrogeant
les bases de données.
Depuis les années 2000 les applications Web et les
autres types d'applications clientes peuvent utiliser les mêmes services,
ce qui facilite la réutilisation des développements et
évite la redondance des données.
3.1.3 Web 2.0
J. Governor, D. Hinchcliffe et D. Nickull
[6] expliquent que le Web 2.0 n'est pas une mise à
jour technique mais un changement de comportement des internautes. Comme
évoqué précédemment, le Web avait pour but initial
de mettre à disposition des informations. L'utilisateur était
passif face aux sites Web. Puis le Web est devenu collaboratif, l'utilisateur
est alors devenu créateur de contenu sans avoir à connaître
les protocoles techniques sous-jacents. L'internaute ne consulte plus
l'information, il publie du contenu quel que soit le média (texte,
vidéo, musique). Internet a permis de mettre en relation des ordinateurs
et est devenu le support du Web qui a permis d'y mettre à disposition
des informations. A son tour le Web est devenu le support du Web 2.0 qui a
permis de mettre en relation des personnes.
Ce nouveau comportement a pu naître grâce à
la possibilité de modifier l'interface graphique sans recharger
complètement la page Web. Elle devient en réalité un
conteneur dans lequel il est possible de mettre à jour et de
différencier le contenu, les fonctions, selon la zone de la page.
3.2 Composants du client Web
3.2.1 Le navigateur
Dans les architectures citées
précédemment, le navigateur est une application cliente
[4]. Il permet d'envoyer des requêtes http au serveur
Web et d'en interpréter la réponse. Les navigateurs sont
aujourd'hui capables de travailler également avec le protocole FTP et
d'afficher d'autres formats tels que XML. Il existe plusieurs méthodes
http pour envoyer des requêtes au serveur. Les plus répandues sont
GET, HEAD et POST [2]. GET permet de demander le téléchargement
du contenu d'un document, HEAD permet de n'en récupérer que
l'en-tête et POST permet d'envoyer des informations au serveur pour
traitement. Lorsque l'utilisateur saisit une adresse ou clique sur un lien
hypertexte, le navigateur envoie une requête GET au serveur qui ne
comprend qu'un en-tête. Les requêtes POST ont un corps de message
qui comporte l'ensemble des informations saisies dans un formulaire, alors
qu'avec GET, ces informations sont transmises en ajoutant des paramètres
à l'adresse.
HTML est un langage qui permet de décrire le contenu et
la structure d'une page Web. Il est composé d'environ 50 instructions de
mise en forme. La dernière version rédigée par le W3C en
1999 est 4.01
[7]. La version 5 prévue pour 2012 permettra
d'intégrer et de standardiser toutes les innovations
développées pour compléter version actuelle qui ne permet
pas de représenter des graphiques, de représenter une animation
ou d'interagir avec l'utilisateur. Dans un document HTML, la structure de la
page peut être représentée par un arbre appelé DOM
(Document Object Model).
Figure 3 - Mode de
fonctionnement des applications Web
XHTML est une extension d'HTML basée sur le langage
structuré de description de données XML (eXtensible Markup
Language).
CSS (Cascading Style Sheets) est un complément d'HTML
dont la version 2 actuelle a été développée en
1998. Une feuille de style (style sheet) est un ensemble de règles
à appliquer aux éléments HTML. L'utilisation de CSS permet
de séparer les responsabilités dans la présentation des
données à l'utilisateur. HTML peut ainsi être responsable
du contenu de la page affichée alors que CSS sera responsable de la mise
en page. En modifiant seulement le CSS, il est ainsi possible de modifier
l'apparence d'une application Web. La future version CSS3 est prévue
pour 2012.
RSS (Really Simple Syndication ou Resource description
framework Site Summary) est un format simple pour la syndication de contenu.
C'est un des outils identifié comme faisant partie du Web 2.0. Il permet
de centraliser des liens vers des sites en affichant pour chacun un titre et
une description.
3.2.2 Les scripts
HTML n'offrant pas de comportement dynamique aux pages Web,
les éditeurs ont créé des langages de scripts et des
extensions aux navigateurs.
JavaScript est un langage de scripts inventé en 1995
pour le navigateur Netscape. Il permet de manipuler les objets de l'arbre DOM
et de gérer la réaction à des évènements
générés par les objets de la page. Il permet en fait de
modifier la page HTML sans envoyer de requête http. Bien qu'il existe une
norme ECMAScript gérée par l'organisme de spécifications
ECMA, chaque navigateur a développé son propre
interpréteur, ce qui pose des problèmes de portabilité des
applications Web.
Afin de compléter JavaScript pour permettre de modifier
la page HTML affichée en communiquant avec le serveur http, sans
recharger toute la page, Microsoft a développé en 2002 un nouvel
objet Javascript : XMLHttpRequest. Aujourd'hui la plupart des navigateurs
intègre cet objet. Cela permet de communiquer de manière
asynchrone avec le serveur, ce que ne permet pas actuellement HTML. Ce nouvel
outil a été la base du développement du Web 2.0 et sera
intégré à la future norme HTML 5.
AJAX (Asynchronous Javascript And XML) est un terme
inventé en 2005 par
Jesse
James Garrett. Il ne s'agit pas d'une nouvelle technologie mais d'une
façon d'utiliser conjointement les technologies XHTML, Javascript et
CSS. Les applications Web développées selon le paradigme Ajax
utilisent massivement les requêtes GET pour mettre à jour
l'interface graphique.
Figure 4 - Mode de
fonctionnement des applications Web 2.0
Des éditeurs tels que Macromedia et Microsoft ont
également développé des extensions (plugin) aux
navigateurs comme Flash et Silverlight pour offrir des interfaces plus riches.
Comme le présent document ne traitera pas les failles de
sécurité de ces composants, ils ne seront pas plus amplement
détaillés.
3.3 Composants serveur
3.3.1 Serveurs Web et serveurs d'application
Comme évoqué précédemment, le
navigateur et le serveur communiquent en utilisant le protocole http. Les
serveurs ne sont pas obligés d'implémenter toutes les
méthodes http, seulement GET et HEAD. Bien qu'optionnelle, peu de
serveurs actuels n'implémentent pas la méthode POST.
Sur Internet le navigateur et le serveur http communiquent
rarement directement. Le plus souvent un serveur intermédiaire est
présent : le serveur proxy. Les requêtes à destination
du serveur sont interceptées par le serveur proxy qui peut leur faire
subir un traitement, avant de les retransmettre au serveur. Ce principe est
également appliqué aux réponses. Le serveur proxy peut
servir de cache pour moins solliciter le serveur http. Il est possible de faire
agir plusieurs serveurs proxy en cascade.
La seule fonction du serveur Web étant d'envoyer le
contenu des fichiers au client, des extensions peuvent y être
ajoutées, permettant de faire appel à des services pour
générer dynamiquement les informations à transmettre. Ils
traitent les requêtes http que le serveur http leur a fait suivre,
interprètent et exécutent le code de l'application, puis
génèrent une réponse qu'ils renvoient au serveur http qui
l'enverra au navigateur de l'utilisateur. Si ces services fonctionnent
indépendamment du serveur http, ils sont appelés serveurs
d'applications.
L'extension CGI (Common Gateway Interface) permet
l'exécution d'un programme extérieure appelé
« gateway » dont la sortie standard d'affichage sera
renvoyée au client par le serveur http. Le langage utilisé pour
le développement du programme n'a pas d'importance. Cela peut être
du C++, du Perl ou même Java. Il faut seulement que le programme puisse
être exécuté sur la machine hébergeant le serveur
http.
De même que CGI, l'extension Java Servlet
développée par Sun permet d'intercepter les requêtes, de
générer les réponses pour exécuter des applications
Java. La différence est que la machine virtuelle Java peut être
lancée sur un serveur différent du serveur http. Cette extension
permet de conserver des informations entre les requêtes.
JSP (Java Server Pages) est un langage qui permet
d'insérer des blocs de script basés sur Java dans un contenu
HTML. Les pages JSP sont interprétées et transformées en
Servlet par un serveur d'application pour être
exécutées.
ASP (Active Server Pages) est le concurrent de JSP
développé par Microsoft. Etant basé sur le langage
VBScript, ASP est devenu très populaire dans le milieu des
développeurs Visual-Basic dont il est très proche. Tout comme
JSP, ASP permet d'insérer des blocs de script dans du contenu HTML. Pour
combler les lacunes d'ASP, Microsoft a développé la plate-forme
« .NET » qui permet d'utiliser les autres langages de
développement du monde Microsoft tel que C# pour la
génération dynamique de contenu HTML. L'exécution de code
ASP ou .Net est limitée aux serveurs Windows.
PHP (acronyme récursif pour « PHP: Hypertext
Preprocessor ») est un langage proche de Perl et des scripts Shell,
ce qui en a fait son succès auprès de la communauté du
monde Unix. C'est ce langage qui sera utilisé pour les exemples du
présent document.
3.3.2 Serveurs de données
Les données étant principalement
gérées par des serveurs dédiés, les langages
cités précédemment offrent des moyens d'interagir avec
eux. Les systèmes de gestion de bases de données permettent
d'interroger les données et de les mettre à jour. Le langage le
plus répandu est SQL (Structured Query Language) pour les bases de
données relationnelles. La base de données MySQL sera le moteur
relationnel utilisé pour les exemples du présent document. Le Web
2.0 a apporté de nouveaux besoins auxquels le modèle relationnel
ne peut pas répondre. Les modèles NoSQL (Not Only SQL) ont alors
pu émerger.
Les informations sur les personnes et ressources ainsi que les
informations nécessaires à l'authentification peuvent être
stockées et gérées par des annuaires LDAP (Lightweight
Directory Access Protocol). Il s'agit d'un service qui peut être
interrogé par le protocole LDAP de la couche
« Application ».
Les services Web sont des applications Web dont le but est de
fournir des données selon une structure prédéfinie et des
services à une autre application en utilisant les protocoles standards
d'Internet.
4.
FAILLES DE SÉCURITÉ
4.1 Injection
4.1.1 Principe
L'attaque par injection est évaluée par l'OWASP
comme étant la plus risquée, car la faille est assez
répandue, il est facile de l'exploiter et l'impact peut être
très important. Cela va de la simple récupération de
données à la prise totale de contrôle du serveur. La
victime de l'attaque est un des composants technique de l'application Web.
M. Contensin
[8] explique que pour réaliser une attaque de ce type,
il faut injecter dans les zones de saisie classiques présentées
à l'utilisateur du code malicieux. Ces données seront
interprétées comme des instructions par un des composants de
l'application Web. Les champs de formulaires peuvent être
protégés par Javascript pour vérifier que les valeurs
saisies correspondent à ce qui est attendu. Cependant, J. Scambray, V.
Liu et C. Sima
[9] démontrent qu'il est possible d'outrepasser ces
vérifications en faisant appel à un serveur proxy personnel, par
exemple, qui permettra d'intercepter les requêtes pour les modifier et
envoyer le code malicieux. La difficulté de l'attaque réside
finalement dans la détection des technologies utilisées pour
formuler le code d'attaque adéquat. Cependant, la plupart des
applications Web de gestion de contenu présentes sur le Web sont
basées sur des projets Open Source. H. Dwivedi, A. Stamos, Z. Lackey et
R. Cannings
[10] montrent qu'il est alors facile d'identifier les
technologies employées en parcourant le code source mis à
disposition. De plus, il existe des outils d'injection automatique disponibles
sur le Web, rendant le risque plus élevé. L'exploitation de la
faille devient automatisable.
4.1.2 Exemples
d'attaque
L'attaque par injection SQL consiste à injecter du code
SQL qui sera interprété par le moteur de base de données.
Le code malicieux le plus répandu est d'ajouter une instruction pour
faire en sorte que la requête sous-jacente soit toujours positive. Cela
permet par exemple d'usurper une identité pour se connecter à une
application Web, de rendre l'application inutilisable ou de supprimer toutes
les données de la table visée, voire même de la base de
données complète. L'exemple suivant va interroger une table qui
contient la liste des cartes bancaires enregistrées dans la base de
données de l'application Web d'un site marchand. Le script de
création de cette table est le suivant :
CREATE TABLE IF NOT EXISTS `comptes` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'identifiant', `nom` varchar(30) NOT NULL COMMENT 'nom d''utilisateur', `motdepasse` varchar(41) NOT NULL, `typecarte` varchar(30) NOT NULL COMMENT 'type de carte', `numerocarte` varchar(30) NOT NULL COMMENT 'numéro de carte', PRIMARY KEY (`id`), UNIQUE KEY `nom` (`nom`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
Figure 5 - Script SQL de
création de la table « comptes »
Pour afficher le numéro de carte bancaire,
l'utilisateur doit s'authentifier. La requête SQL suivante permet de
vérifier que le couple utilisateur « user4 »/mot de
passe du compte « eng111 » est correct et si tel est le cas
renvoie le numéro de carte bancaire :
SELECT `numerocarte` FROM `comptes` WHERE `nom` = 'user4' AND `motdepasse` = PASSWORD( 'eng111' )
Figure 6 - Requête
SQL pour l'authentification et affichage du numéro de carte
Le script PHP pour exploiter cette requête de
façon dynamique avec les informations fournies par l'utilisateur est le
suivant :
<?php //connexion a la base de donneesmysql_connect('localhost', 'root', '');mysql_select_db('eng111');//recuperation des parametres$nom = $_GET['nom'];$motdepasse = $_GET['motdepasse'];//generation de la requete$requeteSQL = "SELECT numerocarte FROM comptes WHERE nom = '$nom' AND motdepasse = PASSWORD( '$motdepasse' )";//execution de la requete$reponse = mysql_query($requeteSQL);$resultat = mysql_fetch_assoc($reponse); //affichage du resultatecho $resultat['numerocarte'];?>
Figure 7 - Script PHP pour
l'authentification et l'affichage du numéro de carte
En remplissant le formulaire avec la valeur « ' OR
1=1 -- ' » pour le champ « nom » et n'importe
quelle valeur pour le mot de passe, la requête qui sera envoyée
à la base de données devient :
SELECT numerocarte FROM comptes WHERE nom = '' OR 1=1 -- '' AND motdepasse = PASSWORD( 'x' )
Figure 8 - Requête
SQL incluant du code frauduleux d'injection
Ainsi la condition 1=1 est toujours vérifiée et
le reste de la commande est mis en commentaire grâce à la
chaîne de caractères « -- ». Cela permet donc
de récupérer aléatoirement un numéro de carte.
L'attaque par injection de XPath suit le même principe
que pour SQL
[11]. En effet, XPatch est un langage de requête pour
gérer les données stockées au format XML, comme le fait
SQL pour les bases de données relationnelles. XPath et Xquery, dont
XPath est un sous-ensemble, souffrent donc des mêmes
vulnérabilités face à l'injection de code malicieux.
L'attaque par injection LDAP permet d'accéder à
des informations privées qui sont enregistrées dans l'annuaire
d'entreprise. En modifiant le comportement du filtrage dans la requête
LDAP qui sera générée, il est possible de
récupérer la liste exhaustive des adresses de courrier
électronique d'une entreprise pour les saturer de spam par exemple.
L'attaque par injection de commandes est surtout
principalement possible sur les scripts CGI écrits en Perl, PHP et
Shell. Il est possible de prendre le contrôle du serveur. Il faut pour
cela faire en sorte que la commande initiale soit exécutée sans
problème et ajouter des commandes du système d'exploitation du
serveur qui seront exécutées par le serveur.
L'attaque par traversée de répertoire permet
d'accéder à des fichiers présents sur le serveur. Les
fichiers cibles privilégiés étant ceux contenant des
informations de sécurité comme le fichier des mots de passe ou
les fichiers contenant les clés privées de chiffrement pour SSL
par exemple. Cette attaque est rendue possible si l'application Web inclue du
contenu de fichier en passant l'adresse de ce fichier en paramètres de
la requête.
Les attaques XXE (XML eXternal Entity) sont un
dérivé des attaques par traversée de répertoire.
Les conséquences vis-à-vis des fichiers présents sur les
serveurs sont donc les mêmes. Ce type d'attaque est basé sur la
fonctionnalité de XML « entités externes ».
Les entités sont des substituts pour des séquences d'information.
Elles sont équivalentes aux variables dans les langages de
programmation. Les entités externes permettent de déclarer des
documents dont le contenu sera affiché lors de l'utilisation de
l'entité. Si l'entité pointe sur un fichier existant sur le
serveur, son contenu pourra être divulgué à l'attaquant.
Cette fonctionnalité peut être exploitée en plaçant
un fichier XML au format RSS sur un site et de l'intégrer à un
agrégateur en ligne. Si ce dernier est vulnérable, il sera alors
possible de voir le contenu des fichiers demandés par l'attaquant.
4.1.3 Parade et bonnes pratiques
Les différentes attaques citées
précédemment reposent principalement sur l'utilisation de
caractères spécifiques qui permettent de mettre en commentaire
des portions de code et d'insérer du code frauduleux. Il est cependant
rare que l'application ait besoin d'accepter les caractères suivant.
& ~ " # ' { } ( [ ] ( ) - | ` _ \ ^ @ \ * / . < > , ; : ! $
Figure 9 -
Caractères spéciaux communément utilisés dans les
attaques d'injection
Cependant les applications Web de gestion de contenu comme les
forums doivent les accepter, notamment les forums utilisés par les
développeurs pour partager du code. Dans ce cas, il faut transformer aux
moins les caractères suivants en code HTML avant de les stocker dans la
base de données. L'affichage de l'information ne sera pas
différent pour l'utilisateur, mais les données seront plus
sûres.
Bien qu'un site puisse subir différents types
d'attaques par injection, il suffit de vérifier que les
caractères utilisés sont ceux attendus. Ce contrôle doit
être effectué au niveau du client grâce à JavaScript
et au niveau du serveur lorsque les paramètres sont
récupérés pour fermer la faille de sécurité.
Par exemple MySQL offre une fonctionnalité qui permet de transformer ces
caractères.
<?php$nouvelleValeur=htmlspecialchars($valeurParametre,ENT_QUOTES); ?>
Figure 10 - Script PHP pour
remplacer les caractères par le code HTML
De plus il faut vérifier que les valeurs sont bien du
type et du format attendu (longueur, intervalle de valeur, ...)
L'ANSSI porte une attention particulière aux outils
automatiques d'exploitation des failles SQL dans son bulletin de
sécurité
CERTA-2011-ACT-045.
Pour déterminer si un site est victime de ce type d'agression, il faut
vérifier dans les journaux d'activité du serveur http qu'il n'y a
pas d'évènement inhabituel, tel qu'un nombre de requêtes
http anormalement élevé ou des requêtes ayant pour
paramètres des valeurs inappropriées.
4.2 Cross-Site Scripting (XSS)
4.2.1 Principe
L'OWASP considère la vulnérabilité
à XSS comme une faille critique car elle est très répandue
et facile à détecter. Les attaques s'appuient principalement sur
les formulaires des applications Web. Les victimes sont les utilisateurs des
applications Web vulnérables. L'ANSSI signale dans la note d'information
CERTA-2002-INF-001-001
que les scripts frauduleux peuvent endommager la base de registre de la
victime, afficher des formulaires dont les saisies seront envoyées
à l'attaquant, récupérer les cookies présents sur
la machine de la victime, exécuter des commandes systèmes et
construire des liens déguisés vers des sites malveillants.
Y.-W. Huang, C.-H. Tsai, T.-P. Lin, S.-K. H., D.T. Lee et
S.-Y. Kuo
[12] indiquent que l'attaque XSS est également une
attaque par injection car l'objectif de l'attaquant est de soumettre un code
frauduleux à l'application. A. Kiezun, P. J. Guo, K. Jayaraman, M. D.
Ernst
[13] montrent qu'il existe en fait deux types d'attaque
XSS.
L'attaque XSS par réflexion (reflected XSS) s'appuie
sur le fait que l'application Web affiche ce que l'utilisateur vient de saisir
dans un formulaire dans une page de résultat. Le navigateur de la
victime exécute alors le code frauduleux généré
dans la page de résultat. Tous les champs de formulaire sont donc une
faille de sécurité potentielle que l'attaquant peut exploiter par
XSS. L'attaquant crée un lien déguisé vers l'application
Web dont un des paramètres contient du code JavaScript frauduleux. En
utilisant ce lien, la victime fait exécuter par son navigateur le code
JavaScript. Le Web 2.0 et ses systèmes de gestion de contenu ont
popularisé cette attaque en permettant de publier des liens
aisément et visible sur tout le Web.
Figure 11 - Principe d'une
attaque XSS par réflexion
L'attaque XSS stockée (stored XSS) s'appuie sur le fait
que l'attaquant réussisse à stocker dans la base de
données du code frauduleux qui sera exécuté par la victime
lorsqu'elle tentera d'afficher la donnée malveillante. Cette attaque est
plus dangereuse que la première car le code fait partie
intégrante des données de l'application Web et peut atteindre
plusieurs victimes.
4.2.2 Exemples d'attaque
L'attaque XSS par réflexion peut être
implémentée par différents moyens.
Le plus facile est d'utiliser un moteur de recherche
vulnérable. Par exemple les outils de forum intègrent des
formulaires pour recherche des messages par leur contenu. La page de
résultat reprend généralement les mots clés saisis.
Il suffit alors de mettre comme paramètre de recherche un code
JavaScript qui sera ensuite interprété par le navigateur de la
victime. Pour réaliser cette attaque il suffit de laisser un lien qui
aura pour paramètre le code malveillant.
http://www.forum-vulnérable.com/recherche.php?parametre=<script>alert(`attaque XSS')</script>
Figure 12 - Exemple de lien
malveillant exploitant une faille XSS
En cliquant sur ce lien, la victime lancera la recherche. Puis
le moteur de recherche affichera le paramètre
« <script>alert(`attaque XSS')</script> » qui
sera exécuté par le navigateur.
Des applications Web sont responsables de l'affichage des
courriers électroniques : les webmails. Pour consulter son
courrier, l'utilisateur va préalablement s'authentifier et ses
informations d'identification seront stockées dans des cookies. Un
courrier malveillant peut intégrer du code JavaScript qui sera
interprété par le navigateur. Ce code sera capable de
récupérer les cookies et envoyer les informations à
l'attaquant.
L'attaque XSS stockée injecte du code malveillant dans
la base de données. L'application Web suivante de type forum va
permettre d'illustrer cette attaque. La table support de la
démonstration est la suivante :
CREATE TABLE IF NOT EXISTS `messages` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'identifiant', `numerosujet` int(11) NOT NULL COMMENT 'numero du sujet', `redacteur` varchar(30) NOT NULL COMMENT 'nom du redacteur du message', `message` varchar(4000) NOT NULL COMMENT 'contenu du message', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
Figure 13 - Script SQL de
création de la table « messages »
Le script PHP suivant est responsable de l'enregistrement d'un
message. Comme une des informations saisies (le nom du rédacteur) est
réaffichée, cela implique que ce code est vulnérable
à une attaque XSS par réflexion.
<?php //recuperation des parametres$message=$_GET['message'];$nom=$_GET['nom']; $numsujet=$_GET['numsujet']; //generation de la requete$requeteSQL = "INSERT INTO messages VALUES (NULL, '$numsujet', '$nom', '$message')"; //execution de la requete$reponse = mysql_query($requeteSQL); //affichage du resultatecho "<tr><td> </td><td>Merci $nom de votre participation. Vous venez de saisir : $message</td></tr>";?>
Figure 14 - Script PHP pour
l'insertion dans la table « messages »
En saisissant comme message un code JavaScript malveillant, il
sera enregistré dans la base de données.
Le script PHP suivant est responsable de l'affichage de
l'ensemble des messages d'un sujet.
<?php //recuperation des parametres$numsujet=$_GET['searchsujet']; //generation de la requete$requeteSQL = "SELECT * FROM messages WHERE numerosujet=$numsujet order by id"; //execution de la requete$reponse = mysql_query($requeteSQL); //affichage du resultatecho "<tr><td> Sujet $numsujet</td><td>";while($resultat = mysql_fetch_assoc($reponse)) { echo $resultat['redacteur'] . " : " . $resultat['message'] . "<br>";}echo "</td></tr>";?>
Figure 15 - Script PHP pour
la recherche dans la table « messages »
Lorsque des utilisateurs afficheront le fil des messages, le
message frauduleux sera automatiquement envoyé aux navigateurs et
interprété créant une attaque XSS.
4.2.3 Parade et bonnes pratiques
Les recommandations faites précédemment pour se
prémunir des risques d'injection sont valables pour XSS. Cependant,
transformer les six caractères douteux suivants suffit.
& &< <> >" "' ' (' n'est pas recommendé)/ /
Figure 16 -
Caractères spéciaux à remplacer par leur code
Côté client avec JavaScript il faut
vérifier les données saisies par les utilisateurs.
Côté serveur, il faut vérifier les données
récupérer en paramètre. Il faut rejeter toutes les
données qui ne sont pas conformes à ce qui est attendu.
Pour éviter le vol de cookie par du code JavaScript, il
est possible de positionner l'attribut de cookie HTTPOnly
[10]. S'il est présent, le navigateur interdit au
moteur JavaScript de lire ou écrire dans les cookies. Cet attribut est
très peu utilisé par les applications Web, car tous les
navigateurs ne le gèrent pas. Cependant il est préférable
de l'utiliser car les navigateurs les plus populaires l'implémentent, ce
qui diminue les risques liés aux cookies.
<?php session.cookie_httponly = True?>
Figure 17 - Script PHP pour
positionner l'attribut de cookie HTTPOnly
Les navigateurs intègrent des protections contre XSS en
interdisant l'exécution de code JavaScript qui modifie une page Web
depuis une page Web ne portant pas le même nom de domaine.
4.3 Violation de
gestion d'authentification et de session
4.3.1 Principe
Cette faille de sécurité regroupe toutes les
vulnérabilités pouvant mener à une usurpation
d'identité. Ces points de faiblesse dans les applications Web peuvent
ouvrir à des attaquants des accès à des
fonctionnalités des applications Web auxquelles ils n'ont pas le droit
normalement. Cela peut donc leur permettre de voler des informations ou
d'endommager le bon fonctionnement de l'application. La protection des
accès à l'application repose généralement sur un
système d'authentification. La plupart du temps, le système
d'authentification est redéveloppé pour chaque application, ce
qui implique que ces systèmes ne bénéficient pas de
l'expérience acquise sur le développement d'autres
applications.
Pour comprendre comment les attaques peuvent être
menées, il faut comprendre le mécanisme d'authentification le
plus commun des applications Web.
1. L'utilisateur non authentifié demande l'accès
à une page Web ;
2. Le serveur renvoie une page d'authentification ;
3. L'utilisateur rempli le formulaire en fournissant un
identifiant et un mot de passe et revoie ces informations au serveur
web ;
4. Le serveur web fait appel à un service pour
vérifier la validité du couple identifiant/mot de passe
5. Si la validité est avérée, le serveur
web fournit un identifiant de session à l'utilisateur. Comme
expliqué précédemment http est un protocole
déconnecté, donc entre deux requêtes http la connexion
entre le navigateur et le serveur http est coupée. Donc le serveur http
ne peut pas reconnaître un utilisateur qui s'est déjà
authentifié et ouvert une session de travail dans l'application Web.
Pour remédier à cela, la plupart des systèmes
d'authentification repose sur un identifiant de session. Celui-ci est
envoyé à chaque page entre le client et le serveur par le biais
d'un cookie, d'un paramètre d'adresse ou d'un champ de formulaire
invisible pour l'utilisateur ;
6. L'utilisateur peut utiliser l'application Web tant que la
session est ouverte.
Les attaques pour usurper une identité peuvent
être regroupées en deux catégories :
· Les attaques contre le système
d'authentification qui cherchent à obtenir un droit
d'accès ;
· Les usurpations de session qui permettent de
s'affranchir de l'étape d'authentification.
4.3.2 Exemples d'attaque
Parmi les attaques contre les systèmes
d'authentification, la plus répandue est l'utilisation de la force
brute. Pour cela l'attaquant va bombarder la page d'authentification avec des
valeurs d'identifiant et de mots de passe jusqu'à ce qu'il se fasse
accepter
[9]. L'attaque est facilitée si le message d'erreur de
l'échec de l'authentification donne l'origine de l'erreur. Ainsi
« l'utilisateur n'existe pas » permet à l'attaquant
de ne pas tenter d'entrer des mots de passe pour cet utilisateur absent de la
base de compte. « Mot de passe incorrect » permet à
l'attaquant de se concentrer sur cet utilisateur, ce qui lui fait gagner
beaucoup de temps. De même si l'application Web offre un service pour
créer un compte par lui-même et qu'au moment de la saisie de
l'identifiant ce système indique si le compte existe déjà
ou non, l'attaquant dispose d'un moyen pour trouver des comptes attaquables.
L'impact de ce type d'attaque n'est pas seulement limité à une
usurpation d'identité pour l'application Web. Un internaute utilise
souvent les mêmes valeurs d'identifiant et de mot de passe pour de
nombreuses applications présentes sur le Web. L'attaquant peut donc
tenter d'utiliser ces valeurs sur différentes applications Web.
Il est possible pour l'attaquant de chercher des couples
identifiant/mot de passe sans faire appel à la force brute. L'attaquant
va simplement tenter d'utiliser des comptes généralement
présents dans les applications Web, comme ceux d'administration. Ceci
est surtout possible lorsque les applications sont basées sur des outils
Open Source qui ont des comptes créés automatiquement avec des
mots de passe par défaut connus du domaine public. L'attaquant n'a plus
qu'à consulter le code source pour trouver une liste restreinte
d'identifiants/mots de passe valides.
Les pages Web qui permettent de réinitialiser les mots
de passe sont une faille importante pour l'usurpation d'identité. En
effet, pour s'assurer de l'identité du demandeur, la plupart
d'entre elles demandent une information que seule la personne est censée
connaître. Hors avec les réseaux sociaux, les internautes
partagent leur vie privée. Ces informations personnelles visibles de
tous peuvent être les mêmes que celles demandées dans les
pages de réinitialisation de mot de passe. Dans ce cas l'attaquant peut
définir un nouveau mot de passe qu'il pourra utiliser pour se connecter
à l'application.
Pour voler un identifiant de session, l'attaque par la force
brute est également possible. Dans ce cas l'attaquant va
générer des valeurs et tenter de les utiliser comme identifiant
de session. S'il réussit à trouver une valeur valide, il pourra
utiliser l'application Web sans s'être authentifié. Une attaque
XSS peut permettre de récupérer un identifiant de session
présent dans le cookie de l'internaute.
4.3.3 Parade et bonnes pratiques
Concernant les systèmes d'authentification,
l'application ne doit accepter que des mots de passe suffisamment forts pour
éviter d'être devinés rapidement par la force brute. Une
longueur minimale de huit caractères est ce qui recommandé par
l'OWASP pour les applications critiques. De plus il doit comporter au moins un
chiffre, une lettre en minuscule et une lettre en majuscule.
Le message affiché lors d'un problème de
validité de l'identifiant ou du mot de passe doit être
générique et ne doit pas donner d'indice quant à l'origine
de l'erreur.
Pour contrer les attaques de force brute, le compte
ciblé par l'attaque doit être verrouillé après cinq
tentatives consécutives infructueuses de connexion. La procédure
de déverrouillage peut être automatique après un laps de
temps prédéfini ou manuelle par un administrateur de
l'application.
Dans la mesure du possible il est conseillé de ne pas
développer son propre mécanisme d'authentification. Il est
préférable d'utiliser un système existant
éprouvé.
Concernant les identifiants de session, les applications Web
doivent limiter la durée de vie d'une session. Une période
d'inactivité maximale doit être définie. Si l'utilisateur
n'utilise pas l'application pendant ce laps de temps, la session devient
inutilisable et l'utilisateur doit se reconnecter. Une session doit
également avoir une durée de vie maximale au-delà de
laquelle la session expire, même si la période d'inactivité
autorisée n'était pas dépassée. Ces
précautions permettent de limiter le temps d'action d'un attaquant.
Du côté client, du code JavaScript doit fermer la
session lorsque l'utilisateur ferme le navigateur. Cela permet de simuler une
action de l'utilisateur pour se déconnecter de l'application. Pour que
l'utilisateur évite de perdre des saisies non sauvegardée, du
code JavaScript peut prévenir l'utilisateur que sa session va
bientôt expirer.
Pour détecter des attaques de force brute, il faut
régulièrement consulter les journaux d'activité à
la recherche d'évènements inhabituels, comme un nombre important
de requête utilisant des identifiants de sessions invalides.
4.4
Référence directe non sécurisée à un
objet
4.4.1 Principe
Cette vulnérabilité existe simplement parce que
les paramètres de requêtes ne sont pas vérifiés
avant traitement. Si le paramètre vulnérable fait
référence à un fichier, à une valeur dans une base
de données, il suffit de reconstruire la requête avec une valeur
de paramètre normalement interdite pour y avoir accès.
Cette faille peut avoir des impacts importants si un
utilisateur mal intentionné obtient par ce biais des accès
à des informations et des fonctionnalités pour lesquelles il n'a
aucune autorisation.
4.4.2 Exemples
d'attaque
Cette faille est une des bases de la
vulnérabilité exploitée par XSS. En effet, dans les
exemples d'attaques exposés précédemment ('
voir paragraphe 3.2.2), les paramètres
récupérés ne sont pas vérifiés. Par contre,
si ces valeurs avaient été contrôlées, les
caractères spéciaux n'auraient pas été
autorisés, empêchant ainsi l'envoi de code frauduleux au
navigateur.
Si les paramètres sont passés en
paramètre d'un lien, un utilisateur malintentionné peut
aisément modifier l'adresse pour accéder à des
informations auxquelles il n'aurait pas dû avoir accès. L'exemple
suivant reprend la table « comptes » (voir '
paragraphe 3.1.1) qui va être
interrogée par un script PHP pour afficher le numéro de carte
bancaire de l'utilisateur.
<?php //recuperation des parametres$nom = $_GET['proprietaire']; //generation de la requete$requeteSQL = "SELECT numerocarte FROM comptes WHERE nom = '$nom'"; //execution de la requete$reponse = mysql_query($requeteSQL);$resultat = mysql_fetch_assoc($reponse);//affichage du resultatecho "<tr><td> Votre numero de carte est :</td><td>";echo $resultat['numerocarte'];echo "</td></tr>";?>
Figure 18 - Script PHP pour
l'affichage du numéro de carte
Si l'utilisateur malveillant saisit dans son navigateur
l'adresse de cette page avec pour paramètre
« nom=nom_de_la_victime », il a alors accès au
numéro de carte bancaire qu'il n'aurait jamais du pouvoir voir.
4.4.3 Parade et bonnes pratiques
Pour protéger les données les plus
confidentielles ou les fonctionnalités les plus avancées, le WASC
recommande de demander à l'utilisateur de saisir à nouveau son
identifiant et son mot avant de pouvoir y accéder. Ensuite il suffit de
se baser sur ces valeurs pour construire les requêtes. Ainsi dans
l'exemple de l'affichage du numéro de carte, le paramètre
utilisé pour la recherche aurait été celui de la personne
qui s'est authentifiée et non celui fournit en paramètre du
lien.
4.5 Falsification
de requête inter-sites (CSRF)
4.5.1 Principe
D. Gollmann
[14] montre qu'une attaque par falsification de
requête inter-sites (Cross-Site Request Forgery ou session riding ou CSRF
ou XSRF) a un fonctionnement assez proche d'une attaque XSS. La principale
différence est que l'utilisateur au travers de son navigateur ne sera
pas la victime mais sera celui qui va effectuer une action malveillante sur
l'application cible. Une attaque CSRF va exécuter du code malveillant
dans une application Web au travers de la session d'un utilisateur
connecté.
Comme pour XSS, il existe deux modes
opératoires :
Dans une attaque CSRF par réflexion (reflected CSRF),
l'attaquant crée une page web qui comporte un formulaire invisible par
exemple. Ce dernier contient un script caché qui lance des actions de
l'application. L'attaquant piège l'utilisateur en mettant un lien vers
cette page dans un courrier électronique ou sur des réseaux
sociaux. Quand l'utilisateur affiche cette page, le navigateur va
interpréter le code malicieux et va tenter d'exécuter une
fonctionnalité de l'application cible. Si l'utilisateur s'y est
récemment connecté, l'application va exécuter la commande
sans le consentement de l'utilisateur. Cette attaque fonctionne car les
informations d'authentification qui ont préalablement été
saisies par l'utilisateur sont envoyées automatiquement par le
navigateur au serveur. L'attaquant n'a donc pas besoin de se connecter à
l'application pour exécuter des commandes frauduleuses. Cependant
l'attaque ne fonctionne pas si l'utilisateur ne s'est pas connecté.
Dans une attaque CSRF stockée (stored CSRF), c'est
l'application elle-même qui présente le code malicieux à
l'utilisateur. Pour ce faire l'attaquant a réussi a inséré
du code malicieux dans les données de l'application Web. Chaque fois
qu'un utilisateur parcourra la page qui va présenter ce code, le
navigateur va l'interpréter et par conséquent va exécuter
une commande de l'application. L'application va alors accepter
d'exécuter cet ordre comme si la demande provenait de l'utilisateur.
Cette attaque a plus de chance de réussir car l'utilisateur s'est
déjà connecté et utilise l'application. L'attaquant n'a
pas de besoin de piéger un utilisateur.
Figure 19 - Principe d'une
attaque CSRF stockée
Une attaque par CSRF rend les défenses contre les
attaques XSS inopérantes.
4.5.2 Exemples d'attaque
L'exemple suivant reprend la table
« messages » et le script PHP pour l'insertion de
données (voir '
paragraphe 3.2.2). Si ce script se nomme
« add_message.php », le site de l'attaquant pourra utiliser
le code suivant pour le faire exécuter par l'utilisateur :
<form method="GET" id="reflected_CSRF" name="reflected_CSRF" action="add_message.php"> <input type=hidden name="numsujet" value="6"> <input type=hidden name="nom" value="CSRF"> <input type=hidden name="message" value="action frauduleuse"></form><script>document.reflected_CSRF.submit()</script>
Figure 20 - Code HTML pour
réaliser une attaque CSRF
L'utilisateur en parcourant la page de l'attaquant est alors
automatiquement redirigé vers la page
« add_message.php » avec les paramètres
numsujet=6, nom=CSRF et message=action frauduleuse.
4.5.3 Parade et bonnes pratiques
Bien que XSS et CSRF soit proches dans le principe, se
protéger des attaques XSS ne permet pas de se protéger des
attaques CSRF.
Pour se protéger, il faut utiliser uniquement des
requêtes POST. Les méthodes GET doivent être bannies.
Attention toutefois, dans les servlet Java la méthode
« doGet() »fait appel à la méthode
« doPost() » en redirigeant l'ensemble des paramètres.
Dans ce cas l'utilisation de requêtes GET fonctionne. C'est pourquoi
l'utilisation de POST n'est pas une protection suffisante.
Pour les pages qui manipulent des données sensibles, il
faut demander à l'utilisateur de s'authentifier à nouveau. Cela
permet de s'assurer que l'utilisateur est conscient de l'action et
l'approuve.
L'utilisateur doit toujours vérifier que le lien sur
lequel il clique est bien celui de l'application qu'il veut utiliser.
4.6 Mauvaise configuration de
sécurité
4.6.1 Principe
Cette faille de sécurité regroupe toutes les
vulnérabilités laissées ouvertes aux différents
niveaux de l'architecture de l'application Web. Pour chacun des serveurs
impliqués dans l'activité de l'application, le problème
concerne le système d'exploitation ainsi que les outils installés
pour servir l'application.
Pour chacun de ces composants, des failles sont connues du
domaine public, ce qui facilite les attaques. S'ils ne sont pas mis à
jour, l'attaquant peut exploiter les failles non corrigées.
Pour de nombreux outils, des options sont installées
par défaut alors qu'elles ne sont pas nécessaires au bon
fonctionnement de l'application. Cette situation offre plus
d'opportunités pour un attaquant.
De même de nombreuses applications sont
installées avec des comptes créés avec des mots de passe
par défaut. Ces comptes et mots de passe sont les cibles
privilégiées des usurpations d'identité.
4.6.2 Exemples d'attaque
J. Scambray, V. Liu et C. Sima
[9] donnent un exemple d'attaque. En 2007 une faille est
découverte dans l'extension mod_jk du serveur http Apache. Ce module
permet de renvoyer les requêtes http reçues par le serveur http
au serveur de Servlet Apache Tomcat pour qu'il exécute les Servlets
Java. Le problème détecté est un dépassement de
mémoire tampon (buffer overflow). Le module ne gérait pas
correctement les adresses trop longues contenues dans les requêtes http.
Cela permettait à un attaquant de faire ouvrir un port d'écoute
spécifique utilisable pour prendre la main sur le serveur. Tant que le
correctif n'était pas publié et installé, les
systèmes restaient vulnérables. Le seul moyen de se
protéger était de désactiver le module s'il n'était
pas utilisé.
Les codes sources des applications Web Open Source sont
disponibles aussi bien pour les développeurs légitimes que pour
les attaquants. En parcourant ces fichiers, il est possible de lire des
commentaires laissés par les développeurs indiquant qu'il y a un
problème dont ils ont conscience mais qu'ils traiteront plus tard. Dans
ce cas l'attaquant n'a plus qu'à exploiter cette faiblesse.
Les pages d'erreurs des serveurs http contiennent par
défaut des informations sur l'erreur et sur le serveur http
lui-même. En tentant d'accéder à une page inexistante, une
erreur de type « 404 page not found » est retournée
à l'attaquant, de même que la version du serveur http. Dans ce cas
il suffit à l'attaquant d'étudier cette version pour en connaitre
les vulnérabilités et de les exploiter.
4.6.3 Parade et bonnes pratiques
L'ANSSI et l'OWASP font les recommandations
suivantes :
Il faut désactiver les options inutiles des composants
afin de diminuer le nombre de vulnérabilités potentielles que ce
soit au niveau du système d'exploitation, du système de gestion
de bases de données ou du serveur http.
Il faut mettre à jour les différents composants
de l'architecture autant que possible en installant les correctifs dès
qu'ils sont publiés. De plus, à l'installation il est
préférable de choisir la version anglaise plutôt qu'une
autre langue. En effet, lors du développement de correctifs c'est
toujours la version anglaise qui est privilégiée, les autres
versions étant corrigées plus tardivement.
Après l'installation il faut désactiver voire
supprimer tous les comptes inutiles. Le mot de passe des autres comptes doit
être modifié dès que possible. Les comptes d'administration
par défaut doivent être verrouillés. Il faut
préférer l'utilisation de comptes d'administration
créés manuellement.
4.7 Stockage de
données cryptographiques non sécurisé
4.7.1 Principe
Cette faille de sécurité englobe toutes les
faiblesses liées à la protection du stockage des données.
La meilleure protection est la mise en place du chiffrement des informations.
Le CLUSIF définit le chiffrement comme « le
procédé grâce auquel on peut rendre la compréhension
d'un document impossible à toute personne qui n'en possède pas la
clé. »
La principale faille concerne les données sensibles,
c'est-à-dire les données dont la divulgation ou
l'altération ou la non-disponibilité peuvent porter
préjudice à leur propriétaire, telles que le mot de passe
ou l'identifiant de session. Si les données sont présentes en
clair ou chiffrées par un algorithme faible, il existe un risque qu'un
attaquant puisse les consulter.
4.7.2 Exemples d'attaque
Certains moteurs de bases de données font payer
l'option de chiffrement. Pour des raisons d'économies, les responsables
décident de stocker les données en clair dans la base de
données. Seul les transmissions de requête http sur le
réseau sont chiffrées. Pour se protéger du risque
d'incendie sur le site où sont installés les serveurs, les
données sauvegardées sur bande sont envoyées sur un autre
site une fois par mois. Si un agresseur intercepte cette sauvegarde pendant son
transfert, il aura accès aux données en clair.
4.7.3 Parade et bonnes pratiques
Tous les moyens de stockage de données sensibles
doivent être chiffrés. Il faut s'assurer également que la
sauvegarde du moyen de stockage ne contient pas les données en clair.
Il ne faut pas utiliser d'algorithme de chiffrement ou de
hachage faible, tels que MD5 ou SHA1 ni tenter de créer son propre
algorithme. Il faut utiliser des algorithmes reconnus et éprouvés
tels AES-256, RSA et SHA-256. Pour des raisons de capacité de calcul,
l'ANSSI recommande que la taille minimale des clés symétriques
utilisées jusqu'en 2020 soit de 100 bits et de 128 bits au-delà
de 2020.
4.8 Défaillance dans la
restriction des accès à une URL
4.8.1 Principe
Cette faille permet à un utilisateur d'accéder
à des fonctionnalités de l'application, voire même des
fichiers et répertoires du serveur http sans y être
habilité.
L'attaque par traversée de répertoires permet
d'accéder à des fichiers du serveur http notamment ceux contenant
les clés privées de chiffrement. Les applications
vulnérables ouvrent des fichiers dont le nom est donné en
paramètre de la requête http.
Une autre attaque consiste à deviner l'existence de
fichiers ou de répertoires. En effet de nombreux outils disposent d'une
interface d'administration dont l'adresse d'accès est du type
« http://www.site_vulnerable.fr/admin/admin.php ».
Dans ce cas même si l'utilisateur malintentionné n'y a pas
accès au travers de l'application, il peut saisir directement l'adresse
pour l'ouvrir. Les applications vulnérables ne demandent pas de
s'authentifier avant de pouvoir l'utiliser, la seule protection étant
qu'aucun lien n'est mis à disposition pour y accéder, ce qui
n'est pas suffisant.
Une attaque équivalente consiste à ne pas
spécifier de nom de fichier dans l'adresse, par exemple «
http://www.site_vulnerable.fr/admin/ ».
Les serveurs http vulnérables afficheront le contenu du
répertoire.
4.8.2 Exemples d'attaque
L'exemple suivant montre une portion de code vulnérable
à l'attaque par traversée de chemin. L'application est construite
pour inclure du texte en fonction de la langue du navigateur. Dans ce cas la
langue est donnée en paramètre de la requête http, la
commande PHP
« include lang_nom_fichier.php »
permet d`inclure le contenu du fichier concerné.
<?php $language="entete-en";if (isset($_GET['lang'])) { $language=$_GET['lang'];}include ("/usr/local/webapp/template/" . $language . ".php")?>
Figure 21 - Script PHP
vulnérable à l'attaque par traversée de chemin
Si l'attaquant envoie la requête avec le
paramètre « lang=../../../../etc/passwd%00 », il
aura accès au fichier des mots de passe du système et tentera de
se connecter au serveur http avec un des comptes ainsi trouvé.
Dans cet exemple l'attaque par traversée de chemin est
possible à cause de la faille
Référence directe non
sécurisée à un objet (voir
paragraphe 3.4).
4.8.3 Parade et bonnes pratiques
Pour se protéger des défaillances dans la
restriction des accès à une URL, il ne faut pas autoriser les
caractères douteux tels que « / » et
« \ ».
Pour se prémunir des attaques par traversée de
chemin, il faut établir une liste de fichiers utilisables et refuser
tout autre fichier. La correction à apporter à l'exemple
ci-dessus est la suivante.
<?php $languages=array("entete-en","entete-fr","entete-es");$language=$languages[1];if (isset($_GET['lang'])) { $tmp=$_GET['lang']; if (array_search($tmp, $languages)) { $language=$tmp; }}include ("/usr/local/webapp/template/" . $language . ".php")?>
Figure 22 - Script PHP non
vulnérable à l'attaque par traversée de chemin
Tous les répertoires doivent contenir un fichier
index.html, ce qui évite de pouvoir accéder au répertoire
lui-même. De plus, les serveurs http doivent être configurés
pour ne pas permettre l'affichage du contenu des répertoires.
Pour éviter les accès à des
fonctionnalités sans autorisation, ces dernières doivent
être protégées en vérifiant que l'utilisateur a le
droit de les utiliser. Ne pas afficher de lien pour y accéder n'est pas
une protection suffisante.
4.9 Protection insuffisante de la couche
transport
4.9.1 Principe
Comme évoqué pour le
stockage des données sensibles,
celles-ci ne doivent apparaître en clair qu'aux personnes
autorisées. Sur les Internet il existe un risque qu'une requête ou
une réponse http soit interceptée. Si elle contient des
informations confidentielles transmises en clair, alors l'attaquant pourra les
exploiter facilement.
Tous les réseaux de l'architecture de l'application Web
sont concernés, depuis le navigateur de l'utilisateur jusqu'au stockage
des données, en passant par le serveur web.
Si une partie de l'application seulement est
protégée par chiffrement, alors l'application complète est
vulnérable. Si l'utilisateur après s'être connecté
retourne sur des pages non chiffrées, alors des informations, telles que
le nom de l'utilisateur ou l'identifiant de session, peuvent être
transmises en clair de page en page, exposant ainsi toute l'application
à des attaques d'usurpation d'identité (voir '
paragraphe 3.3).
4.9.2 Exemples d'attaque
L'attaque du type « Homme du milieu » (ou
« Man-in-the-Middle ») est une des attaques les plus
répandues pour accéder aux données d'une application
[9]. Si un attaquant réussit à compromettre un
serveur proxy, il pourra intercepter toutes les communications. Si en plus ce
serveur est responsable du chiffrement des flux http, il aura accès aux
données les plus sensibles qui devaient être chiffrées.
4.9.3 Parade et bonnes pratiques
Si une application Web manipule des données sensibles
il faut mettre en place du chiffrement SSL pour TOUTES les pages. De plus, les
mots de passe et les identifiants de session ne doivent pas transiter en
clair.
La protection de la couche « transport »
vient en complément de la protection du stockage des données.
Ainsi si les données stockées sont chiffrées, il faut
s'assurer que tous les moyens de communications le soient aussi. Par exemple,
la politique de sécurité pour les données médicales
exige que le médecin du travail et le patient soient les seuls
autorisées à consulter ces informations. Pour cela, au niveau de
l'application, il faut s'assurer que l'utilisateur est soit la personne
concernée, soit le praticien. De plus, les informations ne doivent
apparaître en clair à aucun autre moment que pour l'affichage.
Cela concerne les flux de communication entre l'utilisateur et les
différents composants de l'architecture tels que le serveur http ou la
base de données, mais aussi les moyens de stockage tels que les
fichiers, les bases de données ou les sauvegardes de ces derniers.
4.10 Redirection et
renvois non validés
4.10.1 Principe
Les redirections d'adresse sont utilisées dans les
applications Web pour effectuer un changement de page en fonction d'un
paramètre.
L'utilisation de la redirection est particulièrement
utilisée pour les attaques par hameçonnage (ou phishing). En
cliquant sur un lien utilisant une page de redirection, l'utilisateur est
automatiquement emmené vers une autre page. Cette redirection peut
être utilisée dans le cadre d'une attaque CSRF (voir
paragraphe 3.5).
4.10.2 Exemples d'attaque
Le script suivant est un exemple de page de redirection en
utilisant la redirection par code HTML.
<?php$nouvelleAdresse='http://nouvelle.adresse.fr/index.php'; if (isset($_GET['adresse'])) { $nouvelleAdresse=$_GET['adresse'];}echo '<!DOCTYPE html>'."\n", '<html xmlns="http://www.w3.org/1999/xhtml">'."\n", '<head>'."\n", '<meta charset="UTF-8" />'."\n", //Redirection HTML : '<meta http-equiv="refresh" content="0; url='.$nouvelleAdresse.'" />'."\n", '<title>Redirection</title>'."\n", '<meta name="robots" content="noindex,follow" />'."\n", '</head>'."\n", "\n", '<body>'."\n", //au cas où la redirection ne fonctionne pas : '<p><a href="'.$nouvelleAdresse.'">Redirection</a></p>'."\n", '</body>'."\n", '</html>'."\n";?>
Figure 23 - Script PHP de
redirection automatique
Si un attaquant a connaissance d'une page de redirection
vulnérables, il peut l'utiliser dans un lien pour faire rediriger
l'utilisateur vers une page Web.
<a href="http://www.application-securisee.com/redirect.php?www.attaquant.com/attaque.php" rel="nofollow">http://www.application-securisee.com</a>
Figure 24 - Lien pour
rediriger l'utilisateur vers une page malveillante
Dans ce cas l'utilisateur est leurré. Le lien pointe
bien vers l'application, mais va le rediriger vers une page malveillante.
4.10.3 Parade et bonnes pratiques
La redirection ne doit renvoyer qu'à des pages locales.
Dans ce cas les caractères spéciaux doivent être
prohibés.
En cas de changement d'adresse ou de déplacement d'une
page, il vaut mieux utiliser la redirection paramétrée dans le
serveur http. Par exemple avec Apache il est possible de placer un fichier
« .htaccess » pour paramétrer les redirections
automatiques.
<IfModule mod_alias.c>#redirection automatique d'une page vers une nouvelle adresseRedirect permanent /dossier01/script_1.html
http://nouvelle.adresse.fr/dossier03/script_1.php#redirection automatique d'un ensemble de pagesRedirectMatch permanent /dossier01/(.*)\.html$
http://nouvelle.adresse.fr/dossier02/$1.php#redirection automatique d'un dossier vers une nouvelle adresseRedirect permanent /dossier01
http://nouvelle.adresse.fr/dossier02#redirection automatique de toute l'application Web une nouvelle adresseRedirect permanent / http://nouvelle.adresse.fr/</IfModule>
Figure 25 - Exemple de
redirection automatique configurée au niveau du serveur http
5. BONNES PRATIQUES
5.1 Règles de
développement
Il est possible de se protéger de la plupart des
attaques expliquées précédemment en suivant les
règles de développement suivantes.
Toutes les données doivent être
vérifiées. Les valeurs saisies dans un formulaire doivent
être validées au niveau du navigateur avec du code JavaScript, car
le client n'est pas une source fiable. Il n'est pas certain que ce soit
l'utilisateur de l'application qui envoie la requête http. Les valeurs
doivent également être contrôlées au niveau du
serveur au moment de la récupération des paramètres, tout
comme les paramètres de requête. Ainsi pour chaque
valeur :
· La longueur de la valeur saisie doit être
contrainte avec une taille minimale et une taille maximale ;
· Seules les lettres de l'alphabet et/ou les chiffres
doivent être acceptés par défaut, tous les autres
caractères devant être refusés. Dans le cas où
d'autres caractères doivent être autorisés, ils doivent
être limités à une liste prédéfinie ou
être remplacés par les codes HTML.
Il faut privilégier l'utilisation des requêtes
POST. Cela permet de ne pas prendre en compte des paramètres frauduleux
dans les adresses.
Les requêtes SQL ne doivent pas être construites
dynamiquement. Il faut utiliser les requêtes paramétrées.
Ainsi, les requêtes SQL ne peuvent pas être parasitées comme
c'est le cas dans le cas de l'injection SQL (voir
paragraphe 3.1).
Dans la mesure du possible, il est préférable
d'utiliser des outils existants plutôt que de développer des
fonctionnalités souvent présentes dans les applications.
Toutes les pages d'une application Web doivent s'assurer que
l'utilisateur s'est authentifié préalablement. Pour les
fonctionnalités manipulant des données sensibles, l'application
doit demander à l'utilisateur de s'authentifier à nouveau avant
de les afficher. Cela permet de s'assurer qu'il n'y a pas eu usurpation
d'identité. Les messages d'erreur renvoyés doivent être
générique pour ne pas aiguillé les attaquants
potentiels.
Les données sensibles doivent être
chiffrées dans les bases de données.
La protection des mots de passe, des identifiants de session
et des cookies permet de se prémunir contre l'usurpation
d'identité. Pour cela, le mot de passe doit avoir au moins six
caractères, voire même huit pour les accès aux
données sensibles. Il doit également contenir au moins trois
types de caractères, tels que des chiffres, des lettres minuscules, des
lettres majuscules ou des caractères spéciaux. Il doit avoir une
période de validité de maximum quatre-vingt-dix jours.
Au-delà, il doit être changé. Le compte de l'utilisateur
doit être verrouillé, au moins temporairement, si cinq tentatives
de connexions consécutives ont échoué. Le mot de passe
doit être chiffré. Seule sa valeur chiffrée sera
comparée lors de l'authentification de l'utilisateur.
Les identifiants de session doivent avoir une durée de
vie limitée au-delà de laquelle il n'est plus utilisable. De
même, après une période d'inactivité
prédéfinie, l'identifiant de session soit être
invalidé. En cas de fermeture du navigateur, l'identifiant de session
doit être supprimé. Ces actions sont équivalentes à
un système de déconnexion automatique.
Les cookies doivent être protégés en
positionnant deux attributs. « Secure » permet d'interdire
l'envoie du cookie sur un canal non chiffré.
« HTTPonly » permet d'en interdire l'accès à
JavaScript.
5.2 Configuration des composants
serveur
Pour des raisons de capacité de calcul, la taille
minimale des clés symétriques utilisées jusqu'en 2020 doit
être de 100 bits et de 128 bits au-delà de 2020.
Si le caractère confidentiel des données
nécessite la mise en place du chiffrement des flux, toutes les pages
doivent protégées et pas seulement celles manipulant ces
données.
Les outils installés doivent être mis à
jour avec le correctif le plus récent.
Les options inutilisées des outils installés
doivent être supprimées ou désactivées.
Le serveur http ne doit pas afficher le contenu d'un
répertoire.
5.3 Audit
Pendant la phase de développement, les tests unitaires
permettent de vérifier le comportement d'une fonction de l'application.
Ils peuvent être utilisés pour s'assurer que les règles de
développement citées précédemment sont
respectées. En complément, les outils d'intégration
continue, tels que
Jetkins ou
Hudson, permettent de vérifier
à chaque modification de code qu'elle n'engendre pas de
régression. L'utilisation conjointe de cette panoplie d'outils facilite
les audits de code et permettent même de les automatiser lors des phases
de maintenance.
Les fichiers de journalisation des serveurs doivent faire
l'objet d'un audit régulier afin de s'assurer que l'application ou le
serveur n'a pas été victime de tentative d'attaque par la force
brute.
6. CONCLUSION
6.1 Constat
Depuis la version de 2004, le classement de l'OWASP a peu
évolué. En effet, huit problèmes répertoriés
en 2010 étaient déjà présents en 2004. Cela
signifie que le Web 2.0 a apporté du confort à l'utilisateur mais
n'a pas apporté des failles plus dangereuses que celles
déjà présentes. En effet, AJAX permet d'étendre les
possibilités des attaques. Ainsi, le vol d'information par CSRF prend
une nouvelle forme. Tout comme l'attaque CSRF classique expliquée dans
le
paragraphe 3.5, un utilisateur ouvre
une page Web frauduleuse. Ensuite l'attaquant profite du mode asynchrone de la
fonction « XMLHttpRequest » pour parcourir la page de
l'application affichée, voler le cookie et envoyer les données
à l'attaquant. Les protections contre CSRF restent efficaces, mais se
protéger de la seconde phase de l'attaque est plus délicat. Par
ailleurs AJAX permet d'outrepasser la protection inter-domaines offerte par les
navigateurs.
Bien que de nouvelles failles émergent avec le Web 2.0,
les applications Web sont toujours vulnérables aux failles les plus
anciennes. Cela démontre que le comportement des développeurs n'a
pas changé. Pressés par des contraintes de temps, ils ne font pas
l'effort d'appliquer quelques règles de bases qui permettent de se
défendre contre les attaques les plus dangereuses
6.2 Perspectives
2012 va marquer l'arrivée de nouveaux standards :
HTML 5 et CSS 3. Leur objectif est de combler les lacunes de leurs
prédécesseurs utilisés depuis bientôt quinze ans.
Les développeurs espèrent qu'avec ces nouvelles versions,
l'utilisation de JavaScript diminue, allégeant ainsi le code des
applications Web et diminuant par la même occasion le nombre des
vulnérabilités. Le coût de mise à jour des
applications Web actuelles risque de freiner l'adoption de ces nouvelles
normes. Les organismes de sécurité devront également
s'impliquer pour mettre à disposition des développeurs de
nouvelles bonnes pratiques.
7. BIBLIOGRAPHIE
[1] K. Hafner et M. Lyon. Les sorciers du
Net. Calmann-Lévy, 346p, 1999
[2] L. Shklar et
R. Rosen. Web Application Architecture: Principles, Protocols and
Practices. John Wiley & Sons Ltd, 372p, 2003
[3] D. Cederholm. Bonnes pratiques des
standards du web. Pearson Education, 300p, 2010
[4] S. Gulati. Under the hood of the
Internet: Connector: the Internet protocol, part one: the foundations.
Magazine Crossroads 6, article 3, 2000
[5] G.Florin et S.Natkin. Support de
cours RESEAUX ET PROTOCOLES. CNAM, 884p, 2007
[6] J. Governor, D. Hinchcliffe et D.
Nickull. Web 2.0 Architectures. O'Reilly Media, 248p, 2009
[7] C. Porteneuve et T. Nitot. Bien
développer pour le Web 2.0 : Bonnes pratiques Ajax. Eyrolles, 673p,
2008
[8] M. Contensin. Sécurité des
applications web dans formation PHP/MySQL chapitre 6. CNRS, 2007
[9] J. Scambray, V. Liu et C. Sima.
Hacking Exposed Web Applications: Web Application Security Secrets and
Solutions. Osborne/McGraw-Hill, 482p, 2010
[10] H. Dwivedi, A. Stamos, Z. Lackey et R.
Cannings. Hacking Exposed Web 2.0: Web 2.0 Security Secrets and
Solutions. Osborne/McGraw-Hill, 258p, 2007
[11] Z. Su et G. Wassermann. The essence of
command injection attacks in web applications. Dans POPL'06
Conference, ACM SIGPLAN Notices, p372-384, 2006
[12] Y.-W. Huang, C.-H. Tsai, T.-P. Lin, S.-K. H., D.T. Lee et S.-Y. Kuo. A
testing framework for Web application security assessment. Dans Computer
Networks, pages 739-761, 2005
[13] A. Kiezun, P. J. Guo, K. Jayaraman, M.
D. Ernst. Automatic Creation of SQL Injection and Cross-Site Scripting Attacks.
Dans ICSE, pages 199-209, 2009
[14] D. Gollmann. Securing Web applications.
Dans Information Security Technical Report, chapitre 1-9, Elsevier,
2008
Les sites Web cités ci-dessous sont
considérés comme des sources fiables par les organismes
évoqués précédemment.
·
http://csrc.nist.gov/publications/ consulté le 27/11/2011
·
http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ consulté le
27/11/2011
· http://ha.ckers.org/ consulté
le 27/11/2011
·
http://googlewebmastercentral.blogspot.com/2009/01/open-redirect-urls-is-your-site-being.html
consulté le 27/11/2011
·
http://references.modernisation.gouv.fr/ consulté le 21/11/2011
·
http://www.certa.ssi.gouv.fr/ consulté le 21/11/2011
· http://www.cgisecurity.com/
consulté le 27/11/2011
· http://www.checkmarx.com/
consulté le 27/11/2011
· http://www.clusif.asso.fr/
consulté le 21/11/2011
· http://www.cnil.fr/ consulté le
03/12/2011
· http://www.dgdr.cnrs.fr/fsd/
consulté le 19/11/2011
·
http://www.dwheeler.com/secure-programs/ consulté le 27/11/2011
· http://www.ietf.org/ consulté
le 27/11/2011
·
http://www.legifrance.gouv.fr/ consulté le 10/12/2011
·
http://www.ouah.org/chambet.html consulté le 27/11/2011
· https://www.owasp.org/
consulté le 19/11/2011
·
http://www.pcmag.com/article2/0,4149,11525,00.asp consulté le
10/12/2011
·
http://www.references.modernisation.gouv.fr/rgs-securite consulté le
27/11/2011
· http://www.resinfo.org/
consulté le 20/11/2011
· http://www.rsa.com/ consulté le
10/12/2011
·
http://www.schneier.com/blog/archives/2005/10/scandinavian_at_1.html
consulté le 27/11/2011
· http://www.ssi.gouv.fr/
consulté le 21/11/2011
· http://www.w3.org/ consulté le
21/11/2011
· http://www.webappsec.org/
consulté le 21/11/2011
· http://yehg.net/lab/ consulté
le 27/11/2011
Source des icônes libres de droits d'utilisations :
http://findicons.com
RÉSUMÉ
Internet est né dans la fin des années 80 et le
Web au début des années 90, offrant un mode de consultation
passif des sites Web à l'utilisateur. Les années 2000 ont vu
l'émergence du Web 2.0 rendant l'internaute actif et créateur de
contenu et amenant les applications sur la toile. Comme pour toutes les
applications, il existe des vulnérabilités mais celles-ci sont
exposées à une plus grande population. Les problèmes
qu'elles peuvent engendrer peut aller jusqu'au vol d'informations
confidentielles et à la corruption de l'application.
Ce document traite les dix risques de sécurité
les plus dangereux recensés par l'Open Web Application Security Project.
Le principe de chacune des failles est expliqué et illustré par
un ou plusieurs exemples. Des règles sont données pour se
prémunir contre des attaques. Ces bonnes pratiques sont
complétées pour proposer au développeur des nouvelles
habitudes et protéger ses applications.
Mots clés : Web, Internet,
application, sécurité, vulnérabilité
ABSTRACT
Internet is born at the end of the 80's and Web at the
beginning of the 90's, giving a passive consultation mode on Web sites to the
user. At the beginning of the 21th century, Web 2.0, the Web surfer
became active and content creator and applications were deployed on the Web. As
all the applications, vulnerabilities exist but they are exposed to a bigger
population. They may generate problems such as confidential information steal,
or application corruption.
This document deals with the top ten most critical security
risks identified by Open Web Application Security Project. Each weakness is
explained and illustrated by some examples. Rules are given to protect against
attacks. These good practices are completed to propose new habits to the
developer and protect his applications.
Keywords: Web, Internet, application,
security, vulnerability
|