البرمجة النصية عبر المواقع (Cross-site scripting)

البرمجة النصية عبر المواقع (Cross-site scripting)

في هذا القسم ، سنشرح ماهية البرمجة النصية عبر المواقع، و نذكر مختلف أنواع ثغراتها، و نوضح كيفية العثور على هذه الثغرة و كيفية منعها.

ما هي البرمجة النصية عبر المواقع (XSS)؟

البرمجة النصية عبر المواقع (المعروفة أيضاً باسم XSS) هي ثغرة أمنية على الوب تسمح للمهاجمين باستغلال التفاعلات التي يقوم بها المستخدمون مع أحد التطبيقات المصابة (أو المعرضة للثغرة). ما يسمح للمهاجم بالتحايل على سياسة نفس الأصل (origin policy)، و التي تم تصميمها لفصل مواقع الوب المختلفة عن بعضها البعض. تسمح ثغرات XSS عادة للمهاجمين بالتنكر كمستخدم ضحية، و تنفيذ أي إجراءات يستطيع المستخدم تنفيذها، و الوصول إلى أي من بيانات المستخدم. و إذا كان للمستخدم الضحية صلاحيات وصول واسعة (أو ذات امتياز privileged) ضمن التطبيق، فقد يتمكن المهاجم من التحكم الكامل في جميع وظائف التطبيق و بياناته.

كيف يعمل XSS؟

تعمل XSS من خلال التأثير في موقع ويب ضعيف (أو معرض للثغرة) بحيث يقوم بإرجاع JavaScript ضار إلى المستخدمين. و عند تنفيذ الكود (أو التعليمات البرمجية) الخبيث داخل متصفح الضحية، يمكن للمهاجم أن يسيطر بالكامل على تفاعله مع التطبيق.

ما هي أنواع هجمات XSS؟

هناك ثلاثة أنواع رئيسية من هجمات XSS و هي:

  • المنعكسة (Reflected XSS)، حيث يأتي البرنامج النصي (script) الضار من طلب HTTP الحالي.

  • المخزنة (Stored XSS)، حيث يأتي البرنامج النصي الضار من قاعدة بيانات الموقع.

  • بالاعتماد على DOM، حيث توجد الثغرة الأمنية في التعليمات البرمجية من جانب العميل client-side code بدلاً من التعليمات البرمجية من جانب الخادم server-side code

البرمجة النصية المنعكسة عبر المواقع

المنعكسة هي أبسط تنويعات (أو حالات) XSS. و تنشأ عندما يتلقى تطبيق ما بيانات في طلب HTTP و يقوم بتضمين تلك البيانات ضمن الاستجابة الفورية بطريقة غير آمنة.

فيما يلي مثال بسيط على ثغرة XSS المنعكسة :

https://insecure-website.com/status?message=All+is+well.

<p>Status: All is well.</p>

لا يؤدي التطبيق أي معالجة أخرى للبيانات، لذلك يمكن للمهاجم بسهولة إنشاء هجوم كهذا:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

<p>Status: <script>/* Bad stuff here... */</script></p>

إذا زار المستخدم عنوان URL الذي أنشأه المهاجم، فسيتم تنفيذ برنامج (script) المهاجم في متصفح المستخدم، ضمن سياق (context) جلسة (session) المستخدم مع التطبيق. عند هذه النقطة، يمكن للبرنامج النصي (script) تنفيذ أي إجراء، و استرداد أي بيانات، يمكن للمستخدم الوصول إليها.

البرمجة النصية المخزنة عبر المواقع

ينشأ XSS المخزّن (المعروف أيضاً باسم XSS الدائم persistent أو XSS بالطلب الثاني second-order XSS) عندما يتلقى تطبيق ما بيانات من مصدر غير موثوق به و يقوم بتضمين تلك البيانات ضمن استجابات HTTP لاحقة بطريقة غير آمنة.

قد يتم تقديم البيانات المعنية إلى التطبيق عبر طلباتHTTP؛ على سبيل المثال، من خلال التعليقات على منشور في مدونة، أو الأسماء المستعارة للمستخدمين في غرفة الدردشة، أو تفاصيل التواصل (أو الاتصال) عند قيام العميل بالطلب. في حالات أخرى، قد تصل البيانات من مصادر أخرى غير موثوق بها؛ على سبيل المثال، تطبيق بريد وب (webmail application) يعرض الرسائل المستلمة عبر SMTP أو تطبيق تسويقي يعرض منشورات وسائل التواصل الاجتماعية أو تطبيق مراقبة الشبكة يعرض بيانات الحزمة packet data من حركة مرور (traffic) الشبكة.

فيما يلي مثال بسيط على ثغرة XSS المخزنة. يتيح تطبيق منصة رسائل (message board أو لوحة رسائل) للمستخدمين إرسال رسائل يتم عرضها للمستخدمين الآخرين:

<p>Hello, this is my message!</p>

لا يؤدي التطبيق أي معالجة أخرى للبيانات، لذلك يمكن للمهاجم إرسال رسالة تهاجم المستخدمين الآخرين بسهولة :

<p><script>/* Bad stuff here... */</script></p>

البرمجة النصية عبر المواقع بالاعتماد على DOM

ينشأ XSS المستند إلى DOM (المعروف أيضاً باسم DOM XSS) عندما يحتوي أحد التطبيقات على JavaScript من جانب العميل (client-side JavaScript) التي تعالج البيانات من مصدر غير موثوق به بطريقة غير آمنة، و يتم ذلك عادةً عن طريق كتابة البيانات مرة أخرى إلى DOM.

في المثال التالي، يستخدم التطبيق بعض الـ JavaScript لقراءة القيمة من حقل إدخال (input field) و كتابة هذه القيمة إلى عنصر داخل HTML:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;

إذا تمكن المهاجم من التحكم في قيمة حقل الإدخال (input field)، فيمكنه بسهولة إنشاء قيمة ضارة تؤدي إلى تنفيذ البرنامج النصي (script) الخاص به:

You searched for: <img src=1 onerror='/* Bad stuff here... */'>

في الحالة النموذجية ، سيتم ملء حقل الإدخال بواسطة جزء من طلبHTTP ، على سبيل المثال بوسيط من النوع string (سلسلة نصية) يحوي استعلامURL ، مما يسمح للمهاجم بتقديم هجوم باستخدام عنوان URL ضار، بنفس طريقة XSS المنعكسة.

بماذا يمكن أن تستخدم الـ XSS؟

  • عادةً ما يكون المهاجم الذي يستغل ثغرة البرمجة النصية عبر المواقع قادراً على:
  • انتحال شخصية أو التنكر كأنه المستخدم الضحية.
  • القيام بتنفيذ أي إجراء يمكن للمستخدم القيام به.
  • قراءة أي بيانات يستطيع المستخدم الوصول إليها.
  • التقاط بيانات (credentials أو بيانات اعتماد) تسجيل دخول المستخدم.
  • القيام بالتشويه الظاهري للموقع على شبكة الإنترنت.
  • حقن خاصية (functionality أو وظيفة) حصان طروادة (trojan) في موقع الويب.

تأثير ثغرات XSS

يعتمد التأثير الفعلي لهجوم XSS بشكل عام على طبيعة التطبيق و وظائفه و بياناته و حالة المستخدم الذي يتعرض للخطر. فمثلاً:

  • في تطبيق البروشور (brochureware application و هو تطبيق وب [غالباً عبارة عن موقع بسيط] يحوي فقط منشورات دعائية بهدف الترويج لأعمال الشركات من خواصه البساطة الشديدة في التصميم و الإمكانيات المتاحة -المترجم-) ، حيث يكون جميع المستخدمين مجهولي الهوية و جميع المعلومات عامة، يكون التأثير في الغالب ضئيلاً.

  • في أي تطبيق يحتفظ ببيانات حساسة، مثل المعاملات المصرفية أو رسائل البريد الإلكتروني أو سجلات الرعاية الصحية، سيكون التأثير خطيراً في العادة.

  • إذا كان لدى المستخدم المتضرر (الذي تم اختراقه) صلاحيات (أو امتيازات) كبيرة ضمن التطبيق، فسيكون التأثير بشكل عام خطيراً، مما يسمح للمهاجم بالتحكم الكامل في التطبيق المصاب و يضر بجميع المستخدمين و بياناتهم.

كيفية البحث عن ثغرات XSS و اختبارها

يمكن العثور على الغالبية العظمى من ثغرات XSS بسرعة و بشكل موثوق باستخدام Burp Suite’s web vulnerability scanner (فاحص ثغرات الوب Burp Suite).

يتضمن الاختبار اليدوي للـ XSS المنعكسة و المخزنة تقديم بعض المدخلات (input) الفريدة البسيطة (مثل سلسلة أبجدية رقمية alphanumeric قصيرة) في كل نقطة إدخال (entry point) في التطبيق؛ لتحديد كل موقع يتم فيه إرجاع المدخلات المقدمة ضمن استجابات HTTP ، و اختبار كل موقع على حدى لتحديد ما إذا كان يمكن استخدام مدخلات معدّة بشكل مناسب للتنفيذ القسري لـ JavaScript.

