[Boulanger] La tournée des XSS, après Darty c’est au tour de Boulanger !
Les 2 failles de sécurité que l'on retrouve majoritairement sur le WEB sont les injections SQL et les failles XSS.
Petit survol de ces 2 vulnérabilités
L'injection SQL, que l'on connaît également sous le nom de SQLI, permet à un pirate d'extraire, d'injecter ou de modifier des données d'un site internet.
Par exemple, celui-ci serait en capacité de récupérer les noms d'utilisateurs, mot de passe et coordonnées, des personnes inscrites sur un site.
La faille XSS quant à elle, ne permet pas directement d'accéder à des données sensibles. Elle permet cependant, de manière permanente ou non, à un pirate de modifier une page d'un site internet (ou d'une application si celle-ci exploite du HTML, Javascript, CSS ...)
À l'issue de cette modification de page, un hacker, pourra tromper un utilisateur et lui dérober ses données.
Il pourra par exemple ajouter un faux formulaire de connexion, ou bien simuler un faux jeu-concours, ...
Pire encore, il pourrait par l'intermédiaire d'un script non visible par l'utilisateur s'envoyer les informations de connexion de celui-ci (sa session).
Les lacunes en sécurité portant sur l'XSS
Les développeurs Web se tournent aujourd'hui vers des sites ou des applications Web dynamiques !
Pour les néophytes je vais simplifier.
Il y a quelques années et aujourd'hui encore un peu, les sites que vous consultiez, étaient des enchaînements de page Web ...
Par enchaînement, j'entends que pour chaque action / clic vous faisiez énormément travailler les machines sur lesquelles étaient stockés les sites Web, mais pas seulement !
Les navigateurs et votre connexion internet aussi !
Ils devaient chaque fois aller chercher & recharger des pages entières...
Aujourd'hui, les sites sont très souvent optimisés pour vous éviter d'avoir justement à recharger entièrement des pages.
Le javascript (langage de programmation) permet de n'aller chercher que les informations dont vous avez besoin, et de les rajouter dynamiquement dans votre page sans rechargement ...
Pour ceux qui ont suivi des cours, soit directement sur les bancs de l'école, soit dans le cadre de formation courtes dispensées par leurs entreprises, vous aurez constaté que certains aspects sur la sécurités ne sont pas souvent évoqués ...
On vous parle beaucoup du traitement et de la sécurité des données côté serveur.
Avec des fonctions de sécurité type addslashes, HTMLEntities, escapeshellarg, ...
Mais pour ces sites dynamiques, qui exploitent parfois les url avec du Javascript, et qui réutilisent des données, il faut également penser à se protéger contre les attaques
L'exemple de Boulanger
J'avais publié il y a peu une liste de failles sur le site de Darty, l'une d'entre elles est du même type que celle que je vais vous présenter, car elle concernait également un petit catalogue produit en flash ...
Aussi on constate dans cette url, 3 variables :
- onglet
- page
- idprod
En modifiant les valeurs de celle-ci par d'autres données, rien ne change au premier abord
onglet=11111&page=2222&IDPROD=33333
Mais en regardant directement le code source de la page chargée "dynamiquement" ...
Je vois ceci
Les valeurs des variables sont réutilisées directement dans le code source ...
Jusque-là, rien de grave, car elles sont peut-être protégées ....
Voyons donc ce qu'il se passe si je mets un peu de HTML dans l'une des variables
onglet="><h1>test</h1>&page=2222&IDPROD=33333
Le code s’exécute bien.
Sur ma page, s'affiche en grandes lettres le mot "test" !
La valeur de la variable "onglet" a bien été injecté dans la page ...
En regardant de plus près ce qui se produit en Javascript qu'est-ce que l'on remarque ...
Voici un schéma technique ... de ce qu'il se passe ...
Un peu d'optimisation
Le code n'est pas très optimisé ... un peu d'optimisation réduirait la taille du code et rendrait sa taille plus lisible ...
Actualiser les fonctions utilisées
Juste à la lecture rapide du code j'ai constaté un "unescape" ...
Comme indiqué ci-dessous, cette fonction est obsolète, et il faut utiliser les nouvelles : decodeURI ou decodeURIComponent
The unescape() function was deprecated in JavaScript version 1.5. Use decodeURI() or decodeURIComponent() instead.
Sécuriser le code !
Écrire soi-même du HTML avec du Javascript est une mauvaise pratique ...
De prime abord c'est sale, et ça n'est pas forcément très lisible, et ensuite ça induit malheureusement des failles de sécurité ...
Mozilla interdit d'ailleurs dans les extensions de son navigateur firefox l'utilisation de innerHTML ... pour justement éviter ces pratiques ...
C'est ce qui m'a d'ailleurs permis d'en prendre conscience.
Un code sale !
Voici donc le code fourni par Boulanger.com et ses conséquences
Un code Propre
Voici un code source, "propre", "optimisé" et en partie "sécurisé".
Le tout livré avec ses conséquences.
Vous comprendrez assez facilement que le code source généré est presque le même!
Sauf que lorsque les choses ne sont pas bien faites, elles introduisent une ou plusieurs failles qui permettront à un hacker d'injecter du code malveillant qui sera alors, exécuté et nocif pour l'utilisateur !
Dans l'autre cas, si les choses sont bien faites, alors le hacker pourra injecter autant de code qu'il voudra, mais celui-ci ne sera pas exécuté ... il sera inoffensif.
Conclusion
J'aime tirer des conclusions à ce genre de chose, lorsque vous utilisez des données qui ne sont pas fournies par votre serveur, et qui sont variables, comme des données qui proviennent d'un formulaire ou d'une URL (barre d'adresse), il est primordial de les sécuriser, en testant qu'elles n'ont pas de contenu HTML, Javascript, ...
Il est également important d'éviter de générer du HTML sans utiliser les fonctions natives de Javascript qui permettent de le faire de manière "sécurisé"
Enfin, continuez à protéger votre partie Backend, car pour être en position de force face aux pirates, il faut aussi bien sécuriser la partie "backend" (serveur / non visible par l'utilisateur), que la partie "front-end", ce que voit l'utilisateur.
@Boulanger ;)
Un indice dans la page devrait vous aider à trouver la page concerné ^^
Sinon contactez moi