أحمد الهاشمي طبيب · مبرمج · معلم

19 Jun 2005

أمن برامج الويب: البرمجة عبر الموقع XSS

واحدة من أشهر أنواع الثغرات التي على الويب والتي لا تهتم لها الكثير من المواقع العربية هي ثغرة البرمجة عبر الموقع أو Cross-Site Scripting (وتختصر عادة إلى XSS)، وقد سميت بذلك لأن فكرتها هي أنك تستخدم الموقع كوسيط بينك وبين الضحية بحيث تضع شفرة برمجية (Script وتقريبا دائما يكون بلغة JavaScript) على الموقع وتجبر الضحية على تشغيل هذا السكريبت عند زيارته للموقع دون أن يشعر، ومن أبرز أمثلتها برامج المنتديات العامة التي تسمح لأي عضو باستخدام لغة HTML في المواضيع والردود التي يكتبها.

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

دعنا في البداية نلقي نظرة على أنواع المخاطر التي تواجه المواقع والمنتديات التي تسمح بذلك.

عمل تغييرات جذرية في شكل الصفحة

أقل الأمور التي يمكن القيام بها باستخدام حقن الصفحات بشفرات HTML خطورة هو عمل تغييرات جذرية على شكل الصفحة، ويمكن القيام بذلك مثلا باضافة الوسم >textarea< الذي يفتح مربع نص ويعتبر كل النصوص التي تأتي بعده، بما فيها شفرات HTML مجرد نص داخل داخل المربع بدلا من أن يعتبرها جزءا من الصفحة، وبالتالي تتوقف الصفحة كلها عند هذا الوسم، فإذا تمكن المخرب مثلا من اضافة هذا المقطع إلى الصفحة في صورة من الردود التي في أحد مواضيع المنتدى، فإن ذلك سيؤدي إلى اختفاء كافة الردود التي تأتي بعد رده، ويكون عمليا قد خرّب الموضوع.

أو يمكنه أيضا اضافة مقطع CSS أو JavaScript إلى الصفحة أن يغير شكل الصفحة بصورة جذرية، بحيث تختفي الصفحة كلها مثلا، أو أن يقوم بعمل حركات مؤذية كفتح مئات الشاشات الخارجية دون أن يتمكن الزائر من التحكم بها.

جعل المستخدم يقوم بأمور لا يريدها دون أن يشعر

تسمح البرامج على الويب للمستخدمين المختلفين بالقيام بعمليات مختلفة، فبرامج إدارة منتديات الحوار مثلا تسمح للمراقبين بحذف المساهمات التي في الساحة، لكنها لا تسمح للأعضاء العاديين القيام بذلك، ولنفرض أن هنالك مراقبا الآن يريد حذف موضوع ما، فإن الطريقة تكون في الغالب بالضغط على زر يأخذ المراقب إلى عنوان خاص ينفذ هذه العملية، ولنفرض مثلا أن هذا العنوان هو: delete.php?post=123.

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

لكن ماذا لو قام المخرب الذكي بانشاء موضوع في المنتدى وضمنه شفرة HTML تقوم تلقائيا بطلب هذا العنوان لزائر الصفحة؟ وهو أمر يسهل القيام به، عن طريق تضمين هذه الوصلة كعنوان صورة في وسم img، وعندما بمجرد أن يدخل المراقب إلى هذا الموضوع فإن المتصفح سيرى الوسم img وسيحاول زيارة الصفحة وذلك عن طريق طلب العنوان الذي في الصورة، والذي يقوم بحذف ذلك الموضوع!

يمكن للمخرب أيضا أن يستخدم JavaScript أيضا لاجبار الزائر (المراقب) على ارسال نموذج POST بمجرد زيارة الصفحة ودون أن يشعر.

الحصول على معلومات مهمة عن زائر الصفحة

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

فإذا كان المخرب قادرا على ادخال معلومات HTML في الصفحة، فإنه سيكون قادرا على تضمينها شفرات JavaScript تقوم بالحصول على هذه المعلومات وارسالها إلى المكان الذي يريده (وعادة ما يكون ذلك على سيرفر خاص بالمخرب)، ويمكنه بعد ذلك أن يحصل على هذا الرمز واستخدامه لتقمص شخصية المراقب والحصول على كافة صلاحياته!

والحل؟

يمكن اختصار الحلول كلها في أمر واحد، وهو التحقق من المحتوى قبل القبول به وعرضه في صفحات الموقع، ويمكن القيام بذلك بعدة طرق منها تغيير الأقواس < و > التي تحيط بوسوم HTML إلى الرموز < و > التي تؤدي إلى عرض الأقواس كما هي في المتصفح بدلا من تفسيرها على أنها رموز HTML، وهي الطريقة الأفضل في أغلب المواقع، خاصة التي تكون موجهة للعامة الذي قد لا يعرفون شيئا عن شفرات HTML وربما يقومون بكتابة الأقواس عرضيا دون أن يعرفوا بأن لها معنا خاصة في لغة HTML.

بعض المواقع تسمح باستخدام وسوم HTML محددة هي الوسوم التي سيحتاجها المستخدم لتنسيق النصوص دون أن تكون بيده امكانيات هائلة، بالطبع يجب أن تنتبه إلى أن شفرات JavaScript يمكن أن توضع في أي وسم من الوسوم، فيمكنك مثلا أن تضع شفرة JavaScript في الخاضية onclick للوسم img لتحدد شفرة تريد أن تنفذ في حال ضغط المستخدم على الصورة، كما أنك تستطيع اضافة شفرات JavaScript كوصلة في الخاصية href للوسم a ليتم تفيذ شفرة JavaScript معينة بدلا من أخذ الزائر إلى صفحة ما، فالتحقق من أسماء الوسوم لا يكفي، بل يجب التحقق أيضا من خواص الوسوم، ومحتوى هذه الخواص.

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

→ عودة لقائمة المقالات