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 12 min read
Attaques Magecart expliquées : comment le web skimming fonctionne dans le navigateur
Table des matières

En bref : comment fonctionnent les attaques Magecart

  • Vraies victimes, vraies équipes : Au moins sept équipes d'attaquants injectant du JavaScript sur des pages de paiement. British Airways (380k enregistrements), Ticketmaster, Newegg, Warner Music.
  • S'exécute après le WAF : L'attaque s'exécute après que votre WAF a approuvé la page, dans le même contexte JavaScript que votre formulaire de checkout.
  • Les règles qui ferment : 6.4.3 et 11.6.1 ferment cette brèche. Requis depuis le 31 mars 2025 pour quiconque touche une page de paiement.

Peu de temps ? Découvrez le blocage Magecart et skimmer dans le navigateur de cside. Elle couvre tout ce qui suit en un seul déploiement.

A Magecart attack: from compromise to card exfil

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 :

Notable Magecart / web-skimming incidents

  • 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 substitution 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 croître d'environ dix fois durant 2025, une 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 dans le trafic
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 dépôt 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 le reste de votre 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 cela 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. Élément 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 pare-feu d'application web (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 de la 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 se trouvent sur votre propre page, un skimmer les lit avant même 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 côté client nécessite une défense côté client.

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 dès qu'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 le 31/03/2025.

Lectures complémentaires sur cside

Incidents Magecart nommés (2018 à 2024)

L'écosystème Magecart est une fédération lâche d'au moins sept groupes distincts (numérotés Group 1 à Group 12 par RiskIQ) utilisant des TTP partagés. Les divulgations publiques ci-dessous sont les cas de référence que les clients et les QSA citent lors de la définition des contrôles PCI DSS 4.0.1 §6.4.3 et §11.6.1.

  • British Airways (2018). Environ 380 000 enregistrements de cartes de paiement exfiltrés sur 15 jours à partir d'un script compromis servi sur les pages de checkout et de l'application mobile. Amende de l'ICO britannique réduite de 183 M£ à 20 M£.
  • Ticketmaster UK (2018). Détails de carte d'environ 40 000 clients exposés après que le script de support client Inbenta, servi depuis un CDN tiers, a été modifié pour skimmer la page de paiement. Amende ICO de 1,25 M£.
  • Newegg (2018). 15 lignes de JavaScript injecté ont capturé toutes les données de carte soumises à checkout/payment.aspx pendant 35 jours. Attribution à Magecart Group 4 par RiskIQ.
  • Warner Music Group (2020). Plusieurs sites e-commerce exploités par WMG aux États-Unis et au Royaume-Uni compromis pendant trois mois, ciblant les données de checkout sur la plateforme Volusion.
  • Segway (2022). Les attaquants ont utilisé une extension Magento malveillante pour skimmer les formulaires de paiement, divulgué par Malwarebytes.
  • Kaiser Permanente (2024). 13,4 millions de membres notifiés après que des scripts d'analytics et de tracking tiers sur des pages destinées aux membres ont exposé des informations sensibles, un cas adjacent à la même classe de TTP Magecart.
  • Chaîne d'approvisionnement Polyfill.io (2024). Après un changement de propriété, cdn.polyfill.io a commencé à servir du code malveillant à plus de 100 000 sites intégrant la bibliothèque, divulgué par Sansec. Fastly, Cloudflare et Google sont intervenus au niveau réseau.
  • Adobe Commerce / Magento Cosmicsting (CVE-2024-34102). Faille de désérialisation XML côté serveur utilisée pour implanter des skimmers côté client sur des centaines de marchands Magento en 2024 et jusqu'en 2025.

Chaque cas ci-dessus a contourné les défenses côté serveur du marchand et manipulé du code exécuté par le navigateur. C'est exactement l'écart que PCI DSS 6.4.3 (autorisation et intégrité des scripts) et 11.6.1 (détection de changement sur la page de paiement) ont été écrits pour combler.

Detecting a Magecart-style skimmer in cside

Lectures associées

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.

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

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau