Un captcha, ça ne s’improvise pas !

Ou une raison supplémentaire de questionner la légitimité de la consultation pour le nom de la région Alsace Champagne-Ardenne Lorraine.

J’ai pris la décision de ne publier cette analyse qu’une fois la consultation terminée, afin que celle-ci ne puisse être utilisée pour en fausser les résultats (qui ont déjà suffisamment de raisons de ne pas être représentatifs de grand chose).

Commençant par aborder les premières incohérences de cette consultation. Pas de restriction géographique, pas de limitation IP. Comme l’ont relevé bien des internautes, une même IP peut donc voter plusieurs fois, tant que celle-ci est capable de fournir plusieurs adresses mails différentes (il semble tout de même y avoir une limitation sur les adresses mails. Ouf !). Le manque de limitation sur l’IP peut se comprendre, il faut que tous les personnes d’un foyer soit en mesure de participer. Pas de limitation géographique ou de « coupon » de vote pour les citoyens concernés, les internautes du monde entier pouvaient donc venir donner leur avis. Intrigué par ces manquements, j’ai donc décidé d’aller jeter un œil au site (Outre le fait d’être un peu concerné puisque résidant à Strasbourg).

Consultation Nom Région ACAL

Voici donc à quoi ressemblait le site. La présentation est aérée, ça semble plutôt fonctionnel. Pourtant, mon regard est attiré par le bas de page, son message « (afin de lutter contre les robots et de prouver que vous êtes une personne) » et son captcha. A première vue, le captcha semble relativement simple, pas de texte compliqué et quasi illisible, juste un calcul à effectuer. Par ailleurs, cette petite phrase invite au défi. J’aime m’interroger sur la possibilité technique d’écrire des programmes idiots arrivant à résoudre ces types de captcha. Captchas sensés démontrer l’humanité de la personne derrière son écran. Je me plonge donc dans le code HTML de la page.

Code Source ACAL

Cela semble prometteur, à première vue les chiffres sont en clair dans le code HTML de la page, cela ne serait pas compliqué d’écrire un programme capable de récupérer ces deux chiffres et de calculer leur somme. J’aligne quelques lignes de codes dans un fichier et effectue une requête pour récupérer la page HTML. En effet, un programme ne voit pas toujours la même chose que l’utilisateur dans son navigateur, puisque le programme ne lit que le code « fixe » (HTML) et pas le résultat de la page après application du code « dynamique » (Javascript). Premier problème, voici ce qu’obtiendrait un robot :

<font style="font-size: 10pt; ">
  <p>
    <b><span class='replace-uklsf'>...</span> </b>+ <b><span class='replace-hyj5s'>...</span> </b>=
  </p>
</font>

Cela correspond bien à ce que nous avons vu, mais les deux nombres sont absents. Mazette ! Ce n’est pas si simple. L’exploration continue donc, direction les requêtes qu’échangent mon navigateur et le serveur.

Requête ACAL

Bingo ! Deux requêtes POST vers une url « Calculate » avec dans le json de réponse, une propriété « val » contenant un nombre. Après vérification, il y a bien correspondance entre les deux nombres affichés et les deux nombres renvoyés par ces deux requêtes. A ce stade, nous pouvons déjà considérer le captcha comme cassable. Trois étapes à priori : un premier appel à la page source pour initialiser l’ensemble, puis deux appels à l’url Calculate pour générer et recevoir les nombres constituants le captcha. Petit tour dans les paramètres envoyés au serveur pour recevoir un nombre; rien de bien compliqué, mais mince, un identifiant est envoyé avec. Il faudrait en envoyer un correct.

Heureusement, il s’avère que toutes les données nécessaires sont présentes dans le code source de la page, en tant que champs cachés du formulaire :

<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"><input data-val="true" data-val-required="Le champ ActionType est requis." id="ActionType" name="ActionType" type="hidden" value="input" />    <input type="hidden" name="ssvnavaction" id="ssvnavaction" />
    <input type="hidden" value="o5p7DcO/zqORK6a2RWCAXFvt85DoxPdJFdEATdwClO6O8BBbj/js52nRPS/TJrHpuGZDxA5W5eYnI1DqUnR3knIfZ9Pho5FMBh7FCcHaToH0Ein0n/cU8Q==" name="CS" />
    <input type="hidden" value="VpPirTZBEer24wFkST5ex755MO5uWkdsokLpPrCX3Hg=" name="ssvtoken" />

