شرح ثغرات Dom-Based XSS بالتفصيل

Xss

ثغرات XSS او Cross-Site Scripting اصبحت واحدة من أشهر ثغرات تطبيقات الويب فهي تأتي في المرتبة الثالثة حسب تصنيف موقع OWASP لأشهر و أكثر 10 ثغرات انتشاراً في تطبيقات الويب لعام 2013 .

صحيح ان ثغرات الـ XSS لا تعد من الثغرات عالية الخطورة لأنها لا تؤثر بشكل مباشر على الموقع او الخادم و إنما تؤثر على جانب العميل الـ Client Side او المستخدم و تحتاج لإضافة القليل من الهندسة الاجتماعية حتى تصل إلى هجوم قوي من خلالها .

لكن هذا لا يمنع ان ثغرات XSS كانت سبباً أساسي في أختراق أكبر الشركات و المواقع العالمية كما حدث منذ أشهر مع المنتديات الخاصة بموقع ubuntu الشهير و تم سرقة معلومات قرابة الـ 2 مليون مستخدم عن طريق استغلال لثغرة XSS بالموقع كما ان ثغرات الـ Xss ايضا كانت سبباً رئيسي في اختراق موقع Apple للمطورين خلال نفس الفترة . فمن المؤكد أن هذا النوع من الثغرات قد يشكل خطورة أكبر بكثير من خطورة ثغرات الـ SQL Injection في حال قام الـهاكر باستغلالها بشكل ذكي و قوي .

موضوعنا اليوم سنتكلم فيه بشكل أساسي على نوع مختلف بعض الشئ من ثغرات الـ XSS و الذي يطلق عليه Dom-Based XSS و قد يكون الكثير ممن يقرؤون هذا المقال لم يتعرفوا إلى هذا النوع من ثغرات xss او يعرفوه اسماً فقط .

من المتعارف عند الجميع ان أشهر أنواع لثغرات XSS هي ما يطلق عليها الـ Reflected XSS و الـ Stored XSS .

و لكن يوجد ايضاً أنواع اخرى تقوم بنفس التأثير لثغرات XSS مثل الـ Flash XSS و Dom-Based XSS و الأخيرة هي التي سوف نقوم بالحديث عنها اليوم في هذة المقالة ان شاء اللًه .

ما هي فكرة ثغرات XSS و كيف تعمل؟

كما نعلم ثغرات XSS تكمن خطورتها في تعديل لمحتوى صفحات الموقع التي تظهر للمستخدم و ذلك عن طريق حقن اكواد HTML او Javascript , كانك تقوم بالضبط بالتعديل على ملفات الـ html و javascript الخاصة بالموقع من خلال احد برامح محرر صفحات الويب .فثغرات XSS تساعد المخترق على تعديل صفحات الموقع و عمل صفحات مزورة مع الاحتفاظ بنفس رابط الصفحة و الدومين , كما يستغلها لبعض لسرقة Sessions او الـ Cookies الخاصة بالمستخدمين و هو يعد اخطر استغلال لثغرات XSS و ذلك عن طريق استخدام داله جافا سكريبت التي تستطيع قراءة بينات الكوكيز مثل document.cookie و ايضاً يستخدم هاكرز أخرون ثغرات الـ XSS في اختراق صفحات الموقع في حال كانت الثغرة من نوع Stored Xss .

دعونا اولا نستعرض طريقة عمل XSS حتى يمكنا بعد ذلك فهم فكرة عمل ثغرات Dom Based Xss بسهولة , ببساطة ثغرات XSS تحدث عندما يقوم المستخدم بأرسل مدخل للصفحة و تقوم الصفحة بأخذ هذا المدخل من المستخدم وعرضه مباشرة كما هو في HTML عن طريق دوال البرمجة مثلا print و echo

مثال بسيط جداً على ذلك صفحة تطلب من المستخدم إدخال اسمه الشخصي

1

و يدخل اليها الاسم

Ahmed Aboul-Ela

بعد ذلك تقوم بعرض الجملة “Welcome Ahmed Aboul-ELa

