در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به آشنایی با Server Side Template Injection می پردازیم.
Templates and Frameworks
موتورهای الگوبرداری یا Templating Engines راهی ساده را برای توسعه دهندگان فراهم میکنند تا صفحات وب را به صورت پویا برای بسیاری از چارچوبها ایجاد کنند. موتورهای الگوبرداری اجازه میدهند برای:
• گسترش داده از برنامه به حوزه نمایش (View Area)
• Looping از طریق داده برنامه
• در برخی موارد، محیط Scripting که به طور مستقیم با زبان مرتبط است.
به دلیل این ویژگیها، الگوها هسته اصلی اغلب، (البته نه همه) فریمورکها هستند. آنها به یک توسعه دهنده اجازه میدهند تا کد خود را کمتر تکرار کند و همچنین کد کمتری بنویسد.
برخی از موتورهای الگوبرداری دسترسی مستقیم کمتری به زبان Backend دارند. با این حال، موتورهای الگوبرداری محبوب تر این کار را انجام می دهند.
Template Engines
جدول این اسلاید نمونهای از کدهای مربوط به الگوها را نشان میدهد و برای تغییر صفحات HTML که برنامهها استفاده میکنند، مورد استفاده قرار میگیرد. برخی از موتورهای الگوبرداری موجود در این نمودار، موتورهای الگوبرداری پیشفرضی هستند که در برنامه مورد استفاده قرار میگیرند.
ASP.NET و ASP.NET MVC به طور مناسبی در جامعه خود تجویز شدهاند. به این ترتیب، بیشتر توسعه دهندگان ASP.NET و ASP.NET MVC تمایل به استفاده از Webform ها برای ASP کلاسیک یا Razor برای ASP.NET دارند.
Java Struts دارای OGNL به عنوان موتور الگوی اصلی خود بود، اما جامعه به استفاده از Freemarker روی آورده است.
PHP دارای انواع مختلفی از موتورهای الگوبرداری است که محبوب هستند. اولین سیستم الگوبرداری محبوب، Twig یا Smarty بودند. جامعه PHP به خودی خود در برابر استفاده از فریمورهایی مانند CakePHP و Symphony برای سالها مقاومت کرد. در ادامه توسعه دهندگان PHP موفق به ساخت چارچوبهای خودشان شدند. اکثر این توسعه دهندگان چارچوب، استفاده از Twig یا Smarty را انتخاب کردند، اما به سمت Mustache و Slim تغییر مسیر دادند. Mustache برای توسعه دهندگان JavaScript بسیار محبوب است.
توسعه دهندگان پایتون که از Django استفاده میکردند، تمایل به استفاده از موتور پیشفرض الگوبرداری Django داشتند، با این حال، برای Flask، Micro Framework Application و پروژههای دیگر،Jina2 محبوب است. از سوی دیگر، Ruby on Rails، بسیار شبیه به ASP.NET بسیار معتبر بود و برای بسیاری از پروژههای موجود، eRB یا Embedded Ruby موتور پیشفرض است. آخرین اما نه کمترین چارچوب JavaScript است. این زبان نیز دارای موتورهای الگوبرداری میباشد. EJS یا Embedded JavaScript بسیار محبوب است، اما موارد دیگری نیز وجود دارند.
Template Relationships to MVC
برای ارائه زمینه ای در مورد نحوه کار این موتورها و گنجانده شدن در چارچوب های مختلف، اجازه دهید به مثال MVC خود اشاره کنیم. در یک برنامهMVC معمولی، حالت View توسط Model بروز رسانی شده و توسط Controller به Model هدایت میشود. برای سهولت ایجاد صفحات Dynamic View، میتوان از یک موتور الگوبرداری استفاده کرد. به این ترتیب، توسعه دهنده نباید نگران ایجاد صفحات سازگار باشد. همچنین توسعه دهنده نباید نگران کنترلهای دسترسی یا Authorization باشد. در عوض، کنترلهای دسترسی و Authorization را میتوان به عنوان مثال در Controller در نظر گرفت. مؤلفههای HTML برای منو، Head Statements، Footer و موارد مشابه نیز میتوانند در یکی از مؤلفههای موتور الگوبرداری به کار گرفته شوند و برای سازگاری در کل برنامه گنجانده شوند.
یک مزیت دیگر در اینجا این است که یک توسعهدهنده در نهایت میتواند منطق را از توابع کنترلکننده دور کند و در بسیاری از موقعیتها به نمای برنامه بپیوندد. در واقع، موتورهای الگوبرداری، تعمیر و نگهداری برنامه را به طور بالقوه آسانتر میکنند. با این حال، اگر ایمن سازی نامناسب وجود داشته باشد، ناحیه تزریق جدیدی نیز برای مهاجمان فراهم میکند.
Server Side Template Injection
Server Side Template Injection یا SSTI یک آسیبپذیری است که در آن مهاجم میتواند محتویاتی را که توسط موتور الگوبرداری ارائه میشود با محدودیتهای کم یا بدون محدودیت کنترل کند و در واقع کدهای کنترلشده توسط مهاجم را ارائه کند. این آسیبپذیری از خانواده تکنیکهای تزریق مانند XSS،CSRF و SSRF است.
در مثال بسیار ساده ما، ما یک برنامه تحت Flask داریم که در آن یک عبارت از آیتمها در درون شی people گنجانده شدهاست.
در این مثال هیچ فرآیند پاکسازی یا Sanitation وجود ندارد، بنابراین یک مهاجم میتواند Reference را در اینجا کنترل کند و بدون هیچ محدودیتی کد موتور الگوبرداری خود را منتقل کند. این آسیبپذیری در زبانهای دیگر نیز مانند جاوا، Struts و OGNL دیده شدهاست.
Template Injection: Discovery
کشف آسیب پذیری Template Injection میتواند شکلهای مختلفی داشته باشد. با این حال، به نظر میرسد که روش عمومی از یک عملیات منطقی مانند ریاضی درTemplate استفاده میکند. یک متغیر که تغییر میکند مکانیزمی است که برای تزریق استفاده میشود. موارد زیر به منظور شناسایی آسیب پذیری Template Injection مفید هستند:
میتوان با افزودن تصادفی } به انتهای هر درخواست، منجر به نمایش یک صفحه خطا شود که اطلاعاتی را در اختیار کاربر قرار دهد. این موضوع بسیار شبیه به تست تزریق SQL، که میتواند اطلاعات لازم به نفوذگر بدهد.
Template Injection: Reading Internal Values
در بسیاری از زبانهای اسکریپتی بررسی درونی یک شی می تواند بسیار ساده باشد. از آنجا که موتورهای مبتنی بر الگوبرداری به طور معمول موتورهای نوشتار تعبیهشده (Embedded Scripting Engines) با دسترسی کامل به زبان هستند، میتوان به راحتی موتورها را وادار کرد که اشیاء را از داخل الگو بسط دهند.
فراخوانی یک متغیر در پایتون به مهاجم این امکان را میدهد که محتویات آن را بخواند، در حالی که در روبی شما میتوانید از اشیا در مورد آیتمهای مختلف مانند اینکه چه متدهایی دارد، یا در چه مواردی متغیرهای نمونه در دسترس هستند، سوال کنید.
Template Injection: Remote Code Execution
اجرای کد در Template Injection تحت شرایط خاصی امکان پذیر است.
• موتور الگوبرداری امکان Sandbox Escape را فراهم میکند، یا Sandbox وجود ندارد.
• اگر یک Sandbox وجود داشته باشد، روشی برای پاک کردن Sandbox وجود دارد (برای مثال با OGNL و جاوا)
• مهاجم می تواند زبان زیر سیستم را Fingerprint کند.
یکی از گزینههای محبوب برای اجرای کد، درک روشی است که هر زبان میتواند دستورهای سیستم را فراخوانی کند. پایتون ۲ و ۳ دارای کتابخانهای هستند که به عنوان subprocess شناخته میشود، روبی دارای IO است و جاوا متد Java.Lang.Runtime را دارد. بسیاری از این زبانهای اسکریپتی دارای بیش از یک راه برای راهاندازی اجرای کد هستند، برای مثالRuby به طور معمول از بکتیک (`) در اسکریپتها برای فراخوانی دستورات سیستم عامل استفاده میکند، اما در این زمینه، بکتیک ها در دسترس نخواهند بود. به این ترتیب، میتواند کتابخانه سیستم اساسی را که در این زبانها حیاتی است، فراخوانی کند.
Template Injection: Exploit Creating in Python
پایتون، مانند تمام زبانهای شی گرا، دارای وراثت کلاس است. وراثت کلاس ارزشمند خواهد بود زیرا به مهاجمان اجازه خواهد داد تا یک Payload را بسازند که میتواند برای بازگرداندن شی با شی مناسب که میتواند مکانیزمی برای تزریق دستور یا اجرای کد فراهم کند، ایجاد کنند. بیایید از یک مثال ساده مانند یک رشته خالی استفاده کنیم (”).
Template Injection: tplmap
یک اسکریپت پایتون وجود دارد که کشف و حمله به Template ها را خودکار میکند. این برنامه برای بیش از ۱۵ موتور الگوبرداری، موتورهای الگوبرداری Unsandboxed و دستورالعملهای عمومی eval() پشتیبانی دارد.
Tplmap.py چند حالت عملیاتی دارد. این برنامه میتواند با انتقال URL به برنامه، درخواستهای GET را بخواند. همچنین میتواند از بررسی درخواستهای POST پشتیبانی کند و Header ها را هم برای احراز هویت و هم برای حمله مدیریت کند. tplmap این قابلیت را دارد که به عنوان یک Burp Extension اجرا شود.