29 تغريدة 6 قراءة Jul 05, 2023
مع توجه الكون الى الترف الكوني، تتطور التكنولوجيا ملبيةً رغبة الانسان بتسهيل الحياه وزيادة ترفها، فعلى الصعيد البرمجي للمواقع تم اختراع المحركات (Engines) التي تعمل على نظام القوالب (Templates)
المصطلح الانقليزي [Templates Engines]
موضوعنا اليوم عن الـ SSTI اذا حبيت الموضوع سوي كوب شاي ☕️
وانت تسوي الشاي عطنا لايك وريتوت وشير
وعلى قولة المثل الاعجمي:
More Likes = More content 🙄
مع جلسات التجلي الي اسويها كل ما بغيت انزل بوست، السوال عن الوجوديات دايماً تاخذ نصيب الاسد في مخي، فف حقيقة انه لماذا اصلاً نستخدم التملبتس والتمبلت انجينز من الاسئله الشيقه، كوني انسان افضل اسلك الطرق الصعبه المفهومه عن الطرق الاسهل الغير مفهومه او غير واضحه لي ...
ولكن في الاونه الاخيره سويت لي سستم باستخدام Python Flask وهنا استطعت ان ارى الفرق بين البرمجة التمبلتيه وبرمجتي مثلاً للمواقع على الصعيد الشخصي كنت ابرمج بالـ php الصرف (بدون استخدام تمبلتز)
من الامثله الواضحه لو كانت سخيفه مثلاً، في المواقع الي (بدون تيمبلتز) اذا الهيدر والفوتر للصفحة بخليهم موجودين بكل صفحات الموقع كنت انسخهم والصقهم بكل صفحة، على عكس نظام التمبلتز الي يخليني احطهم بصفحات مستقله مثلاً header.html و footer.html واستدعيهم بكل صفحة وخلاص ...
اذا رأيت ان المشكله صغيره بقولك مو هنا المشكله اصلاً، المشكله اذا بغيت تغير بالهيدر او الفوتر فف انت محتاج تغيره بكل الصفحات بب الـ مواقع الي ما تستخدم التمبلتز ولكن مع التمبلتز فف انت تغير الهيدر نفسه والفوتر وهم بيتغيرون بكل صفحة 😎
وخذ على هالنقطه الكثير من الامثله، فنظام التمبلته يهدف لفصل الـ presentation layer عن الـ busnisses logic بمعنى اخر مثلاً انك تحط بالـ html متغيرات، وفي جهة السيرفر تسوي العمليات الي تبيها وترسل لليوزر الصفحة مع القيم للمتغيرات ..
وفي جهة الكلاينت سايد الصفحات تستبدل المتغيرات بقيّمها وتنعرض الصفحة باحلاسها واكلاسها عند اليوزر
ولذلك اهميات كثيره لا اجيد حصرها، لعل المبرمجين ابخص، ويا ليت المبرمجين يكتبون لنا بالتعليقات اهمية التمبلتز الي ما ذكرناها ⬇️
كوننا هنا نبي نتطرق لثغراتها لا لماهيتها 🤓
انتقالاً الى الثغرات والـ SSTI تحديداً، هذي الثغره ناتجة عن عدم فلترة الموقع لليوزر انبوت ، فإذا كان فيه صفحة تستقبل مُدخل من اليوزر وما تفلتره وتعرضه لليوزر كك نتيجة للعملية الموجوده بالصفحة قد تكون النتائج كارثية وفي اغلب الاحيان ممكن يحصل الهكرجي على RCE بالموقع
{نظرياً}
لو ان اليوزر الهكرجي يحقن الصفحة بب مدخل خبيث والصفحة تعتبره شي من ضمن الصفحة وتنفذ المُدخل، هنا قدر الهكرجي انه يسوي حقن للتيمبلت، حقن بمعنى اضفت للتمبلت شي برمجياً ما كان موجود فيه
فف اذا كان التمبلت مستخدم كك سيرفر سايد ، هنا يكون عندنا Server-Side Template Injection
حلو ؟
المفروض الحين انك خلصت كوب الشاي انصحك بالإيتاء بكوب اخر قبل الدخول بالشق العملي من الشرح 🤓
{عملياً}
نشوف الكود بالصوره هدفه نبيل وبسيط وفور ايديوكيشنال بربسيس ، نرى انه فيه فلاسك ابلكيشن اهم شي فيه الفنقشين: index() و greeting() كلهم على route/path واحد
index function:
تستقبل فقط GET request وترجع ملف index.html والي هو موجود بالصوره ادناه الثانيه والي بدوره فيه input تستقبل من اليوزر مُدخل اسمه name وتسوي POST request بالنيم عند الضغط على الزر submit
greeting function:
تستقبل فقط POST request والي منطقياً جايه من index.html، تاخذ قيمة الـ name وترجع Hi name داخل h1 هتمل تاق
حلو ؟ حلو
بعد ما خرجنا من نظره المبرمج، خلونا نشغل الابلكيشن ونجي عند المتصفح ونحول نظرتنا الى نظره هكرجيه 👁️
اول ما ندخل الصفحة ونحط اي اسم ينطبع لنا نفس ما توقعنا، عُرْفَاً الهكرجيه يحطون القيمه {{7*7}} عشان يشيكون هل فيه SSTI وهذا لانه اذا حطينا المدخل هذا ورجع لنا 49 وهو الناتج الحسابي لـ 7*7 فنعرف ان السيرفر قاعد يعتبر ان مدخلنا جزء من الصفحة وقاعد ينفذه، وهذا ما حدث لنا بالضبط
طبعاً اي شي تحطه بين {{ }} يعتبره التمبلت انجين انه متغير لازم ينفذه ويحط قيمته، ولو نبي نحط for loop مثلا ونطبع من 1 الى 5 بفلاسك يصير مثل الي بالصوره الاولى ادناه
على الطاري، خنجربه على الصفحه ونشوف النتيجة ...
بيرفيكتو ! فهمنا الان انه نقدر نحط اشياء والسيرفر ينفذها ويرجعلنا النتيجة
الان جاء الدور عشان نوصل للـ RCE باذن الله
*معلومات للذين يستمتعون بالتفاصيل *
مبدئياً لازم تعرف ان اي اوبجكت بالبايثون عنده كلاس وكل كلاس له base/super class من هذا الكلاس الي غالباً بيكون في قمة الهيكلية ( root node ) تقدر منه تستعرض الهكيليه وتجمع معلومات عن الفنقشنات او الـ subclasses المتاحه
فبما اننا ما نقدر نستدعي مثلاً os.system() فنقشن عشان نجيب RCE من التمبلت، فف لذلك حنا نبي نصعد الى اعلى كلاس ونستعرض السب كلاسات او الفنقشنات الي نقدر نستخدمها
بنبداء باننا نرجع لكلاس الاوبجت للسترينق الفاضي (مو شرط يكون فاضي ترى) الي بيكون نتيجته سترينق وهذا طبيعي ومنطقي مثل ما نشوف بالصورتين التاليتين
الان نبي نرجع للسوبر كلاس او البيس كلاس تبع كلاس السترينق الفاضي طبعاً اذا طلع لنا النتيجة انه اوبجكت هذا يعني اننا بالمسار الصحيح
الان نقوله طلع كل السب كلاسات لهذا الكلاس والي غالباً هي عباره عن فنقشنز
افضل فنقشنز يوصلنا للـ RCE هو subprocess.Popen وهو موجود بالفعل باللسته الي طلعناها
عن نفسي انا غالباً احطهم بملف واخلي بدال ما بينهم مسافات اخليها لاينات عشان اعرف الاندكس الصحيح تبع الفنقشن subprocess.Popen وبما انه العد يبدا من 0 وليس من واحد فف ننقص من عدد اللاينات واحد عشان نطلع الاندكس بالضبط
فف هنا اللاين تبع الفنقشن 416 ننقص منه واحد لان العد يبدا من 0 فف يطلع لنا الاندكس الصحيح حقه هو 415
ممتاز ! الان نشوف الفنقشن بالدوكيمنتيشن وطريقة استعمالها كالتالي ..
خل الكوماند بدال ما بين الامر والارقيومنت مسافات خله كلهم كك اراي، مثال لمن تبي تستدعي ls -al تخليها كذا ['ls','-al'] كما هو موضح بالصور ادناه ..
ممتاز الان ننتقل للـ reverse shell صراحه حست فيه شوي لين مشيت مع اخر حركه اذا خربت وياي الا وهي اني احفظ بايثون سكربت يعطيني reverse shell بب ملف واسحبه من السيرفر واحفظه بب الـ /tmp لان هذا المجلد غالباً اي واحد يقدر يضيف ملفات فيه، وبعد ما احفظه اشغله كما هو بالصور ادناه
نايسي !! حصلنا شل ولله الحمد
انا جداً فخور فيك كونك وصلت لهالنقطه من الشرح اشكرك جزيل الشكر 🌺🌺 خذ ورده زياده 🌺
والى هنا وصلنا لنهاية شرحنا وفالكم التوفيق انتظرونا بب قصه واقعيه عن الثغره هذي باذن الله قريب 🤩

جاري تحميل الاقتراحات...