السلام عليكم ، قبل يومين من الأن كنت ابحث في كوكل عن بعض البايلودات الجديدة وفجاة دخلت على موقع medium فجاة تم تشغيل باي لود XSS في الصفحة بدون ان اقوم باي شيء ؟!

بعد البحث وجدت ان الصفحة تحتوي على كود جافا سكربت يقوم بقراءة أسم الموضوع من دون فلترة ولكن الطول محدود لأسم الموضوع .

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

 

البداية


في بداية الأمر بعد ان عرفت أين يكون حقن البايلود عملت حساب في الموقع وعملت موضوع جديد بإسم الباي لود لكي نجربه .

 

1

وبعد الدخول للصفحة تم تنفيذ الباي لود كالأتي :

2

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

بعد البحث وجدت ان الإيميل يتغير بدون باسورد لذلك اذا سرقنا Token يمكننا القيام بطلب CSRF وتغيير الإيميل لإيميل المهاجم بدون ان يعرف الضحية .

مشاكل واجهتني 

  • الطول الخاص بالموضوع محدود وحتى اذا وضعت إسم موضوع طويل لن يتم إظهار إلا بعضه .
  • طلب تغير الإيميل يعمل على PUT وحسب وثيقة نفس المصدر لا يمكن ان نقوم بطلب من خارج الصفحة حتى لو كان token صحيحاً .
  • وجود CSP شبه قوي على المصادر الخارجية سنشرحه الأن .

 

بعد ذلك لو كنت تملك ثغرة XSS وكان مكان الحقن يسمح بطول معين لذلك ستقوم بإستدعاء ملف JS من خارج الموقع وكالأتي :

-1

في الصورة قد غيرت إسم الموضوع الى حقن ملف JS من خارج السيرفر . ويحتوي على alert(1337)x لو الأن شغلنا الموقع يجب أيضاً ان يظهر صندوق نص يحتوي على 1337 . لكن لو شغلت الصفحة الأن لن يعمل الباي لود !؟ لماذا ؟!؟ . بسبب وجود CSP تمنع تشغيل ملفات JS من خارج الموقع .

 

ما هي CSP  ؟ 


CSP هي مختصر ل Content Security Policy  ومعناها وثيقة أمن المحتوى ووظيفتها بتحديد إرشادات للمتصفح بكيفية تشغيل المحتوى ومصدره مع الخطوط او الصور او السكربتات . في أكثر الحالات حتى لو وجدت XSS لن تستطيع تشغيلها ما لم تتخطى CSP الأمر في بعض الأحيان صعب لكن في هذه المرة كان سهلاً علي تخطيها لوجود خطأ في اعدادها . بحيث الكود الاول تم تشغيله في نفس الصفحة لكن حين نستدعي سكربت من خارج السيرفر سوف يقوم بالرفض . لذلك فالحقن في الصفحة غير محمي بnonce وهو رقم او عبارة عشوائية تحدد ما يجب تشيغله في الصفحة في موقع medium لم يتم تحديد nonce فيمكن تشغيل اي سكربت في الصفحة .

وهذا خطأ شائع قد تم ذكره في مؤتمر hack in the box بواسطة اثنين من مهندسين كوكل الأمنين .

ومن السلايدات هذا السلايد الذي يتكلم عن السبب في حصول تخطي .

4

وكانت CSP الخاصة بموقع Medium في الصورة

-2

التخطي تم عن طريق وجود الheader باللون الاصفر لاحظوا انه تم استخدام unsafe-inline  والتي تسمح لجافا سركبت بالعمل في نفس الصفحة لو كان تم استخدام nonce لكان من الصعب جداً وليس المستحيل جعل الاستغلال يعمل .

 

تجميع الافكار 


بعد ان جمعت المعطيات الان لنبدأ بعمل الاستغلال الصحيح وكل فكرة سنقوم بطرح المعطيات وحلها كما ياتي :

 المعطيات

الحل

 وجود CSP لا يمكن استدعاء سكربت خارجي السكربت يجب ان يكون كله في الصفحة
 وجود SOP تمنع تغيير الايميل من طلب خارجي  يجب ان يتم الطلب من داخل الموقع نفسه
 طول الاستغلال محدود وقصير لا يمكن استعماله  تنفيذ سكربت قصير يستدعي سكربت طويل من احدى خواص الصفحة
 مشاكل في كتابة الاستغلال على الموقع  تجريب الاستغلال محلياً ثم تنفيذه على الموقع

 