2

و اذا استعرضنا html code يكون كالتالي

3

جميل , لكن ماذا سوف يحدث اذا أدخلت للصفحة اسماً مصحوب بـtags خاصة بالـhtml مثلا هذا الأسم

<h1> Ahmed Aboul-ELA </h1>

ببساطة سوف تكون النتيجة كالتالي

4

و اذا قمنا باستعراض html code هذة المرة سوف يصبح كالتالي

5

اذاً الأن تتضح لدينا المشكلة بوضوح , فعند كتابة الاسم مصحوباً بـ الـ tags الخاصة بالـhtml المتصفح هنا لم يفهم انه هذا هو مجرد اسم الشخص و لكنه قام بترجمة اكواد html في الاسم و قام بعرضة بالشكل المطلوب و عندها تغير شكل الاسم في الصفحة و أصبح بخط أكبر . اذاً فان المشكلة كلها كانت في ان الصفحة أخذت الاسم من المستخدم و أظهرته مباشرة دون اي تحقق من ان الاسم قد يحتوى على اكواد خاصة بالـ HTML .

دعونا الأن نحدد هنا من المسؤول عن أخذ الاسم من المستخدم في الصفحة و من المسؤول عن إظهار الأسم في html , في هذة الحالة فان المسؤول عن أخذ الاسم هي داله $_POST في لغة برمجة php و المسؤول عن إظهار الاسم في html هي داله echo . الأن هذة المقدمة كانت ضرورية لنا حتى نستطيع ان نستوعب فكرة عمل dom-based xss في الجزء التالي .

ما هي ثغرات Dom Based Xss و كيف تعمل ؟

ببساطة ثغرات XSS لا تختلف كثيراً في مفهموها عن ثغرات refelected xss و لكن الفرق بينها و بين ثغرات XSS في الأسلوب و الطريقة , فكما ذكرنا في ثغرات xss التقليدية فان من يقوم باستقبال المدخل من المستخدم هي لغة PHP عن طريق داله $_POST او $_GET التى تستطيع قرائه المدخلات من خلال form في صفحة ما او من خلال الرابط . لكن في حاله Dom-Based فأن من يقوم بأخذ المدخل من المستخدم هي دوال الـ javascript و من يقوم بطباعة المدخل ايضاً هي دوال الـ javascript دون الحاجة إلى اي لغات برمجة أخرى او حتى web server لترجمة و تشغيل الملفات .

سوف نطلق على دوال التي تقوم بأخذ المدخل من المستخدم هي دوال الـ sources و ان الدوال التي تقوم بطباعة هذا المدخل و إظهاره في html هي sinks . و الأن نبدأ بشرح بعض دوال sources و sinks و نرى كيف يمكن ان تؤدي بعد ذلك إلى ثغرات XSS .

ما هي دوال Sources ؟

دوال الـsources هي دوال في لغة javascript و التي من خلالها يمكن ان تقوم بإرسال مدخل إلى الصفحة في هذه الحالة غالبا يكون المدخل من المستخدم مرسل من خلال رابط الصفحة او url مثلا لدينا الرابط التالي :

https://site.com/home/file.html?name=ahmed#Securtiy4arabs

فمن الممكن من خلال هذة الدوال ان تقوم بقراءة رابط الصفحة بالكامل او فقط مسار الصفحة home/file.html/ او قيمة الاسم المدخل ahmed او الهاش تاج security4arabs كأنك بالضبط تقوم عمل تحليل الرابط و تقسيمه إلى إجزاء , جزء هو مسار الصفحة و اسم ملف الصفحة و جزء هي المتغيرات او parameters المرسلة إلى الصفحة

و يمكن عمل ذلك من خلال javascript ببساطة عن طريق الدوال التالية :

دوال تقوم بقرائه رابط الصفحة بالكامل

  • document.URL
  • document.documentURI
  • document.URLUnencoded
  • document.baseURI
  • location
  • location.href

