كيفية اختراق حسابات Medium عبر Brute Force
السلام عليكم ، قبل يومين من الأن كنت ابحث في كوكل عن بعض البايلودات الجديدة وفجاة دخلت على موقع medium فجاة تم تشغيل باي لود 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 قد شرحناه سابقاً في مقال سابق . يمكنك الاطلاع عليه .
سيبقى هذا السكربت مخزن في قواعد البيانات لذلك سيكون 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 لتغير الايميل الى abdullah.test1@gmail.com نقوم بوضع السكربت في الهاش كالأتي : هنا
بعد الضغط على الرابط سنفتح console المتصفح لنرى اذا تم ارسال الطلب بعد الضغط على الرابط
بالفعل تم إرسال طلب الى me/email لتغير الايميل وتم الحصول على 200 ok ومعناه ان التغير قد تم . لنذهب لنرى الايميل
تم الحصول على رسالة التغير بمجرد الدخول وعمل نسيت كلمة المرور سوف نحصل على الحساب بالكامل .