كتابة الاستغلال 


بعد ان قمنا بجمع المعلومات الان سنستعمل الجافا سكربت لكتابة الإستغلال كاملاً

 

اولاً : يجب ان نقوم بسرقة التوكن لعمل طلب CSRF لتغير الايميل 

التوكن موجود في الصفحة باسم xsrfToken في احدى وسوم السكربات .

5

لذلك سنقوم بعمل دالة تبحن عن التوكن وتخرجه برسالة alert لنتأكد من العمل قمت ببرمجة الدالة وكالأتي :

code1

هذا السكربت في ملف html عادي لنجرب اذا كان الكود سيتم تنفيذه لكن سنشرح بعض خصائصه سيكون سهل الفهم على من يعرف لغة JS حين يتم تنفيذ الكود عن طريق وسم IMG في ONERROR سوف يقوم السكربت بالبحث في نص الصفحة الحالية على كلمة xsrfToken ويقوم بعدها بقراءة ما بعد هذه الكلمة ب12 مرتبة حسب طول الكلمة والفوارز (حتى يتم إظهار التوكن فقط) الى نهاية الصفحة ومن ثم يحسب طول التوكن الذي هو 16 فيقوم باظهار 16 حرف فقط واهمال الباقي . وبعد تشغيله نحصل على :

7

الإستغلال الأولي يعمل بشكل صحيح الأن لنجربه في الموقع . هذا الكود طويل سوف نقوم بعمل قراءة لهاش الصفحة وتحميله عليه .

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

 

سوف يقوم document.write  بعمل كتابة للكود الجديد في الصفحة الحالية ثم يقوم بتعديل المحتوى من الencode الخاص بالرابط عن طريق decodeURIComponent  لقراءة window.location.hash وهذا هو هجوم DOM based XSS قد شرحناه سابقاً في مقال سابق . يمكنك الاطلاع عليه .

مقال : ثغرات DOM based XSS الجزء الأول.

مقال : شرح ثغرات DOM Based XSS الجزء الثاني.
8

سيبقى هذا السكربت مخزن في قواعد البيانات لذلك سيكون stored XSS يقوم بقراءة الرابط في كل مرة بدون الحاجة الى تجديده .الأن نقوم بتحميل السكربت على هاش الصفحة بعد # الرابط كالاتي:

بعد الدخول على الرابط سيتم اظهار التوكن

7

 

ثانياً : الان نقوم بعمل السكربت الذي سيقوم بارسال طلب تغير الايميل مع استخدام التوكن الذي وجده في الصفحة

cod2

الأن سيقوم هذا السكربت بعمل طلب PUT لتغير الايميل الى abdullah.test1@gmail.com نقوم بوضع السكربت في الهاش كالأتي : هنا

بعد الضغط على الرابط سنفتح console المتصفح لنرى اذا تم ارسال الطلب بعد الضغط على الرابط

3

بالفعل تم إرسال طلب الى me/email لتغير الايميل وتم الحصول على 200 ok ومعناه ان التغير قد تم . لنذهب لنرى الايميل

email

تم الحصول على رسالة التغير بمجرد الدخول وعمل نسيت كلمة المرور سوف نحصل على الحساب بالكامل .

فيديو لكل ما تم ذكره هنا وتبين كيف يتم الهجوم

 

الاستنتاج 


  • استعمال nonce في CSP مهم جداً .
  • يجب وضع تاكيد باسورد على تغيرر الايميل لتجنب CSRF .

 

روابط مفيدة 


 

لأي إستفسار إترك تعليقاً او تواصل معي عبر حسابي في تويتر. شيء أخير لا تنسى ان تفهم الأساسيات بدقة وهذا المقال يحتوي على مصطلحات وأساليب متقدمة ستتعلمها ان شاء الله في المستقبل لكن اهم ما عرفته في هذا المقال هو تطوير ثغراتك من ثغرات ذات تاثير متدني الى سرقة الحساب بالكامل وهناك فكرة تحدي جديدة سنقوم بنشرها قريباً تخص عمل سلسلة من الاستغلالات.

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

تحياتي وتحيات فريق “iSecur1ty”