Le blog des décideurs du digital sur toutes les tendances tech, architecture, organisation et produit

Des milliers de sites e-commerce mis en péril par une faille dans Prestashop

Prestashop est un CMS (système de gestion de contenu) open-source permettant de créer des sites e-commerce. Il est utilisé sur plus de 300 000 projets.

Une faille a été découverte fin 2021. Elle permet à un attaquant de récupérer et de contrôler des données sensibles (carte bleue, adresse, email, mots de passe, …), surtout si ces dernières n’ont pas été correctement chiffrées. On vous explique cette faille !

🕵️ Explication de la faille

La faille découverte est une injection SQL, c’est-à-dire une faille permettant à un utilisateur de lire ou de modifier la base de données. Elle survient lorsque les informations entrées par un utilisateur sont utilisées directement lors de la requête faite au serveur sans vérification préalable.

Par exemple, dans un usage normal de mon application, je veux permettre la récupération des informations sur un utilisateur grâce à son prénom. Je peux fournir cette requête :

Prestashop1-1

En language SQL, compris par les bases de données, cela donne: "SELECT * FROM Users WHERE first_name=" + user_input

Prestashop2-1

Si mon utilisateur écrit “Jeanne” dans le champ fourni, il récupérera l’ensemble des données de l’utilisateur dont le prénom est Jeanne.

Si l’entrée n’est pas vérifiée, l’utilisateur n’est pas contraint de s’arrêter à un nom et il peut rajouter des conditions:

Prestashop 3-1

Ce qui donne en SQL: SELECT * FROM Users WHERE first_name=Jeanne OR 1=1

Prestashop4-1

La deuxième partie est toujours vraie donc la requête va renvoyer l’ensemble des informations des utilisateurs de la base de données. Ainsi, Jeanne ne récupère pas seulement ses données personnelles, mais également celles de tous les autres.

🕵️ Source de la faille

Dans le code de Prestashop, on peut voir une requête permettant d’ordonner un résultat selon la colonne voulue par l’utilisateur: “SELECT * FROM Users ORDER BY” + orderBy . L’attaquant, en ajoutant un point virgule, peut faire plusieurs requêtes à la suite. Par exemple, en envoyant `first_name`; SELECT * FROM Payment_cards, il obtient la requête :

Prestashop5-1

Il peut ainsi récupérer l'ensemble des cartes bancaires.

Afin de contrôler les entrées utilisateurs, Prestashop utilise une expression régulière ou regex. C’est un ensemble de règles permettant de vérifier la construction d’un texte. Prenons un premier exemple pour bien comprendre: La regex a[bc] correspond aux chaines de caractères ab et ac.

Il existe également des groupes de caractères. Par exemple, la regex [a-zA-Z0-9]+ match l’ensemble des caractères alphanumérique en majuscule et minuscule autant de fois que voulu.

Prestashop6-1Utilisateur3 respecte cette regex. Utilis@teur-2! renverra trois éléments respectant la regex: Utilis, teur et 2 mais le mot total n’est pas valide. Vous pouvez tester en ligne de nombreux autres mots respectants ou non cette regex, notamment avec regex101.

La regex présente dans le code initial de Prestashop est la suivante: ^[a-zA-Z0-9.!_-]+$:

Prestashop7En réalité, cette regex n’était pas utilisée pour valider le champ “orderBy” qui est à la source de la faille.

Pour corriger cette faille, les développeurs ont ajouté une fonction de validation avec une regex plus complète et en ont profité pour améliorer la regex.

Prestashop8

Passons aux choses sérieuses et regardons la correction mise en place ! La validation du champ est faite grâce à cette regex: ^(?:(`?)[\w!_-]+\1\.)?(?:(`?)[\w!_-]+\2)$. Elle fait peur !

Heureusement, nous allons la décortiquer ensemble :

Prestashop9

Quelques exemples de mots validés avec la regex:

  • `user-info`.`first_name`
  • !user.`first_name`
  • USER.1_name
  • last_name

Alors que ceux-ci ne sont pas valides:

  • `user-info.first_name`: Les guillemets inversées ne sont pas fermées pour chaque groupe.
  • user.em@il: Le symbole @ n’est pas autorisé
  • user-info.first.name: Seul un groupe de mot avec un point est accepté

Cette regex est alors utilisée pour valider l’entrée utilisateur avant de la passer dans la requête SQL. La vulnérabilité est corrigée !

A cause de cette vulnérabilité, des attaquants ont pu accéder à des données sensibles de milliers de sites e-commerce. La version de correction de Prestashop a été publiée en décembre 2021.

Cette faille va plus loin et a également permis à des attaquants d’exécuter du code sur le serveur des applications e-commerce, ce qui leur a permis d’ajouter de faux formulaires de récupération de cartes bancaires.

On vous en parle dans 3 semaines ! 

🛡 Comment se protéger ?

En tant que développeur utilisant Prestashop:

  • Mettre à jour Prestashop et passer minimum à la version 1.7.8.7

En tant que développeur:

  • Vérifier les inputs utilisateurs, notamment grâce à des regex
  • Utiliser des requêtes paramétrées plutôt que de concaténer les paramètres utilisateurs
  • Hasher les mots de passe avec un algorithme de cryptographie avancé (Argon2, bcrypt)
  • Chiffrer les données sensibles et ne pas conserver la clef de chiffrement dans la même base de données.
  • Ne pas enregistrer l’ensemble des informations et toujours redemander le code CVV associé à la carte lors du paiement

🏹 Pour aller plus loin

Nous avons pour ambition de sécuriser le web et pour atteindre cet objectif, nous avons besoin de vous ! Si vous avez des questions, des suggestions ou le moindre doute, n'hésitez pas à contacter notre équipe sécurité, par mail security@theodo.fr.

 

Topics: Sécurité, e-commerce