Skip to main content
Blog
Blog Attacks

Attaques Magecart expliquées : comment le web skimming fonctionne dans le navigateur

Explication claire du web skimming Magecart : comment le code entre, comment il lit votre formulaire et comment il exfiltre les données carte sans se voir.

Jul 13, 2026 10 min read
Attaques Magecart expliquées : comment le web skimming fonctionne dans le navigateur

Magecart est du web skimming qui s'exécute dans le navigateur. Du JavaScript malveillant atterrit sur une page de checkout ou de login, lit ce que le visiteur tape dans le formulaire et envoie une copie à un serveur contrôlé par l'attaquant. Le paiement légitime passe toujours, donc du point de vue de vos serveurs cela ressemble à une journée normale de transactions propres. Tout a l'air normal pendant que les données carte partent, et cet écart est tout le problème.

Cet article explique la mécanique pour quelqu'un qui rencontre la menace pour la première fois. Ce n'est pas une politique de prévention ni la taxonomie formjacking-vs-Magecart. Il parcourt la séquence réelle : comment le code entre, comment il capture les données et comment il sort. Comprenez ces trois mouvements et vous comprenez pourquoi un WAF, un SIEM et un processeur de paiement peuvent tous être au vert pendant qu'un skimmer tourne. cside surveille directement cette couche navigateur, observe chaque script pendant qu'il s'exécute et signale le moment où l'un commence à lire des champs ou à appeler un domaine qu'il n'avait jamais touché auparavant, ce qui est la base pour détecter Magecart en temps réel plutôt qu'après la breach.

L'attaque en trois mouvements

Toute campagne de skimming, quel que soit le groupe qui la mène, se ramène au même cycle. Enlevez le branding et vous obtenez trois mouvements.

MouvementCe qui se passeOù cela vit
InjecterL'attaquant parvient à faire charger son JavaScript sur votre pageUn fichier first-party compromis, un tag tiers ou un tag manager
CapturerLe script lit les données de carte ou d'identifiants depuis le formulaireLe DOM et les event listeners de formulaire dans le navigateur
ExfiltrerUne copie des données est envoyée au serveur de l'attaquantUne requête sortante du navigateur vers un domaine de l'attaquant

Le reste de cet article parcourt chaque mouvement dans l'ordre, parce que l'ordre est ce qui rend l'attaque invisible.

Mouvement 1 : comment le code arrive sur la page

L'attaquant a besoin que son JavaScript s'exécute dans le navigateur du visiteur. Il dispose de trois routes courantes vers la page, aucune ne nécessite de toucher à la logique de votre serveur d'origine.

  1. Un fichier auto-hébergé. Il obtient un accès en écriture via un plugin vulnérable, un CMS obsolète ou un login admin volé, puis ajoute quelques lignes à un fichier JavaScript que vous livrez déjà. Le changement est petit et souvent dissimulé dans du code légitime, donc un diff paraît anodin.
  2. Un script tiers. Il compromet un vendor dont vous chargez le script directement avec <script src>, tel qu'un widget d'analytics, de chat ou de test A/B. Désormais le skimmer est livré depuis le domaine du vendor à chaque client qui charge votre page, et il n'est jamais dans votre dépôt à trouver, ce qui explique pourquoi sécuriser les scripts tiers est une discipline à part entière.
  3. Un tag manager. Il prend le contrôle d'un conteneur Google Tag Manager ou équivalent et ajoute un tag contenant le skimmer. Chaque site et page utilisant ce conteneur exécute désormais le code, y compris les pages de checkout où le tag n'a aucune raison de se charger.