يتضمن الاختبار اليدوي لـ XSS بالاعتماد على DOM و الذي ينشأ عن URL، عملية مماثلة: يتم وضع بعض المدخلات الفريدة البسيطة في الوسيط parameter، و استخدام أدوات المطور في المتصفح للبحث في DOM عن هذا الإدخال، و اختبار كل موقع لتحديد ما إذا كان قابلاً للاستغلال أم لا. غير أنه يصعب اكتشاف الأنواع الأخرى من DOM XSS. و للعثور على الثغرات القائمة على DOM في المدخلات التي لا تستند إلى عنوان URL(مثل document.cookie) أو التي لا تستند إلى HTML(مثلsetTimeout) ، فليس هناك بديل عن مراجعة كودJavaScript ، و التي قد تستغرق وقتاً كبيراً للغاية. يجمع ماسح ثغرات الوب لـ Burp Suite بين التحليل الثابت و الديناميكي لـ JavaScript لأتمتة اكتشاف الثغرات القائمة على DOM بشكل موثوق.

كيفية منع هجمات XSS

يعتبر منع البرمجة النصية عبر المواقع أمراً سهلاً في بعض الحالات، و لكنه قد يكون أصعب بكثير اعتماداً على مدى تعقيد التطبيق و الطرق (أو الأساليب) التي يتعامل بها مع البيانات التي يتحكم فيها المستخدم.

بشكل عام، من المحتمل أن ينطوي منع ثغرات XSS بشكل فعال على مجموعة من التدابير التالية :

  • تصفية المدخلات (input) عند وصولها . عند النقطة التي يتم فيها تلقي إدخال المستخدم، قم بالتصفية بأقصى قدر ممكن من الدقة بناءً على ما هو متوقع أو بناءً على الإدخال الصحيح.

  • تشفير البيانات عند الإخراج (output) . عند النقطة التي يتم فيها إخراج البيانات التي يمكن التحكم فيها بواسطة المستخدم في استجاباتHTTP ، قم باعادة كتابة كود الoutput لمنع تفسيره على أنه محتوى نشط. و اعتماداً على سياق المخرجات، قد يتطلب ذلك تطبيق مجموعات من ترميز HTML و URL و JavaScript و CSS.

  • استخدم ترويسات (headers) الاستجابة المناسبة . لمنع XSS في استجابات HTTP التي لا يُقصد بها احتواء أي HTML أوJavaScript ، يمكنك استخدام ترويسات Content-Type و X-Content-Type-Options لضمان أن المتصفحات تفسر الاستجابات بالطريقة التي تنوي استخدامها بها.

  • سياسة أمان المحتوى(Content Security Policy) . كخط دفاع أخير، يمكنك استخدام سياسة أمان المحتوى (CSP) للتخفيف من شدة أي ثغرات XSS لا تزال موجودة.

أسئلة شائعة حول البرمجة النصية عبر المواقع :

ما مدى انتشار ثغرات XSS ؟ تعد ثغرات XSS شائعة جداً، و ربما تكون XSS هي أكثر ثغرة أمنية على الوب تحدث بشكل متكرر.

ما مدى شيوع هجمات XSS ؟ من الصعب الحصول على بيانات موثوقة حول هجمات XSS في العالم الحقيقي، و لكن ربما يتم استغلالها بشكل أقل من الثغرات الأخرى.

ما هو الفرق بين XSS و CSRF ؟ يتضمن XSS التسبب في إرجاع أحد مواقع الويب لـ JavaScript ضارة، بينما يشتمل CSRF على جعل المستخدم الضحية يقوم بتنفيذ إجراءات لا ينوي القيام بها.

ما هو الفرق بين XSS و حقن الـ SQL ( SQL injection XSS هي ثغرة أمنية من جانب الزبون تستهدف مستخدمي التطبيق الآخرين، بينما SQL injection هي ثغرة أمنية من جانب الخادم تستهدف قاعدة بيانات التطبيق.

كيف يمكنني منع XSS في PHP ؟ قم بتصفية المدخلات (inputs) الخاصة بك بقائمة بيضاء (whitelist) من المحارف المسموح بها و استخدام تلميحات الكتابة أو قسر النوع (type casting). مرر (escape) مخرجاتك باستخدام htmlentities و ENT_QUOTES لسياقات (contexts)HTML ، أو بواسطة JavaScript Unicode لسياقات JavaScript.

كيف يمكنني منع XSS في Java ؟ قم بتصفية المدخلات الخاصة بك بقائمة بيضاء من المحارف المسموحة و استخدام مكتبة مثل Google Guava لتشفير مخرجاتك (output) بترميز HTML (HTML-encode) لسياقاتHTML ، أو استخدام محارف الهروب (escape) لـ JavaScript Unicode لسياقات جافا سكريبت.