مثال على ذلك اقوم بكتابة صفحة تحتوى على كود الجافا سكريبت التالي :

<script>
alert(location.href);
</script>

و بعد ذلك اقوم بتشغيل الصفحة و تكون النتيجة كالتالي :
dombased_xss1

نلاحظ ان الصفحة قامت باظهار msg box يحتوى على رابط الصفحة التي قمت بتشغيلها كما قمنا بكتابة في ملف html , و يكون نفس الحال مع باقي الدوال التي قمنا بذكرها , سوف تظهر رابط الصفحة بالكامل , الأن نتطرق إلى داله اخرى تقوم بقرائه اسم الصفحة فقط دون المدخلات إليها او اسم domain .

دوال تقوم بقرائه اسم الصفحة و مسارها

location.pathname

مع استخدام نفس كود الصفحة السابق و استبدال فقط اسم الدالة location.href باسم الدالة يصبح لدينا النتيجة التالية

dombased_xss2

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

دوال تقوم بقرائه المدخلات او parameters فقط المرسلة إلى الصفحة

  • location.search

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

https://site.com/page.html?name=ahmed

تكون النتيجة كالتالي :

dombased_xss3

و اخيرا نقوم بذكر دالة تستخدم كثير في مواقع و هي داله تقوم بقرائة الـ hashtag # في الرابط

دوال تقوم بقرائه HashTag

  • location.hash

نقوم بتشغيل الصفحة مرة اخرى بهذة الدالة و نرى النتيجة

dombased_xss4

قمنا فقط بفتح رابط الصفحة مع اضافة #Ahmed Aboul-Ela في نهاية الرابط و قامت الصفحة بأظهار هذا الجزء فقط من الرابط الأن تعرفنا الى جميع دوال sources الأن ننطلق إلى الدوال التي تستطيع ان تظهر هذة sources في مخرج الصفحة

ما هي دوال Sinks ؟

دوال sinks ببساطة كما ذكرنا هي المسؤلة عن إظهار و كتابة القيمة المرسلة من خلال داله من دوال sources بالظبط كداله print في لغات البرمجة

دوال الـsinks ليست صعبة و سوف اقوم بذكر اهمها

  • داله document.write و doucment.writeln

هي داله المكافئة لدالة print في لغات البرمجة فتقوم مباشرة بطباعة الكلام داخل كود HTML

مثال على ذلك صفحة تحتوى على كود HTML التالي

<script>
document.write(‘hello world’) ;
</script>

ستكون النتيجة لدينا كما في الصورة

dombased_xss5

  • داله anyElement.innerHTML

هذه الدالة ببساطة تقوم بقراءة او كتابة كود بداخل Tag معين في الصفحة

مثلا document.body.innerHTML سوف تقوم بقرائة محتوى <body> </body> بالكامل

و اذا قمت بعمل document.body.innerHTML = ‘ahmed’ سوف يقوم بعمل استبدال كامل لمحتوى تاج body و كتابة فيه الكلمة Ahmed

مثال على ذلك كود الصفحة التالي

<html>
<body>
Just a text in body tag
<script>
document.body.innerHTML = ‘www.security4arabs.com’;
</script>
</body>
</html>

عند تشغيل الصفحة ستقوم الـJavaScript بتغير محتوى الصفحة الأصلي
و المكتوب فيه Just a text in body tag بـالكلمة www.security4arabs.com

dombased_xss6

كما نلاحظ لم تظهر الجملة just a text in body tag الأن تعرفنا إلى اهم دوال html sinks و التي تستطيع كتابة كلام في الصفحة و تعرفنا الى دوال Sources التي تستطيع ان ترسل مدخل إلى الصفحة من خلال الرابط

الأن نتطرق إلى الخطوة الأخيرة و هي كيفية حدوث ثغرات dom based xss من خلال هذة الدوال

كيف تحدث ثغرات Dom-Based Xss باستخدام دوال Sources و Sinks

كما ذكرنا في السابق ان xss تحدث عندما يرسل المستخدم للصفحة مدخل و تقوم الصفحة بأخذ المدخل و عرضه مباشرة داخل الصفحة
و نحن الأن تعرفنا كيف من الممكن ان تقوم بقراءة جزء من رابط الصفحة كمدخل و تعرفنا كيف يمكن ان نقوم بكتابة كلام من خلال javascript بداخل الصفحة

اذاً الأن يتحقق لدنيا طرفي المعادلة التي تقوم بإحداث ثغرات XSS , نرى في الجزء التالي كيف يمكن ان تقوم بتنفيذ ثغرة XSS فقط من خلال Javascript

لن اسرد المزيد من الكلام النظري و دعونا ننتقل مباشرة إلى كود الصفحة التالي و نرى ماذا تفعل

<html>
<body>
<script>
document.body.innerHTML = location.hash;
</script>
</body>

الأن فقط بالنظر لكود الصفحة يمكن فهم ماذا تفعل

ببساطة الصفحة تقوم بكتابة location.hash و هو الهاش تاج # الذي يأتي في نهاية رابط الصفحة بداخل <body> </body>

نفتح الصفحة الأن من خلال المتصفح و نرسل اليها اي كلام بعد # لنرى اذا كان هذا الكلام صحيح ام لا

dombased_xss7

جميل لقد قامت الصفحة بطباعة الـhash tag كما كتبناه و عند تغير كلمة Test سوف تتغير النتيجة في الصفحة

طيب الأن ماذا سيحدث اذا ارسلنا كلمه test مصحوبة باكواد html او javascript ؟

مثل سوف ارسل للصفحة Xss Payload كالنالي :

<img src=x onerror=alert(1337)>

دعونا نرى النتيجة 🙂

dombased_xss8

هل لاحظت ما حدث ؟ الأن اتضحت لدنيا ثغرة xss بوضوح و تم تشغيل كود alert لـ 1337 🙂 هذا كان فقط مثال بسيط يوضح لدينا فكرة عمل ثغرات Dom-Based Xss

قد يسألني احد الأن هل تعتقد ان مثل هذة الثغرات قد تكون موجودة في كثير من المواقع !؟

الأجابة بالطبع نعم فثغرات Dom Based Xss ظهرت في اكبر المواقع العالمية مثل google , microsoft , yahoo , Adobe و غيرهم الكثير

و هذا مثال على احدى الثغرات الذي قمت باكتشافها بنفسي و ابلغت عنها في شركة Redhat

و الثغرة كانت في صفحة التسجيل الرئيسية لإنشاء الحسابات لموقع redhat.com

redhat

كيف يمكن إكتشاف ثغرات Dom Based Xss ؟

إكتشاف ثغرات Dom-Based Xss هي عملية ليست سهله لأنها تحتاج إلى فحص و تدقيق في اكواد Javascript و اغلب المواقع الأن تستخدم الكثير من اكواد Javascript قد يصل الكود فيها إلى الاف من الأسطر و سيصبح من الصعب ان تقوم بعمل ذلك و فحص هذة الأكواد بشكل يدوي

لكن اصبح هناك ادوات تساعد على اكتشاف مثل هذة الثغرات و من اشهر و اقوى هذة الأدوات هي اداة Dominitor و لكنها ليست مجانية للأسف والأداة هي عبارة عن متصفح firefox معدل يستطيع بتبع الـ Dom في الصفحات و يمكنه اكتشاف sinks و sources بمجرد زيارة الصفحة من خلال المتصفح

واليكم الفيديو التالي الذي يوضح فيه كيف استطاع مبرمج الأداة اكتشاف ثغرة Dom Based Xss في Google Plus Button

فيديو اخر لإكتشاف ثغرة اخرى في موقع google

و إلى هنا نكون قد غطينا اهم النقاط الأساسية في موضوعنا اليوم و اتمنى ان يكون الشرح كان واضحاً و سهلأً 🙂

المراجع

نبذة عن الكاتب

أحمد ابوالعلا : باحث امن معلومات مصري , متخصص في إختبار نظم الحماية و تجربة الأختراق و مهتم بإختبار تطبيقات الويب, قام باكتشاف العديد من الثغرات في مواقع و شركات عالمية مثل Ebay, Adobe , Apple , Twitter , Yahoo, Microsoft , Google و تم ادراج اسمه عده مرات بحائط الشرف تقديراً لجهوده.

التعليقات:

أضف تعليقاً | عدد التعليقات: (27)

  1. هيثم قال:

    رائع .. مجهود رائع وشرح واضح جدا:) بارك الله فيك 🙂

  2. محمد عصام قال:

    مقاله رائعه ومفيده جداً وياريت الكل يستفيد منها

    جزاك الله خيراً

  3. KING SABRI قال:

    موضوع أكثر من رائع أحمد و جهد وتفصيل جميل

    شخصيا استفدت كثيرا منه

    سلمت يداك

  4. Faris قال:

    شرح مفيد للغايه
    ونقطة بدايه أكثر من رائعه للـXss بشكل عام والـdom based بشكل خاص
    شفت الفيديو التانى للآداه
    حاجه رهيبه صراحة
    الفضول قتلنى لمعرفة سعرها وراسلتهم
    أتمنى منصدمش بس 😀
    مشكور على الشرح مان
    بالتوفيق

    • أحمد ابوالعلا قال:

      اللًه يخليك يا فارس , انا سعيد انه المقالة كانت مفيدة وحازت على إعجابك 🙂

      بخصوص اداة Dominitor هي فعلا اداة قوية و رائعة للغاية , كان لدي معلومة إن سعرها كان حوالي 200$ لكن اعتقد ان السعر اصبح اغلى بكثير الأن .

    • أحمد ابوالعلا قال:

      دكتور علي الشمري , صراحة كلامك هذا شرف لي و تاج اضعه فوق رأسي 🙂

      هدفنا في مجتمع الحماية هو فعلا الفائدة و نشر العلم و ان شاء اللًه هيكون في مزيد من المقالات التي تقوم بأثراء المحتوى العربي

  5. محمد واصل قال:

    شرح روعه تسلم ايدك يا احمد

  6. همام قال:

    السلام عليكم
    يا اخي اريد تعلم الاختراق و الحمايه هل تدلني على دورة لديكم او خارج موقعكم

  7. s3cg33k قال:

    موضوع اكتر من رائع , صراحه استمتعت بقرائته

  8. Dr.0rYX قال:

    شرح ولا اروع مشكورررررر
    انا بستعمل dominator pro من فترة وهو برنامج ناجح 100/100

  9. karim قال:

    موضوع رائع لكن كيف يمكننا حماية من هذه الثغرة

  10. احمد ممكن سؤال اريد اتواصل معاك على طول عندك فيسبوك رجائا

  11. ارجو ان تبعث لي طلب واكون ممنون منك اخي العزيز ارجوك وشكرا لك

  12. zero-day قال:

    هالنوع من الثغرات قد تكون قاتلة .. لازلت اتذكر ثغرة الهوتميل XSS عام ٢٠٠٥، الاف الايميلات انسرقت عن طريق الثغرة.

  13. امير اسدي قال:

    السلام عليكم هل من الممكن ارفآق متصفح Dominitor

    الي عنده ارجو ان لا يبخل علينآ بطرحة

  14. AKA R قال:

    دولي يا ابو حسن

  15. مازن قال:

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

  16. اريد ان استفسر عن ثغرات XSS هذه أعرف انها تعتمد على Client Side اي ان الكود ينفد على متصفح الضحية فقط بعد ارسال الرابط مربوط بكود JS . البيانات بعد الحصول عليها اين ترسل . !
    هل ترسل عبر Ajax مثلاً , و بالنسبة لدلة $_GET هل يمكن جعلها تعيد قيمة HTTP 404 في حال كان الرابط غير موجود ضمن روابط الموقع و بما في ذلك الروز الخاصة مثل # و & .. إلخ .

  17. ياسين قال:

    تستاهل كل الشكر و التقدير

أكتب تعليق