Les routes tiers et tag manager passent à l'échelle, ce qui les rend dangereuses. Un vendor compromis sème des skimmers sur chaque site qui lui fait confiance, et un script que vous avez approuvé peut tirer un autre script que vous n'avez jamais revu, le problème de quatrième partie. C'est la forme supply-chain que visent les exigences 6.4.3 et 11.6.1 de PCI DSS 4.0.1 en demandant un inventaire et une autorisation de chaque script sur une page de paiement. La breach Ticketmaster de 2018 a suivi exactement ce chemin : le skimmer a atteint le checkout via le script de chatbot d'un fournisseur compromis, pas via le code propre de Ticketmaster (résumé Wikipédia de l'incident de 2018).

Mouvement 2 : comment le skimmer lit votre formulaire

Une fois le script exécuté, lire le formulaire est du développement web ordinaire retourné contre vous. Lire et modifier le DOM est la façon dont fonctionne tout framework moderne, donc les actions du skimmer ressemblent à un comportement de page normal. Un skimmer fait généralement une ou plusieurs des choses suivantes :

  • Lit les valeurs d'input directement. Il sélectionne les champs de numéro de carte, d'expiration, de CVV et de nom par leurs attributs id, name ou autocomplete et lit .value directement depuis le DOM.
  • Attache des event listeners. Il accroche input, keyup, change ou blur sur les champs de paiement, afin de capturer chaque frappe même si l'utilisateur ne soumet jamais le formulaire.
  • Détourne le chemin de submit. Il enveloppe le handler de submit du formulaire ou accroche le bouton « payer », assemblant le payload complet au moment où l'utilisateur valide.
  • Patche les primitives réseau. Les skimmers avancés surchargent fetch, XMLHttpRequest.prototype.send ou navigator.sendBeacon pour lire la vraie requête de paiement pendant que votre propre code l'envoie.
  • Superpose un faux champ. Certains injectent une iframe de paiement contrefaite par-dessus la vraie, afin que l'acheteur tape les détails de carte directement dans l'input de l'attaquant. La propre analyse de cside d'une campagne Magecart a trouvé une fausse frame de paiement insérée au checkout via une seule ligne JavaScript obfusquée, le type de swap qu'un scan côté serveur ne voit jamais.

Le serving conditionnel est ce qui le garde silencieux

Le skimmer ne se déclenche pas pour tout le monde. Il se filtre afin que les personnes les plus susceptibles de le repérer, à savoir les équipes de sécurité, les scanners et les bots, ne voient jamais le comportement malveillant :

  • Filtrage par chemin. Beaucoup de skimmers ne s'arment que sur des URLs qui correspondent à un motif de checkout ou de login, donc le code dort partout ailleurs.
  • Détection d'automatisation. Lire navigator.webdriver renvoie true dans les navigateurs headless et automatisés, donc le skimmer peut servir du code propre à un scanner et le vrai payload à un acheteur. Les variantes plus avancées recherchent les globales Selenium ou les fuites Runtime du Chrome DevTools Protocol (CDP) pour repérer les navigateurs instrumentés.
  • Déclenchement unique par session. Exfiltrer une seule fois évite le bruit réseau dupliqué qui pourrait ressortir dans un log.

Cette course aux armes s'accélère aussi du côté attaquant : le rapport de recherche Future of Web Security 2026 de cside a suivi playwright-stealth croissant d'environ dix fois durant 2025, de l'automatisation conçue pour battre navigator.webdriver et des vérifications similaires. La même évasion qui cache l'outillage d'un attaquant aux défenseurs est ce qui cache un skimmer aux vôtres. Le code est généralement obfusqué par-dessus tout ça, ce qui ensevelit l'intention lors d'une revue manuelle.

Mouvement 3 : comment les données partent

La capture est inutile pour l'attaquant tant que les données ne lui parviennent pas. L'exfiltration est une requête sortante unique depuis le navigateur, et l'attaquant dispose de plusieurs moyens discrets de l'envoyer.

MéthodeAspect sur le réseau
navigator.sendBeacon()Un petit POST qui se déclenche de façon fiable au déchargement, conçu pour l'analytics, donc il se fond
fetch() / XMLHttpRequestUne requête async standard, souvent vers un domaine look-alike qui imite un CDN ou un host d'analytics
Requête imageLe payload est ajouté au src d'un <img> comme query string ; le navigateur « charge » une image qui est en réalité un drop de données
WebSocketUn canal persistant pour transmettre les frappes capturées en quasi temps réel

Trois propriétés rendent cette fuite quasi impossible à repérer de l'extérieur. La requête est en HTTPS, donc chiffrée comme tout votre autre trafic. La destination est généralement un domaine typosquatté ou fraîchement enregistré qui se lit comme un vrai vendor. Le skimmer de British Airways exfiltrait vers baways.com, donc elle ne saute pas aux yeux dans un log. Et le payload est minuscule et souvent encodé en base64, donc il ressemble à un ping de télémétrie de routine. Critique : cette requête va du navigateur directement à l'attaquant ; elle ne passe jamais par votre origine, votre WAF ni votre passerelle de paiement. C'est toute la raison pour laquelle le vol est invisible côté serveur.

Pourquoi votre serveur, votre WAF et votre processeur ne voient rien

Mettez les trois mouvements ensemble et l'angle mort est évident. Le code s'est chargé dans le navigateur, a lu le champ dans le navigateur et a envoyé la copie depuis le navigateur vers un troisième domaine. Votre backend n'a jamais vu que la transaction légitime et autorisée.

  • Un WAF inspecte les requêtes qui arrivent à votre origine. La requête d'exfiltration n'y arrive jamais, donc le WAF n'a rien à inspecter.
  • Un SIEM agrège les logs serveur et infrastructure, et le skimmer ne génère aucun événement serveur. La surveillance fraude signale les anomalies d'achat, mais l'achat réel s'est terminé exactement comme prévu.
  • Un processeur de paiement comme Stripe ou Adyen sécurise la transaction qu'il reçoit. Si vos champs de carte sont sur votre propre page, un skimmer les lit avant que le processeur ne soit impliqué, et votre page reste redevable de sa propre preuve PCI DSS 4.0.1 6.4.3 et 11.6.1 quel que soit le processeur.

L'attaque vit dans un runtime que votre stack côté serveur ne peut pas atteindre. Un problème client-side nécessite une défense client-side.

Comment la surveillance en couche navigateur attrape chaque mouvement

La détection doit se poser là où le skimmer tourne. cside surveille les scripts et le comportement dans le navigateur, donc chaque mouvement laisse un signal sur lequel elle peut agir.

  • Injecter apparaît comme un script nouveau ou modifié. cside tient un inventaire des scripts et signale les ajouts, changements et tags tiers manipulés quand ils surviennent, pas des semaines plus tard dans un rapport de fraude.
  • Capturer apparaît comme du comportement. Des listeners inattendus sur les champs de paiement, du code lisant des inputs qu'il ne devrait pas, et des overrides de fetch ou sendBeacon sont des anomalies runtime par rapport à une baseline connue-bonne.
  • Exfiltrer apparaît comme une destination. cside remonte les requêtes sortantes vers des domaines absents de votre allowlist, le mouvement caractéristique d'un skimmer qui tente de sortir.

Parce que cside tourne dans de vrais navigateurs plutôt que dans un scanner de salle blanche, le serving conditionnel ne cache pas le skimmer comme il le cache à un crawler headless. Cette même visibilité produit la preuve qu'attend PCI DSS 4.0.1 : un inventaire autorisé des scripts de page de paiement pour 6.4.3, et des alertes sur les changements non autorisés du contenu et des en-têtes de script pour 11.6.1, tous deux obligatoires depuis 2025-03-31.

Lectures complémentaires sur cside

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks — web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

Dans l'onglet du navigateur du visiteur, dans le même contexte JavaScript que votre propre code de checkout. Il n'est pas sur votre serveur ni dans un sandbox. Une fois qu'un script se charge sur la page, il peut lire le DOM, attacher des listeners aux champs de formulaire et ouvrir des connexions réseau vers tout domaine que la Content Security Policy de la page autorise. Ce contexte partagé est la raison pour laquelle une seule balise d'analytics ou de chat compromise peut atteindre des champs de carte qu'elle n'a aucune raison de toucher.

Il se filtre lui-même. La plupart des skimmers vérifient l'URL et ne s'arment que sur un chemin de checkout ou de login, puis inspectent la session pour éviter les sandboxes. Un indice courant est la lecture de `navigator.webdriver`, qui renvoie `true` dans les navigateurs headless et automatisés ; certains recherchent aussi des artefacts Selenium ou CDP afin qu'un scanner de sécurité voie du code propre tandis qu'un vrai acheteur reçoit le skimmer. Beaucoup ne se déclenchent qu'une fois par session pour éviter une exfiltration dupliquée. Le serving conditionnel explique pourquoi une revue manuelle du source de la page ne trouve souvent rien.

Souvent des semaines ou des mois, parce que rien ne change dans la stack de monitoring habituelle. Le checkout continue de se compléter, le paiement continue de s'autoriser et les commandes continuent d'être traitées. Les skimmers filtrent leur comportement et capturent silencieusement leurs propres erreurs, donc les tests occasionnels les déclenchent rarement et une exfiltration échouée ne casse jamais la page. La plupart des victimes apprennent la breach par un réseau de cartes ou un signalement client, pas par leurs propres systèmes.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

cside Interface du tableau de bord affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration