Le script d'analytics que personne n'a ajouté : démasquer un skimmer de cartes
Le défi
Un script vole les cartes des clients Fernhill. Décode l'adresse cachée dans son code. Trouve le domaine qui reçoit les cartes.
Ce que tu vas apprendre
- Comprendre comment un skimmer Magecart exfiltre les données de carte
- Lire du JavaScript obfusqué pour retrouver son ordre de décodage
- Décoder à la suite des codes de caractères, une inversion et du base64
- Nommer les contrôles qui bloquent l'injection de scripts tiers
Compétences testées
Prérequis
- Ce qu'est le base64
- Lire une ligne de JavaScript
Comment ça marche
Un skimmer web est du JavaScript injecté dans une page de paiement, généralement via un script tiers compromis ou un CMS piraté. Il lit les champs de la carte pendant que le client tape et les envoie à l'attaquant, souvent sous la forme new Image().src = url + data, une simple requête d'image qui ne laisse aucune trace dans les logs de la boutique.
Pour passer une revue rapide, l'adresse de collecte est obfusquée. Ici c'est du base64, inversé, puis stocké sous forme de codes de caractères. Le code de décodage est livré sur la même ligne : en le lisant de l'intérieur vers l'extérieur, on obtient la recette exacte, fromCharCode, reverse(), atob.
Erreurs fréquentes
- Appuyer d'abord sur base64. Les nombres sont des codes de caractères : décode-les avec decimal avant tout le reste.
- Sauter l'inversion. Une chaîne qui commence par
==est du base64 écrit à l'envers : le padding se trouve à la fin. - Répondre google.com. Le domaine ne fait qu'imiter celui de Google : lis-le exactement.
Comment s'en protéger
- Sers le paiement avec une
Content-Security-Policystricte : allowlist surscript-src, et limiteconnect-srcetimg-srcpour que les données volées n'aient nulle part où aller. - Charge les scripts tiers avec Subresource Integrity (hashes
integrity=). - Surveille les changements de scripts sur les pages de paiement (exigences 6.4.3 et 11.6.1 de PCI DSS 4.0).
- Préfère les champs de paiement hébergés dans une iframe du prestataire de paiement, hors de portée des scripts de la page.