Cela nous indique également qu’il faudrait fournir ces données lors de la requête de soumission du vote. Avec ces informations, il devient clair que le captcha est cassable (D’après le site, on pourrait ainsi considéré tout programme étant capable de le résoudre comme humain). Continuons notre étude.

Passons maintenant à la requête de soumission. Au préalable, un petit tour sur le web pour obtenir une adresse mail temporaire et pouvoir ainsi vérifier l’arrivée du mail contenant le lien de validation.

Paramètre ACAL

Regardons plus en détails les paramètres. Les paramètres « CS » et « ssvtoken » sont récupérables dans le code source de la page, pas de problème. Intéressons-nous au reste et en particulier, les paramètres numérotés : 1, 2, 3, 14, 15.
Le paramètre 1 correspond au choix du nom de région : 1 pour Rhin-Champagne, 2 pour Acalie, 3 pour Nouvelle Austrasie et 4 pour Grand-Est. Sur cette illustration, j’ai donc cliquer sur Grand-Est.
Le paramètre 2 correspond bien évidemment à l’adresse mail.
Le paramètre 3 correspond au résultat du captcha.
Les deux paramètres suivants 14 et 15 sont particulièrement intéressants, puisqu’ils correspondent, tenez-vous bien … aux deux nombres composants notre captcha !!
En résumé, nous avons donc une requête prétendument protégée par un captcha, dont les paramètres sont les composants du captcha ainsi que le résultat. Pour ceux qui n’aurait pas encore saisi le problème, cela pourrait signifier que les deux requêtes précédentes (url Calculate) sont inutiles et qu’il suffit que la valeur des trois paramètres soit cohérentes. Par exemple, si nous choisissions 1 et 2 comme nombre pour le capchta, alors le troisième paramètre vaudrait 3. En l’occurrence, le capchta ne sert donc à rien, puisqu’il suffit de choisir correctement les nombres envoyés au serveur. Je modifie la requête dans mon navigateur, réalise un test rapide et, surprise ! C’est bien ce qui se produit. Il ne serait même plus nécessaire de réaliser les deux requêtes d’obtention des nombres du captcha, il est simplement possible de les choisir soi-même.

Laissons maintenant libre cours à notre imagination… Nous avons constater que le captcha présent sur le site est d’ordre cosmétique, celui-ci étant aisément contournable. Nous savons qu’il n’y a pas de limitation sur les IPs. Par ailleurs, Google fournit une fonctionnalité particulière d’alias avec ces comptes mails. En combinant tous ces éléments, il aurait donc été tout à fait possible d’écrire un programme envoyant des votes pour une adresse gmail avec un alias différent à chaque vote. Il aurait ensuite suffit d’un programme parallèle lisant les mails arrivant dans la boîte mail principale et récupérant le lien pour valider le vote. Heureusement que cette consultation ne concernait qu’un nom de région !

En définitive, qu’est-ce que cela signifie ? Avec cet article, j’espère vous avoir convaincu de la facilité avec laquelle une personne aux intentions obscures était en mesure de réaliser un programme pour voter en masse lors de la consultation publique pour le choix du nom de la région Alsace Champagne-Ardenne Lorraine. Ici encore, nous constatons que la réalisation d’un captcha n’est pas un problème trivial. Pour finir, j’ajouterais que ce n’est pas en regroupant des entités et en laissant les citoyens du monde entier choisir le nom de l’entité résultante que l’on va créer un sentiment d’appartenance. L’Histoire, les caractéristiques géographiques, les traditions, les particularités culturelles, sont autant d’éléments qu’un simple regroupement administratif ne saura pas ni ne pourra pas gommer.

Anonyme

Auteur/autrice : Victor

Ingénieur en informatique de formation et de métier, j’administre ce serveur et son domaine et privilégie l'utilisation de logiciels libres au quotidien. Je construis progressivement mon "cloud" personnel service après service pour conserver un certain contrôle sur mes données numériques.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *