{"id":169,"date":"2014-06-01T22:18:19","date_gmt":"2014-06-01T21:18:19","guid":{"rendered":"http:\/\/www.mickael-franc.fr\/blog\/?p=169"},"modified":"2015-11-13T15:13:08","modified_gmt":"2015-11-13T14:13:08","slug":"owasp-cross-site-request-forgery-csrf-ou-xsrf","status":"publish","type":"post","link":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/","title":{"rendered":"OWASP \/ Cross-site request forgery (CSRF ou XSRF)"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-235 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png\" alt=\"CSRF \/ XSRF\" width=\"150\" height=\"150\" \/><\/a>Dans ce troisi\u00e8me article de <a title=\"Failles applicatives\" href=\"http:\/\/www.mickael-franc.fr\/blog\/failles-applicatives\/\" target=\"_blank\">la s\u00e9rie consacr\u00e9e aux failles applicatives<\/a>, j\u2019aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.<\/p>\n<p><!--more--><\/p>\n<h2>Introduction<\/h2>\n<p style=\"text-align: justify;\">L\u2019objet de l\u2019attaque CSRF est de forcer des utilisateurs \u00e0 ex\u00e9cuter une ou plusieurs requ\u00eates non d\u00e9sir\u00e9es sur un site donn\u00e9, forg\u00e9es par un utilisateur malintentionn\u00e9. La victime choisie aura les privil\u00e8ges n\u00e9cessaires \u00e0 l\u2019ex\u00e9cution de la requ\u00eate, voire une session encore active.<br \/>\nForger une requ\u00eate reviens \u00e0 cr\u00e9er \/ falsifier une requ\u00eate HTTP (par le biais d\u2019une URL ou d\u2019un formulaire principalement) pointant sur une action pr\u00e9cise interne au site et n\u00e9faste pour la victime.<br \/>\nConcr\u00e8tement, une ressource vuln\u00e9rable aux attaques CSRF est repr\u00e9sent\u00e9e par toutes ressources disponibles directement ET sans \u00e9tape interm\u00e9diaire (ex: g\u00e9n\u00e9ration de cl\u00e9\/jeton d\u2019autorisation d\u2019acc\u00e8s) sur un SI.<\/p>\n<h2>Rappel<\/h2>\n<p style=\"text-align: justify;\">L\u2019OWASP (Open Web Application Security Project) dispose d\u2019un projet de classification des failles les plus couramment utilis\u00e9es par des utilisateurs malintentionn\u00e9s sur Internet. Ce document est accompagn\u00e9 d\u2019une qualification des menaces list\u00e9es et d\u2019une explication sur l\u2019exploitation.<\/p>\n<p style=\"text-align: justify;\">Ce projet se nomme le \u201cTop Ten\u00a0\u00bb (et sort chaque ann\u00e9e si le classement \u00e9volue), et est disponible \u00e0 cette adresse : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project<\/a><\/p>\n<p style=\"text-align: justify;\">En 2010, les failles de type CSRF sont class\u00e9es \u00e0 la 5\u00e8me position, tandis que cette ann\u00e9e elles arrivent en 8\u00e8me position.<\/p>\n<h2>Qualification de la menace<\/h2>\n<p style=\"text-align: justify;\">On pourrait presque qualifier la faille CSRF de \u201csur-couche\u201d ou \u201cvecteur d&rsquo;aggravation\u201d, car elle aura un impact seulement si une autre vuln\u00e9rabilit\u00e9 est pr\u00e9sente dans le SI (le vecteur d\u2019attaque est souvent soit une XSS soit du phishing).<br \/>\n<span style=\"text-decoration: underline;\"> Remarque :<\/span> Une attaque CSRF sera d&rsquo;autant plus dangereuse qu&rsquo;il y a de fonctionnalit\u00e9s vuln\u00e9rables expos\u00e9es par le SI.<\/p>\n<table style=\"border-collapse: collapse;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">Agent de menace<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"text-align: left;\" bgcolor=\"#CCCCCC\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">_<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">Consid\u00e9rez n\u2019importe quel individu pouvant tromper vos utilisateurs en soumettant une requ\u00eate \u00e0 votre site. N\u2019importe quel site ou autre source HTML auxquels vos utilisateurs pourraient acc\u00e9der.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">Vecteur d\u2019attaque<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"background-color: #ff950e;\" bgcolor=\"#FF950E\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">Facilit\u00e9 Moyenne<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">L\u2019attaquant forge une requ\u00eate HTTP et am\u00e8ne une victime \u00e0 la soumettre via une balise d\u2019image, une XSS, du phishing, ou de nombreuses autres techniques. Si l\u2019utilisateur est authentifi\u00e9, l\u2019attaque est un succ\u00e8s.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">Vraisemblance de la vuln\u00e9rabilit\u00e9<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"background-color: #f00;\" bgcolor=\"#F00\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">R\u00e9pandue<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">CSRF prend avantage des applications web qui permettent aux attaquants de pr\u00e9dire les d\u00e9tails d\u2019une action particuli\u00e8re.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">D\u00e9tection de la vuln\u00e9rabilit\u00e9<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #f00;\" bgcolor=\"#F00\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">Facile<br \/>\n<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">Les attaquants peuvent cr\u00e9er des pages web malicieuses qui g\u00e9n\u00e8rent des requ\u00eates forg\u00e9es, qui ne sont pas distinguables des l\u00e9gitimes. La d\u00e9tection des CSRF est assez facile via un test de p\u00e9n\u00e9tration ou analyse de code.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">Impact technique<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #ff950e;\" bgcolor=\"#FF950E\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">Moyen<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">Les attaquants peuvent faire ex\u00e9cuter n\u2019importe quelle type de fonctionnalit\u00e9 pr\u00e9sente dans le SI, \u00e0 laquelle la victime aurait acc\u00e8s.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084D1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000000;\">Impact m\u00e9tier<br \/>\n<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #cccccc;\" bgcolor=\"#CCCCCC\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000000;\">_<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">Tout d\u00e9pend de l\u2019action ex\u00e9cut\u00e9e.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-203 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf.png\" alt=\"Attaque CSRF \/ XSRF\" width=\"693\" height=\"473\" srcset=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf.png 693w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf-300x205.png 300w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf-624x426.png 624w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/a><\/p>\n<h2>Exemples d\u2019attaques<\/h2>\n<h3><strong>Cas fictifs<\/strong><\/h3>\n<h4>Service bancaire<\/h4>\n<p style=\"text-align: justify;\">Imaginez un bouton sur votre site de banque en ligne permettant d\u2019effectuer un virement sur un compte ext\u00e9rieur ayant pour URL :<\/p>\n<p><a href=\"http:\/\/www.mabanque.com\/transaction.php?dest=ID12345&amp;somme=2000\">http:\/\/www.mabanque.com\/transaction.php?dest=ID12345&amp;somme=2000<\/a><\/p>\n<p style=\"text-align: justify;\">O\u00f9 le param\u00e8tre \u00ab\u00a0dest\u00a0\u00bb est l\u2019identifiant du destinataire de la transaction et \u00ab\u00a0somme\u00a0\u00bb, le montant de la transaction. Admettons ensuite que Mme Lambda soit all\u00e9e voir ses relev\u00e9s bancaires et que sa session soit toujours active. Imaginons ensuite qu\u2019un utilisateur malveillant, connaissant la victime, ait d\u00e9cid\u00e9 de lui envoyer un mail (en usurpant l\u2019adresse e-mail d\u2019un de ses proches).<br \/>\nL\u2019e-mail contiendrait un lien vers cette action et avec pour destinataire son identifiant de compte. Si Mme Lambda clique sur le lien, alors la transaction sera effectu\u00e9e contre son gr\u00e9.<br \/>\nSi cette attaque est coupl\u00e9e d\u2019une attaque XSS (en utilisant par exemple une balise img) sur le site bancaire, alors chaque utilisateur connect\u00e9 sur le site sera victime de ce d\u00e9tournement de fonds.<\/p>\n<h4>Webmail<\/h4>\n<p style=\"text-align: justify;\">M\u00eame exemple pour un Webmail, avec un lien permettant de supprimer vos e-mails.<\/p>\n<h4>Bot<\/h4>\n<p style=\"text-align: justify;\">Un robot qui a pour objectif de polluer votre base de donn\u00e9es en \u201cspammant\u201d. Le robot r\u00e9cup\u00e8rerait votre page une fois, analyserait les champs de formulaire, et enverrait une multitude de requ\u00eates avec des valeurs quelconques.<\/p>\n<h4>Social Network<\/h4>\n<p style=\"text-align: justify;\">De nos jours, tout le monde conna\u00eet les boutons de partage li\u00e9s aux r\u00e9seaux sociaux (tel que les boutons \u00ab\u00a0J\u2019aime\u00a0\u00bb de Facebook, \u201c+1\u201d de Google+, etc). Ces boutons permettent d\u2019ajouter une<br \/>\npage \u00e0 nos favoris, sauf qu\u2019ici l\u2019utilisateur est conscient de l\u2019action effectu\u00e9e en cliquant dessus.<br \/>\nOr, il est possible pour un utilisateur malintentionn\u00e9 de faire d\u00e9river le comportement initial de ces boutons pour porter atteinte \u00e0 la victime via des techniques d\u00eetes de \u201cPhishing\u201d ou \u201cClickjacking\u201d :<\/p>\n<h5><i>Cas n\u00b01<\/i><\/h5>\n<p style=\"text-align: justify;\">Imaginons qu\u2019un utilisateur malveillant conserve le rendu visuel de ce bouton mais en changeant son comportement (ex: modifiction de l\u2019URL), un utilisateur habitu\u00e9 pourrait cliquer instinctivement (par habitude) dessus et ex\u00e9cuterai l\u2019action forg\u00e9e par le pirate (ex: redirection sur un site pi\u00e9g\u00e9, exploitation de la session active de la victime, etc.).<\/p>\n<h5><em>Cas n\u00b02<\/em><\/h5>\n<p style=\"text-align: justify;\">Ce bouton pourrait \u00eatre camoufl\u00e9 (sans changer son URL) par dessus un \u00e9l\u00e9ment banal et cliquable sur un site vuln\u00e9rable. Lorsque l\u2019utilisateur pensera cliquer sur un \u00e9l\u00e9ment souhait\u00e9, il cliquera en fait sur l\u2019\u00e9l\u00e9ment cach\u00e9 par le pirate et ex\u00e9cutera par cons\u00e9quent l\u2019action forg\u00e9e. Ce camouflage est possible par exemple via la directive CSS : \u201copacity: 0.001;\u201d, l\u2019\u00e9l\u00e9ment cach\u00e9 sera invisible pour une personne, mais la propagation des \u00e9v\u00e8nements au sein du DOM restera identique.<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Anecdote :<\/span> Une bien mauvaise blague serait de mettre en pratique cette technique sur un site de vid\u00e9os douteuses en streaming \u00e0 la place du bouton lecture&#8230; L\u2019impact ici est un pr\u00e9judice moral. Ce genre de d\u00e9rive \u00e0 \u00e9t\u00e9 point\u00e9e du doigt dans un article du site \u201cPcInpact\u201d, cf : <a href=\"http:\/\/www.pcinpact.com\/news\/62398-bouton-jaime-like-facebook-cdrole.htm\">http:\/\/www.pcinpact.com\/news\/62398-bouton-jaime-like-facebook-cdrole.htm<\/a> ou encore :<br \/>\n<a href=\"http:\/\/www.mycommunitymanager.fr\/arretez-de-vous-faire-avoir-sur-facebook\/\">http:\/\/www.mycommunitymanager.fr\/arretez-de-vous-faire-avoir-sur-facebook\/<\/a><\/p>\n<h3><strong>Cas pratique<\/strong><\/h3>\n<h4>Site \u00e9ditorial<\/h4>\n<p style=\"text-align: justify;\">Prenons pour exemple un site \u00e9ditorial lambda disposant :<\/p>\n<p style=\"text-align: justify;\">&#8211; D\u2019une gestion des commentaires enrichie, autorisant certains \u00e9l\u00e9ments HTML tels que les paragraphes, les sauts de ligne, les images, etc.<br \/>\n&#8211; D\u2019une interface d\u2019administration des commentaires (ou chaque commentaire est affich\u00e9 directement une fois connect\u00e9 sur cette interface)<br \/>\n&#8211; D\u2019une URL de d\u00e9connexion du type : http:\/\/www.foobar.net\/logout.php<\/p>\n<p style=\"text-align: justify;\">Il suffirait que l\u2019utilisateur malveillant injecte dans son commentaire une image qui pointerait vers l\u2019URL de d\u00e9connexion pour emp\u00eacher toute administration du site : l\u2019utilisateur serait d\u00e9connect\u00e9 tout de suite apr\u00e8s s\u2019\u00eatre connect\u00e9.<br \/>\n<span style=\"text-decoration: underline;\">Exemple de commentaire :<\/span><br \/>\nCeci est une attaque CSRF<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque :<\/span> Il s\u2019agit ici d\u2019une attaque CSRF qui passe par une \u201cstored XSS\u201d (ou XSS stock\u00e9e).<\/p>\n<h2>Comment se prot\u00e9ger ?<\/h2>\n<p style=\"text-align: justify;\">Le projet OWASP nous propose deux approches pour se pr\u00e9munir des attaques CSRF : <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet\">https:\/\/www.owasp.org\/index.php\/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet<\/a><\/p>\n<p style=\"text-align: justify;\">La 1\u00e8re solution est bas\u00e9e sur le \u201cdesign pattern\u201d (ou patron de conception) : \u201cSynchonizer Token Pattern\u201d (cf : <a href=\"http:\/\/www.corej2eepatterns.com\/Design\/PresoDesign.htm\">http:\/\/www.corej2eepatterns.com\/Design\/PresoDesign.htm<\/a>), cette solution requiert la session d\u2019un utilisateur courant. Il s\u2019agit de la solution pr\u00e9conis\u00e9e.<\/p>\n<p style=\"text-align: justify;\">Dans un deuxi\u00e8me temps vous seront propos\u00e9es plusieurs autres solutions ou visions du probl\u00e8mes dans le cas d\u2019une application \u201csans-\u00e9tat\u201d, c&rsquo;est-\u00e0-dire qu\u2019aucun param\u00e8tre n\u2019est conserv\u00e9 depuis le serveur pour le client (ne n\u00e9cessite pas de session). La plupart de ces solutions ne vous prot\u00e8geront pas int\u00e9gralement.<\/p>\n<h3><strong>Protection CSRF en mode Stateful<\/strong><\/h3>\n<h4>Synchronizer Token Pattern<\/h4>\n<p style=\"text-align: justify;\">Il s\u2019agit d\u2019ajouter un param\u00e8tre obligatoire correspondant \u00e0 un identifiant d\u2019acc\u00e8s unique et non pr\u00e9dictible, reg\u00e9n\u00e9r\u00e9 pour chaque action utilisateur et par utilisateur (le plus efficace), ou pour chaque session (le moins efficace). Cet identifiant d\u2019acc\u00e8s (ou \u201claisser-passer\u201d) est nomm\u00e9 \u201cjeton CSRF\u201d. Ce m\u00e9canisme doit \u00eatre impl\u00e9ment\u00e9 sur chaque action qui d\u00e9pend de l\u2019utilisateur qui l\u2019ex\u00e9cute (d\u00e9connexion, modification\/suppression de donn\u00e9es en BDD, etc.) et doit avoir une dur\u00e9e de validit\u00e9 limit\u00e9e dans le temps.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-204 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf2.png\" alt=\"Synchronizer Token Pattern\" width=\"745\" height=\"506\" srcset=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf2.png 745w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf2-300x204.png 300w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2015\/03\/csrf2-624x424.png 624w\" sizes=\"auto, (max-width: 745px) 100vw, 745px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Concr\u00e8tement, lorsque l\u2019utilisateur appelle une page, le serveur g\u00e9n\u00e8re un jeton CSRF unique et non pr\u00e9dictible, et le stock en session (ainsi que l\u2019IP publique depuis laquelle le client \u00e0 interrog\u00e9 le serveur ou tout autre discriminant li\u00e9 \u00e0 l\u2019identit\u00e9 de l\u2019internaute. Bien qu&rsquo;optionnelle, c\u2019est une condition suppl\u00e9mentaire pour accro\u00eetre la s\u00e9curit\u00e9 en s\u2019assurant que le jeton \u00e0 \u00e9t\u00e9 \u00e9mis par la bonne personne).<\/p>\n<p style=\"text-align: justify;\">&#8211; Si c\u2019est un formulaire, le jeton CSRF est ins\u00e9r\u00e9 dans le corps du formulaire (dans un input de type hidden). Lorsque l\u2019utilisateur validera ce formulaire, le jeton CSRF sera renvoy\u00e9 au serveur qui v\u00e9rifiera sa validit\u00e9 et le p\u00e9rimera, un jeton invalide emp\u00eachera le traitement des donn\u00e9es envoy\u00e9es par le formulaire.<br \/>\n&#8211; Si ce n\u2019est pas un formulaire (acc\u00e8s \u00e0 une page priv\u00e9e par exemple), c\u2019est lors de la g\u00e9n\u00e9ration du lien vers l\u2019action que le jeton sera g\u00e9n\u00e9r\u00e9, stock\u00e9 en session et ajout\u00e9 dans l\u2019URL en tant que param\u00e8tre. Sans jeton, la ressource ne sera donc pas accessible.<\/p>\n<p style=\"text-align: justify;\">Gr\u00e2ce \u00e0 ce m\u00e9canisme, il devient inutile pour un utilisateur malveillant de forger des liens pour pi\u00e9ger quelqu\u2019un, car le jeton CSRF change et est propre \u00e0 un utilisateur. De plus, cela permet aussi de prot\u00e9ger contre le spam, dans le cas o\u00f9 un robot ne r\u00e9cup\u00e8rerait qu\u2019une seule fois la page (il ne r\u00e9cup\u00e8rerait donc le jeton CSRF qu\u2019une fois et celui-ci sera p\u00e9rim\u00e9 apr\u00e8s la premi\u00e8re tentative de spam).<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Note :<\/span> Autre id\u00e9e int\u00e9ressante pour se pr\u00e9munir contre une grande majorit\u00e9 de robots, il suffirait d\u2019ajouter un champ factice dans chaque formulaire. Ce champ, pour que le formulaire soit valide, doit toujours \u00eatre vide. Il pourrait avoir pour label : \u00ab \u00c0 ne pas remplir \u00bb et serait cach\u00e9 en CSS. Un utilisateur non-averti, avec le CSS activ\u00e9, ne pourrait pas voir ce champ, il ne le remplirait donc pas. Si le CSS est d\u00e9sactiv\u00e9, le label aura un r\u00f4le informatif. Un robot qui analyse la page ne pourrait savoir qu\u2019il s\u2019agit d\u2019un champ factice, il le remplirait donc avant de soumettre le formulaire. Autre avantage en terme d\u2019accessibilit\u00e9 gr\u00e2ce \u00e0 cette solution : les logiciels de lecture de site web sp\u00e9cialis\u00e9s pour les personnes aveugles liraient le label du champ du formulaire permettant de pr\u00e9venir l\u2019utilisateur.<\/p>\n<h4>Double Submit Pattern<\/h4>\n<p>Toutefois, si notre application est vuln\u00e9rable aux attaques de type XSS, il serait possible pour un attaquant de voler notre cookie de session puis d\u2019ex\u00e9cuter rapidement une action pour \u201cconsommer\u201d le jeton CSRF avant l\u2019utilisateur initial (soit une \u201ctiming-attack\u201d).<br \/>\nPour \u00e9viter ce type de d\u00e9rive intervient un dernier concept, celui de \u201cdouble soumission\u201d (ou \u201cdouble submit pattern\u201d) qui consiste \u00e0 complexifier la solution pr\u00e9c\u00e9dente.<br \/>\nEn plus d\u2019envoyer le jeton CSRF via un param\u00e8tre dans la requ\u00eate HTTP, il faudra ajouter cette notion dans un cookie avec imp\u00e9rativement l\u2019attribut \u201cHTTPOnly\u201c.<br \/>\nAjouter ce dernier attribut permet d\u2019emp\u00eacher Javascript d\u2019acc\u00e9der au cookie et de r\u00e9cup\u00e9rer son contenu (via la directive \u201cdocument.cookie\u201d) pour l\u2019envoyer sur un serveur pirate.<br \/>\nCe cookie sera reg\u00e9n\u00e9r\u00e9 \u00e0 chaque fois qu\u2019un jeton sera cr\u00e9\u00e9 et, id\u00e9alement, il devrait s\u2019agir du cookie de session qui contiendra par exemple l\u2019identifiant de session concat\u00e9n\u00e9 au jeton CSRF.<\/p>\n<p>Pour r\u00e9sumer, pour un utilisateur sp\u00e9cifique et pour chaque action seront g\u00e9n\u00e9r\u00e9s :<\/p>\n<ul>\n<li style=\"text-align: justify;\">un jeton CSRF<\/li>\n<li style=\"text-align: justify;\">un nouveau cookie<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Les deux seront valid\u00e9s c\u00f4t\u00e9 serveur. Si l\u2019un des deux n\u2019est pas envoy\u00e9 ou invalide, l\u2019utilisateur ne pourra pas acc\u00e9der \u00e0 la ressource. Cette solution compl\u00e8te est celle pr\u00e9conis\u00e9e !<\/p>\n<h4>Mauvaises pratiques<\/h4>\n<ul>\n<li>Envoyer au client le jeton CSRF dans les URLs (en GET)<\/li>\n<\/ul>\n<p>Cela faciliterait sa r\u00e9cup\u00e9ration, si un administrateur r\u00e9seau malveillant venait \u00e0 sniffer le r\u00e9seau avec des outils comme Wireshark, Ethercap, tcpdump, etc. Ensuite, il est pr\u00e9f\u00e9rable que le nom du param\u00e8tre du jeton CSRF ne soit pas explicite, et ce afin de complexifier sa r\u00e9cup\u00e9ration si un robot venait \u00e0 percer le code d\u2019une page. Toutefois, mieux vaut un jeton CSRF dans l\u2019URL qu\u2019aucune protection.<\/p>\n<ul>\n<li>Mettre en cache de mani\u00e8re globale le contenu HTML (formulaires et\/ou liens) contenant un jeton CSRF<\/li>\n<\/ul>\n<p>Et ceci car ce contenu HTML est sp\u00e9cifique \u00e0 un utilisateur donn\u00e9 ! La premi\u00e8re fois que la page est affich\u00e9e, le contenu HTML g\u00e9n\u00e9r\u00e9 est stock\u00e9 dans le cache avec le jeton CSRF de l\u2019utilisateur en cours. Si un autre utilisateur vient apr\u00e8s, la page venant du cache sera affich\u00e9e avec le jeton CSRF du 1er utilisateur. En soumettant le formulaire ou en cliquant sur un lien prot\u00e9g\u00e9, le jeton ne correspond pas et une erreur est lev\u00e9e. Seuls les formulaires qui ne d\u00e9pendent pas de l\u2019utilisateur qui les rempliront doivent \u00eatre mis en cache de mani\u00e8re globale.<\/p>\n<h3><strong>Protection CSRF en mode Stateless<\/strong><\/h3>\n<p>D\u2019autres petits m\u00e9canismes permettent de se pr\u00e9munir de cette vuln\u00e9rabilit\u00e9 (de mani\u00e8re plus ou moins compl\u00e8te) comme :<\/p>\n<h4>V\u00e9rifier le header HTTP Referer<\/h4>\n<p>Autant il est possible de facilement usurper ce header via diff\u00e9rents outils (client http, web-proxy, navigateur, etc.) autant il est impossible de le faire dans le cas d\u2019une attaque CSRF standard (vecteur de type XSS ou phishing). C\u2019est pourquoi v\u00e9rifier la valeur de ce header peut aider \u00e0 se pr\u00e9munir de ces attaques. Cette solution n\u2019est toutefois pas suffisante dans le cas o\u00f9 un bot de type client HTTP appellerait directement une ressource sp\u00e9cifique et vuln\u00e9rable aux CSRF.<\/p>\n<p>De plus, cette solution ne fonctionnera carr\u00e9ment pas dans plusieurs cas (cf: <a href=\"http:\/\/en.wikipedia.org\/wiki\/HTTP_referer#Referer_hiding\">http:\/\/en.wikipedia.org\/wiki\/HTTP_referer#Referer_hiding<\/a>) :<\/p>\n<ul>\n<li>Le header Referer n\u2019est pas envoy\u00e9 dans un contexte HTTPS pour des raisons de s\u00e9curit\u00e9<\/li>\n<li>Depuis HTML5, l\u2019attribut HTML rel = \u00ab\u00a0noreferrer\u00a0\u00bb d\u2019une balise &lt;a&gt; permet de demander au navigateur de ne pas envoyer le Referer si l\u2019internaute clique sur le lien.<\/li>\n<\/ul>\n<h4>V\u00e9rifier le header HTTP Origin<\/h4>\n<p>Ce header \u00e0 \u00e9t\u00e9 impl\u00e9ment\u00e9 r\u00e9cemment pour se pr\u00e9munir contre les attaques CSRF et autres attaques types \u201ccross-domain\u201d (cf: <a href=\"https:\/\/wiki.mozilla.org\/Security\/Origin\">https:\/\/wiki.mozilla.org\/Security\/Origin<\/a>)<br \/>\nIl permet d\u2019emp\u00eacher l\u2019acc\u00e8s \u00e0 une ressource depuis une origine non autoris\u00e9e.<\/p>\n<p>Un exemple d\u2019impl\u00e9mentation d\u00e9taill\u00e9 est disponible dans l\u2019article suivant : <a href=\"http:\/\/deadliestwebattacks.com\/2013\/08\/08\/and-they-have-a-plan\/\">http:\/\/deadliestwebattacks.com\/2013\/08\/08\/and-they-have-a-plan\/<\/a><\/p>\n<h3 style=\"text-align: justify;\"><strong>Challenge-Response<\/strong><\/h3>\n<p style=\"text-align: justify;\">D\u2019autres solutions alternatives sont possibles, telles que :<\/p>\n<ul style=\"text-align: justify;\">\n<li>Utilisation de Captcha<\/li>\n<li>R\u00e9-authenfication<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Elles permettent de mani\u00e8re d\u00e9tourn\u00e9e de se pr\u00e9munir des attaques CSRF mais sont trop intrusives pour l\u2019utilisateur final et nuisent \u00e0 l\u2019UX.<br \/>\nDe plus, si la connexion n\u2019est pas en HTTPS, pousser l\u2019utilisateur \u00e0 se r\u00e9-authentifier n\u2019est pas une bonne pratique, car les identifiants circuleront une fois de plus en clair sur le r\u00e9seau.<\/p>\n<h2>Exemple d\u2019impl\u00e9mentation du token et outil<\/h2>\n<h3><strong>Framework Symfony 1.X<\/strong><\/h3>\n<p>Dans le framework Symfony en version 1.X, le m\u00e9canisme anti-CSRF mis en place est le Synchronizer Token Pattern sans double-submit. Et la solution n\u2019a \u00e9t\u00e9 impl\u00e9ment\u00e9e que dans le cadre de formulaire HTML.<\/p>\n<p>Lors de la cr\u00e9ation d\u2019une application, Symfony g\u00e9n\u00e8re al\u00e9atoirement une passe-phrase secr\u00e8te modifiable par projet ou par application dans le fichier \/apps\/%app_name%\/config\/settings.yml :<\/p>\n<pre><code class=\"yml\">all:\r\n  .settings:\r\n    csrf_secret: XxXxXxXxXxXxXxXxXxXxXxXxXxXxXx\r\n<\/code><\/pre>\n<p style=\"text-align: justify;\">Cette passe-phrase va \u00eatre concat\u00e9n\u00e9e \u00e0 l\u2019identifiant de session de l\u2019utilisateur et concat\u00e9n\u00e9e au nom de la classe du formulaire puis hash\u00e9e en MD5. Ce hash repr\u00e9sente le jeton CSRF final (ce jeton est unique pour un utilisateur donn\u00e9 et pour un formulaire donn\u00e9) avant d\u2019\u00eatre stock\u00e9 dans la session utilisateur ainsi que dans le formulaire (dans un champ input de type hidden).<\/p>\n<p style=\"text-align: justify;\">Ci-joint, le code de la fonction de g\u00e9n\u00e9ration du jeton CSRF de Symfony :<\/p>\n<pre><code class=\"php\">public function getCSRFToken($secret = null)\r\n<em>\/\/ [...]\r\nreturn md5($secret.session_id().get_class($this)); <\/em><\/code><\/pre>\n<h3><strong>Framework Symfony 2.X<\/strong><\/h3>\n<p style=\"text-align: justify;\">Dans le framework Symfony en version 2.X, le m\u00e9canisme anti-CSRF mis en place est le m\u00eame que Symfony 1.X : \u201cSynchronizer Token Pattern\u201d sans double-submit. L\u2019impl\u00e9mentation diff\u00e8re toutefois l\u00e9g\u00e8rement sur cette nouvelle version du framework.<\/p>\n<p style=\"text-align: justify;\">La g\u00e9n\u00e9ration du token est d\u00e9finie dans la classe \u201cDefaultCsrfProvider\u201d :<\/p>\n<pre style=\"text-align: justify;\"><code class=\"php\">public function generateCsrfToken($intention)\r\n<em>return sha1($this-&gt;secret.$intention.$this-&gt;getSessionId());<\/em> <\/code><\/pre>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque :<\/span> Le param\u00e8tre de la fonction (ou $intention) corresponds \u00e0 l\u2019identifiant unique de la fonctionnalit\u00e9 qui n\u00e9cessite et utilise le token g\u00e9n\u00e9r\u00e9. Ce param\u00e8tre est utilis\u00e9 pour la g\u00e9n\u00e9ration et la validation du token, par cons\u00e9quent il ne devra pas \u00eatre al\u00e9atoire !<br \/>\nPar contre, rien de vous emp\u00eache d\u2019ajouter d\u2019autres param\u00e8tres dynamiques concat\u00e9n\u00e9s \u00e0 $intention pour le rendre moins pr\u00e9dictible et donc plus robuste.<\/p>\n<p style=\"text-align: justify;\">Comme dans Symfony 1.X, un param\u00e8tre statique d\u00e9finie dans le fichier \u201cparameters.yml\u201d est utilis\u00e9 lors de la g\u00e9n\u00e9ration du token (il est sp\u00e9cifique au projet) :<code class=\"yml\"><\/code><\/p>\n<pre style=\"text-align: justify;\"><code class=\"yml\">parameters:\r\n  secret: my_secret_param_for_csrf_token <\/code><\/pre>\n<h3><strong>Magento<\/strong><\/h3>\n<p style=\"text-align: justify;\">Dans cette solution e-commerce impl\u00e9ment\u00e9e en PHP est utilis\u00e9 nativement un m\u00e9canisme de g\u00e9n\u00e9ration de token CSRF sur l\u2019ensemble des URLs de l\u2019interface d\u2019administration.<br \/>\nAinsi chaque ressource est prot\u00e9g\u00e9e contre ce genre d\u2019attaque, mais aucune d\u2019elle n\u2019est accessible directement sans passer par le contr\u00f4leur principal.<\/p>\n<h3><strong>OWASP CSRF Guard<\/strong><\/h3>\n<p style=\"text-align: justify;\">Le projet OWASP propose des snippets (morceaux de code) pour faciliter l\u2019impl\u00e9mentation de m\u00e9canismes anti-CSRF disponibles pour les langages :<\/p>\n<ul>\n<li>Java : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_CSRFGuard_Project\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_CSRFGuard_Project<\/a><\/li>\n<li>PHP : <a href=\"https:\/\/www.owasp.org\/index.php\/PHP_CSRF_Guard\">https:\/\/www.owasp.org\/index.php\/PHP_CSRF_Guard<\/a><\/li>\n<li>.NET : <a href=\"https:\/\/www.owasp.org\/index.php\/.Net_CSRF_Guard\">https:\/\/www.owasp.org\/index.php\/.Net_CSRF_Guard<\/a><\/li>\n<\/ul>\n<h3><strong>OWASP Enterprise Security API (OWASP ESAPI)<\/strong><\/h3>\n<p style=\"text-align: justify;\">L\u2019ESAPI est une librairie libre, open-source, qui impl\u00e9mente de nombreux m\u00e9canismes de s\u00e9curit\u00e9 afin de faciliter le travail d\u2019un d\u00e9veloppeur averti sur des probl\u00e9matiques de s\u00e9curit\u00e9.<br \/>\nCette API est disponible dans de nombreuses langues mais c&rsquo;est en Java qu&rsquo;elle semble la plus mature (contrairement \u00e0 son homologue en PHP).<br \/>\nLe projet est disponible \u00e0 cette adresse : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Enterprise_Security_API#tab=Home\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Enterprise_Security_API#tab=Home<\/a><br \/>\nUn exemple d\u2019utilisation de l\u2019API pour la g\u00e9n\u00e9ration de token CSRF en Java est disponible \u00e0 cette adresse : <a href=\"http:\/\/www.jtmelton.com\/2010\/05\/16\/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf\/\">http:\/\/www.jtmelton.com\/2010\/05\/16\/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf\/<\/a><\/p>\n<h2>Comment d\u00e9tecter si notre application est vuln\u00e9rable ?<\/h2>\n<p style=\"text-align: justify;\">Comme de nombreux outils d\u00e9di\u00e9s \u00e0 l\u2019automatisation des tests d\u2019intrusions, le projet OWASP ZAP (Zed Attack Proxy) dispose de d\u00e9tecteurs de dispositif anti-CSRF distingu\u00e9 en deux cat\u00e9gories :<\/p>\n<ul>\n<li><span style=\"text-decoration: underline;\">Mode passif :<\/span><br \/>\nIl s\u2019agit d\u2019un filtre passif appliqu\u00e9 sur chaque r\u00e9ponse HTTP. Il v\u00e9rifie si dans son contenu un formulaire existe avec un champs g\u00e9n\u00e9r\u00e9 de mani\u00e8re al\u00e9atoire lors de chaque appels avec un nouveau contexte (sans conserver la session).<\/li>\n<li><span style=\"text-decoration: underline;\">Mode actif :<\/span><br \/>\nUn module permet de simplifier la g\u00e9n\u00e9ration de requ\u00eates HTTP d\u2019exploitation d\u2019un CSRF, un exemple d\u2019utilisation est disponible \u00e0 cette adresse : <a href=\"http:\/\/resources.infosecinstitute.com\/csrf-proof-of-concept-with-owasp-zap\/\">http:\/\/resources.infosecinstitute.com\/csrf-proof-of-concept-with-owasp-zap\/<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">L\u2019utilisation de ces outils permet de cibler rapidement (dans l\u2019application audit\u00e9e) : un formulaire vuln\u00e9rable aux attaques CSRF, mais ne remplace pas, je trouve, les tests manuels : plus complet, qui ne serait pas limit\u00e9 seulement aux formulaires, qui ne serait pas sujet \u00e0 de r\u00e9sultats \u201cfaux n\u00e9gatif\u201d.<\/p>\n<p style=\"text-align: justify;\">Cet outil est disponible depuis cette adresse : <a href=\"https:\/\/www.owasp.org\/index.php\/OWASP_Zed_Attack_Proxy_Project\">https:\/\/www.owasp.org\/index.php\/OWASP_Zed_Attack_Proxy_Project<\/a><\/p>\n<p><span style=\"text-decoration: underline;\">Remarque :<\/span> Il ne s\u2019agit pas d\u2019un outil d\u00e9di\u00e9 uniquement \u00e0 la recherche de faille CSRF mais bien d\u2019une solution compl\u00e8te, tr\u00e8s utile pour assister le Pentester lors d\u2019un audit.<\/p>\n<h2>R\u00e9f\u00e9rences et Webographie<\/h2>\n<ul>\n<li>OWASP Top10 : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project<\/a><\/li>\n<li>OWASP CSRF : <a href=\"https:\/\/www.owasp.org\/index.php\/CSRF\">https:\/\/www.owasp.org\/index.php\/CSRF<\/a><\/li>\n<li>OWASP CSRF Prevention Cheat Sheet: <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet\">https:\/\/www.owasp.org\/index.php\/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet<\/a><\/li>\n<li>Synchronizer Token Pattern : <a href=\"http:\/\/www.corej2eepatterns.com\/Design\/PresoDesign.htm\">http:\/\/www.corej2eepatterns.com\/Design\/PresoDesign.htm<\/a><\/li>\n<li>Wikip\u00e9dia &#8211; HTTP Referer &#8211; Hiding cases : <a href=\"http:\/\/en.wikipedia.org\/wiki\/HTTP_referer#Referer_hiding\">http:\/\/en.wikipedia.org\/wiki\/HTTP_referer#Referer_hiding<\/a><\/li>\n<li>Wiki Mozilla &#8211; Origin HTTP Header : <a href=\"https:\/\/wiki.mozilla.org\/Security\/Origin\">https:\/\/wiki.mozilla.org\/Security\/Origin<\/a><\/li>\n<li>Exemple d\u2019impl\u00e9mentation Origin HTTP Header : <a href=\"http:\/\/deadliestwebattacks.com\/2013\/08\/08\/and-they-have-a-plan\/\">http:\/\/deadliestwebattacks.com\/2013\/08\/08\/and-they-have-a-plan\/<\/a><\/li>\n<li>OWASP ESAPI : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Enterprise_Security_API\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Enterprise_Security_API<\/a><\/li>\n<li>OWASP ESAPI, exemple d\u2019impl\u00e9mentation : <a href=\"http:\/\/www.jtmelton.com\/2010\/05\/16\/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf\/\">http:\/\/www.jtmelton.com\/2010\/05\/16\/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf\/<\/a><\/li>\n<li>OWASP ZAP CSRF PoC : <a href=\"http:\/\/resources.infosecinstitute.com\/csrf-proof-of-concept-with-owasp-zap\/\">http:\/\/resources.infosecinstitute.com\/csrf-proof-of-concept-with-owasp-zap\/<\/a><\/li>\n<li>OWASP ZAP : <a href=\"https:\/\/www.owasp.org\/index.php\/OWASP_Zed_Attack_Proxy_Project\">https:\/\/www.owasp.org\/index.php\/OWASP_Zed_Attack_Proxy_Project<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, j\u2019aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33],"tags":[19,20,26,28,45,46,30],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-veille-technique","tag-cross-site-request-forgery","tag-csrf-2","tag-owasp","tag-security","tag-securite-applicative","tag-securite-des-systemes-dinformation","tag-xsrf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>OWASP \/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)<\/title>\n<meta name=\"description\" content=\"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OWASP \/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"og:description\" content=\"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/\" \/>\n<meta property=\"og:site_name\" content=\"Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"article:published_time\" content=\"2014-06-01T21:18:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-11-13T14:13:08+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.clever-age.com\/wp-content\/uploads\/sites\/2\/2013\/09\/owasp_logo_150_150.jpg\" \/>\n<meta name=\"author\" content=\"Mickael FRANC\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mickaelfranc\" \/>\n<meta name=\"twitter:site\" content=\"@mickaelfranc\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mickael FRANC\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/\"},\"author\":{\"name\":\"Mickael FRANC\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"headline\":\"OWASP \\\/ Cross-site request forgery (CSRF ou XSRF)\",\"datePublished\":\"2014-06-01T21:18:19+00:00\",\"dateModified\":\"2015-11-13T14:13:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/\"},\"wordCount\":3583,\"commentCount\":0,\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/csrf.png\",\"keywords\":[\"Cross-site Request Forgery\",\"CSRF\",\"OWASP\",\"S\u00e9curit\u00e9\",\"S\u00e9curit\u00e9 Applicative\",\"S\u00e9curit\u00e9 des syst\u00e8mes d'information\",\"XSRF\"],\"articleSection\":[\"Veille technique\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/\",\"url\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/\",\"name\":\"OWASP \\\/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/csrf.png\",\"datePublished\":\"2014-06-01T21:18:19+00:00\",\"dateModified\":\"2015-11-13T14:13:08+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"description\":\"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/csrf.png\",\"contentUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/csrf.png\",\"width\":150,\"height\":150,\"caption\":\"CSRF \\\/ XSRF\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/06\\\/25\\\/owasp-cross-site-request-forgery-csrf-ou-xsrf\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OWASP \\\/ Cross-site request forgery (CSRF ou XSRF)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/\",\"name\":\"Mickael FRANC (aka Pilebones)\",\"description\":\"Tech Blog &gt; \\\/ dev\\\/security\\\/adminsys\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\",\"name\":\"Mickael FRANC\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"caption\":\"Mickael FRANC\"},\"description\":\"Software engineer @Cisco Lyon (FR) - Enthusiast about IT security (@OWASP) - Archlinux - Golang, Bash, Embedded &amp; dev system - Paragliding remaining time\",\"sameAs\":[\"https:\\\/\\\/www.mickael-franc.fr\\\/\",\"mickael.fnc\",\"https:\\\/\\\/x.com\\\/mickaelfranc\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCWrM3BvHAkXTEMZvWmfoaAA\"],\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/author\\\/mfranc\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OWASP \/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)","description":"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/","og_locale":"fr_FR","og_type":"article","og_title":"OWASP \/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)","og_description":"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","og_url":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/","og_site_name":"Mickael FRANC (aka Pilebones)","article_published_time":"2014-06-01T21:18:19+00:00","article_modified_time":"2015-11-13T14:13:08+00:00","og_image":[{"url":"http:\/\/blog.clever-age.com\/wp-content\/uploads\/sites\/2\/2013\/09\/owasp_logo_150_150.jpg","type":"","width":"","height":""}],"author":"Mickael FRANC","twitter_card":"summary_large_image","twitter_creator":"@mickaelfranc","twitter_site":"@mickaelfranc","twitter_misc":{"\u00c9crit par":"Mickael FRANC","Dur\u00e9e de lecture estim\u00e9e":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#article","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/"},"author":{"name":"Mickael FRANC","@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"headline":"OWASP \/ Cross-site request forgery (CSRF ou XSRF)","datePublished":"2014-06-01T21:18:19+00:00","dateModified":"2015-11-13T14:13:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/"},"wordCount":3583,"commentCount":0,"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png","keywords":["Cross-site Request Forgery","CSRF","OWASP","S\u00e9curit\u00e9","S\u00e9curit\u00e9 Applicative","S\u00e9curit\u00e9 des syst\u00e8mes d'information","XSRF"],"articleSection":["Veille technique"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/","url":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/","name":"OWASP \/ Cross-site request forgery (CSRF ou XSRF) - Mickael FRANC (aka Pilebones)","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#primaryimage"},"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png","datePublished":"2014-06-01T21:18:19+00:00","dateModified":"2015-11-13T14:13:08+00:00","author":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"description":"Dans ce troisi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles CSRF au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","breadcrumb":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#primaryimage","url":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png","contentUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/csrf.png","width":150,"height":150,"caption":"CSRF \/ XSRF"},{"@type":"BreadcrumbList","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/06\/25\/owasp-cross-site-request-forgery-csrf-ou-xsrf\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mickael-franc.fr\/blog\/"},{"@type":"ListItem","position":2,"name":"OWASP \/ Cross-site request forgery (CSRF ou XSRF)"}]},{"@type":"WebSite","@id":"https:\/\/www.mickael-franc.fr\/blog\/#website","url":"https:\/\/www.mickael-franc.fr\/blog\/","name":"Mickael FRANC (aka Pilebones)","description":"Tech Blog &gt; \/ dev\/security\/adminsys","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mickael-franc.fr\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c","name":"Mickael FRANC","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","caption":"Mickael FRANC"},"description":"Software engineer @Cisco Lyon (FR) - Enthusiast about IT security (@OWASP) - Archlinux - Golang, Bash, Embedded &amp; dev system - Paragliding remaining time","sameAs":["https:\/\/www.mickael-franc.fr\/","mickael.fnc","https:\/\/x.com\/mickaelfranc","https:\/\/www.youtube.com\/channel\/UCWrM3BvHAkXTEMZvWmfoaAA"],"url":"https:\/\/www.mickael-franc.fr\/blog\/author\/mfranc\/"}]}},"_links":{"self":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":8,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":254,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions\/254"}],"wp:attachment":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}