{"id":2057,"date":"2016-04-05T20:00:13","date_gmt":"2016-04-05T19:00:13","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=2057"},"modified":"2016-04-05T14:17:35","modified_gmt":"2016-04-05T13:17:35","slug":"un-captcha-ca-ne-simprovise-pas","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=2057","title":{"rendered":"Un captcha, \u00e7a ne s&rsquo;improvise pas !"},"content":{"rendered":"<p>Ou une raison suppl\u00e9mentaire de questionner la l\u00e9gitimit\u00e9 de la consultation pour le nom de la r\u00e9gion Alsace Champagne-Ardenne Lorraine.<\/p>\n<p>J&rsquo;ai pris la d\u00e9cision de ne publier cette analyse qu&rsquo;une fois la consultation termin\u00e9e, afin que celle-ci ne puisse \u00eatre utilis\u00e9e pour en fausser les r\u00e9sultats (qui ont d\u00e9j\u00e0 suffisamment de raisons de ne pas \u00eatre repr\u00e9sentatifs de grand chose).<\/p>\n<p>Commen\u00e7ant par aborder les premi\u00e8res incoh\u00e9rences de cette consultation. Pas de restriction g\u00e9ographique, pas de limitation IP. Comme l&rsquo;ont relev\u00e9 bien des internautes, une m\u00eame IP peut donc voter plusieurs fois, tant que celle-ci est capable de fournir plusieurs adresses mails diff\u00e9rentes (il semble tout de m\u00eame y avoir une limitation sur les adresses mails. Ouf !). Le manque de limitation sur l&rsquo;IP peut se comprendre, il faut que tous les personnes d&rsquo;un foyer soit en mesure de participer. Pas de limitation g\u00e9ographique ou de \u00ab\u00a0coupon\u00a0\u00bb de vote pour les citoyens concern\u00e9s, les internautes du monde entier pouvaient donc venir donner leur avis. Intrigu\u00e9 par ces manquements, j&rsquo;ai donc d\u00e9cid\u00e9 d&rsquo;aller jeter un \u0153il au site (Outre le fait d&rsquo;\u00eatre un peu concern\u00e9 puisque r\u00e9sidant \u00e0 Strasbourg).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2067\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site1-1024x709.png\" alt=\"Consultation Nom R\u00e9gion ACAL\" width=\"840\" height=\"582\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site1-1024x709.png 1024w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site1-300x208.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site1-768x532.png 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site1.png 1063w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<p>Voici donc \u00e0 quoi ressemblait le site. La pr\u00e9sentation est a\u00e9r\u00e9e, \u00e7a semble plut\u00f4t fonctionnel. Pourtant, mon regard est attir\u00e9 par le bas de page, son message \u00ab\u00a0<em>(afin de lutter contre les robots et de prouver que vous \u00eates une personne)<\/em>\u00a0\u00bb et son captcha. A premi\u00e8re vue, le captcha semble relativement simple, pas de texte compliqu\u00e9 et quasi illisible, juste un calcul \u00e0 effectuer. Par ailleurs, cette petite phrase invite au d\u00e9fi. J&rsquo;aime m&rsquo;interroger sur la possibilit\u00e9 technique d&rsquo;\u00e9crire des programmes idiots arrivant \u00e0 r\u00e9soudre ces types de captcha. Captchas sens\u00e9s d\u00e9montrer l&rsquo;humanit\u00e9 de la personne derri\u00e8re son \u00e9cran. Je me plonge donc dans le code HTML de la page.<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2068\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/code1-1024x475.png\" alt=\"Code Source ACAL\" width=\"840\" height=\"390\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/code1-1024x475.png 1024w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/code1-300x139.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/code1-768x356.png 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/code1.png 1141w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<p>Cela semble prometteur, \u00e0 premi\u00e8re vue les chiffres sont en clair dans le code HTML de la page, cela ne serait pas compliqu\u00e9 d&rsquo;\u00e9crire un programme capable de r\u00e9cup\u00e9rer ces deux chiffres et de calculer leur somme. J&rsquo;aligne quelques lignes de codes dans un fichier et effectue une requ\u00eate pour r\u00e9cup\u00e9rer la page HTML. En effet, un programme ne voit pas toujours la m\u00eame chose que l&rsquo;utilisateur dans son navigateur, puisque le programme ne lit que le code \u00ab\u00a0fixe\u00a0\u00bb (HTML) et pas le r\u00e9sultat de la page apr\u00e8s application du code \u00ab\u00a0dynamique\u00a0\u00bb (Javascript). Premier probl\u00e8me, voici ce qu&rsquo;obtiendrait un robot :<\/p>\n<pre>&lt;font style=\"font-size: 10pt; \"&gt;\r\n  &lt;p&gt;\r\n    &lt;b&gt;&lt;span class='replace-uklsf'&gt;...&lt;\/span&gt; &lt;\/b&gt;+ &lt;b&gt;&lt;span class='replace-hyj5s'&gt;...&lt;\/span&gt; &lt;\/b&gt;=\r\n  &lt;\/p&gt;\r\n&lt;\/font&gt;<\/pre>\n<p>Cela correspond bien \u00e0 ce que nous avons vu, mais les deux nombres sont absents. Mazette ! Ce n&rsquo;est pas si simple. L&rsquo;exploration continue donc, direction les requ\u00eates qu&rsquo;\u00e9changent mon navigateur et le serveur.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2069\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2-1024x456.png\" alt=\"Requ\u00eate ACAL\" width=\"840\" height=\"374\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2-1024x456.png 1024w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2-300x133.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2-768x342.png 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2-1200x534.png 1200w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site2.png 1598w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<p>Bingo ! Deux requ\u00eates POST vers une url \u00ab\u00a0<em>Calculate<\/em>\u00a0\u00bb avec dans le json de r\u00e9ponse, une propri\u00e9t\u00e9 \u00ab\u00a0<em>val<\/em>\u00a0\u00bb contenant un nombre. Apr\u00e8s v\u00e9rification, il y a bien correspondance entre les deux nombres affich\u00e9s et les deux nombres renvoy\u00e9s par ces deux requ\u00eates. A ce stade, nous pouvons d\u00e9j\u00e0 consid\u00e9rer le captcha comme cassable. Trois \u00e9tapes \u00e0 priori : un premier appel \u00e0 la page source pour initialiser l&rsquo;ensemble, puis deux appels \u00e0 l&rsquo;url <em>Calculate<\/em> pour g\u00e9n\u00e9rer et recevoir les nombres constituants le captcha. Petit tour dans les param\u00e8tres envoy\u00e9s au serveur pour recevoir un nombre; rien de bien compliqu\u00e9, mais mince, un identifiant est envoy\u00e9 avec. Il faudrait en envoyer un correct.<\/p>\n<p>Heureusement, il s&rsquo;av\u00e8re que toutes les donn\u00e9es n\u00e9cessaires sont pr\u00e9sentes dans le code source de la page, en tant que champs cach\u00e9s du formulaire :<\/p>\n<pre>&lt;form action=\"\/surveyserver\/s\/alca\/Nomregion2016\/questionnaire.htm\" data-ajax=\"true\" data-ajax-begin=\"OnInputBegin\" data-ajax-failure=\"OnInputFailure\" data-ajax-method=\"POST\" data-ajax-success=\"OnInputSuccess\" data-calculate-url=\"\/surveyserver\/Render\/Calculate\" enctype=\"multipart\/form-data\" id=\"ssvform\" method=\"post\"&gt;&lt;input data-val=\"true\" data-val-required=\"Le champ ActionType est requis.\" id=\"ActionType\" name=\"ActionType\" type=\"hidden\" value=\"input\" \/&gt;\u00a0\u00a0 \u00a0&lt;input type=\"hidden\" name=\"ssvnavaction\" id=\"ssvnavaction\" \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;input type=\"hidden\" value=\"o5p7DcO\/zqORK6a2RWCAXFvt85DoxPdJFdEATdwClO6O8BBbj\/js52nRPS\/TJrHpuGZDxA5W5eYnI1DqUnR3knIfZ9Pho5FMBh7FCcHaToH0Ein0n\/cU8Q==\" name=\"CS\" \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;input type=\"hidden\" value=\"VpPirTZBEer24wFkST5ex755MO5uWkdsokLpPrCX3Hg=\" name=\"ssvtoken\" \/&gt;<\/pre>\n<p>Cela nous indique \u00e9galement qu&rsquo;il faudrait fournir ces donn\u00e9es lors de la requ\u00eate de soumission du vote. Avec ces informations, il devient clair que le captcha est cassable (D&rsquo;apr\u00e8s le site, on pourrait ainsi consid\u00e9r\u00e9 tout programme \u00e9tant capable de le r\u00e9soudre comme humain). Continuons notre \u00e9tude.<\/p>\n<p>Passons maintenant \u00e0 la requ\u00eate de soumission. Au pr\u00e9alable, un petit tour sur le web pour obtenir une adresse mail temporaire et pouvoir ainsi v\u00e9rifier l&rsquo;arriv\u00e9e du mail contenant le lien de validation.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2070\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site3.png\" alt=\"Param\u00e8tre ACAL\" width=\"549\" height=\"310\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site3.png 549w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2016\/04\/site3-300x169.png 300w\" sizes=\"auto, (max-width: 549px) 85vw, 549px\" \/><\/p>\n<p>Regardons plus en d\u00e9tails les param\u00e8tres. Les param\u00e8tres \u00ab\u00a0CS\u00a0\u00bb et \u00ab\u00a0ssvtoken\u00a0\u00bb sont r\u00e9cup\u00e9rables dans le code source de la page, pas de probl\u00e8me. Int\u00e9ressons-nous au reste et en particulier, les param\u00e8tres num\u00e9rot\u00e9s : 1, 2, 3, 14, 15.<br \/>\nLe param\u00e8tre 1 correspond au choix du nom de r\u00e9gion : 1 pour Rhin-Champagne, 2 pour Acalie, 3 pour Nouvelle Austrasie et 4 pour Grand-Est. Sur cette illustration, j&rsquo;ai donc cliquer sur Grand-Est.<br \/>\nLe param\u00e8tre 2 correspond bien \u00e9videmment \u00e0 l&rsquo;adresse mail.<br \/>\nLe param\u00e8tre 3 correspond au r\u00e9sultat du captcha.<br \/>\nLes deux param\u00e8tres suivants 14 et 15 sont particuli\u00e8rement int\u00e9ressants, puisqu&rsquo;ils correspondent, tenez-vous bien &#8230; aux deux nombres composants notre captcha !!<br \/>\nEn r\u00e9sum\u00e9, nous avons donc une requ\u00eate pr\u00e9tendument prot\u00e9g\u00e9e par un captcha, dont les param\u00e8tres sont les composants du captcha ainsi que le r\u00e9sultat. Pour ceux qui n&rsquo;aurait pas encore saisi le probl\u00e8me, cela pourrait signifier que les deux requ\u00eates pr\u00e9c\u00e9dentes (url Calculate) sont inutiles et qu&rsquo;il suffit que la valeur des trois param\u00e8tres soit coh\u00e9rentes. Par exemple, si nous choisissions 1 et 2 comme nombre pour le capchta, alors le troisi\u00e8me param\u00e8tre vaudrait 3. En l\u2019occurrence, le capchta ne sert donc \u00e0 rien, puisqu&rsquo;il suffit de choisir correctement les nombres envoy\u00e9s au serveur. Je modifie la requ\u00eate dans mon navigateur, r\u00e9alise un test rapide et, surprise ! C&rsquo;est bien ce qui se produit. Il ne serait m\u00eame plus n\u00e9cessaire de r\u00e9aliser les deux requ\u00eates d&rsquo;obtention des nombres du captcha, il est simplement possible de les choisir soi-m\u00eame.<\/p>\n<p>Laissons maintenant libre cours \u00e0 notre imagination&#8230; Nous avons constater que le captcha pr\u00e9sent sur le site est d&rsquo;ordre cosm\u00e9tique, celui-ci \u00e9tant ais\u00e9ment contournable. Nous savons qu&rsquo;il n&rsquo;y a pas de limitation sur les IPs. Par ailleurs, Google fournit une fonctionnalit\u00e9 particuli\u00e8re d&rsquo;<a href=\"https:\/\/support.google.com\/mail\/answer\/12096?hl=fr\" target=\"_blank\">alias<\/a> avec ces comptes mails. En combinant tous ces \u00e9l\u00e9ments, il aurait donc \u00e9t\u00e9 tout \u00e0 fait possible d&rsquo;\u00e9crire un programme envoyant des votes pour une adresse gmail avec un alias diff\u00e9rent \u00e0 chaque vote. Il aurait ensuite suffit d&rsquo;un programme parall\u00e8le lisant les mails arrivant dans la bo\u00eete mail principale et r\u00e9cup\u00e9rant le lien pour valider le vote. Heureusement que cette consultation ne concernait qu&rsquo;un nom de r\u00e9gion !<\/p>\n<p>En d\u00e9finitive, qu&rsquo;est-ce que cela signifie ? Avec cet article, j&rsquo;esp\u00e8re vous avoir convaincu de la facilit\u00e9 avec laquelle une personne aux intentions obscures \u00e9tait en mesure de r\u00e9aliser un programme pour voter en masse lors de la consultation publique pour le choix du nom de la r\u00e9gion Alsace Champagne-Ardenne Lorraine. Ici encore, nous constatons que <a href=\"http:\/\/www.unicoda.com\/?p=1591\" target=\"_blank\">la r\u00e9alisation d&rsquo;un captcha n&rsquo;est pas un probl\u00e8me trivial<\/a>. Pour finir, j&rsquo;ajouterais que ce n&rsquo;est pas en regroupant des entit\u00e9s et en laissant les citoyens du monde entier choisir le nom de l&rsquo;entit\u00e9 r\u00e9sultante que l&rsquo;on va cr\u00e9er un sentiment d&rsquo;appartenance. L&rsquo;Histoire, les caract\u00e9ristiques g\u00e9ographiques, les traditions, les particularit\u00e9s culturelles, sont autant d&rsquo;\u00e9l\u00e9ments qu&rsquo;un simple regroupement administratif ne saura pas ni ne pourra pas gommer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ou une raison suppl\u00e9mentaire de questionner la l\u00e9gitimit\u00e9 de la consultation pour le nom de la r\u00e9gion Alsace Champagne-Ardenne Lorraine. J&rsquo;ai pris la d\u00e9cision de ne publier cette analyse qu&rsquo;une fois la consultation termin\u00e9e, afin que celle-ci ne puisse \u00eatre utilis\u00e9e pour en fausser les r\u00e9sultats (qui ont d\u00e9j\u00e0 suffisamment de raisons de ne pas &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=2057\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Un captcha, \u00e7a ne s&rsquo;improvise pas !&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,213],"tags":[270,179,271],"class_list":["post-2057","post","type-post","status-publish","format-standard","hentry","category-info","category-pensees-libres","tag-acal","tag-captcha","tag-grand-est"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2057"}],"version-history":[{"count":8,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2057\/revisions"}],"predecessor-version":[{"id":2077,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2057\/revisions\/2077"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}