مجتمع عربي للحماية وأمن المعلومات

ما هو AngularJS و كيفية استغلال AngularJS​ ​Template​ ​Injection 

313

ما هو AngularJS ؟ 

لا يخفى على الكثير من مبرمجي مواقع الانترنت “منصة الـ AngularJS” والتي يعود تاريخها الى عام ٢٠١٢ , حيث قامت ببنائها شركة GOOGLE بناءً على  مكتبات لغة الـ JavaScript , فقد جاءت هذه المنصة لتوفر السرعة والكفائة عبر الكثير من الاضافات والمميزات لتضفي تميزاً في مجال الFront-End Development اي بما يتعلق بمظهر الموقع , وضف على ذلك انها مبنية على الMVC Design Pattern والذي يعتبر من اشهر انماط البرمجة في وقتنا الراهن .

مثال بسيط على استخدام منصة الـ AngularJS

 

JS Example

سوف يظهر جمع 5 + 5 = 10 

كيف يتم حقن قالب AngluarJS 

 

في المثال السابق استخدمنا مصطلح متعارف عليه في الAngularJs وهو الExpression وهو كل ما بين الاقواس

{{ expression }} وهو المكان الذي سنقوم فيه بحقن البايلود Payload وهو كود الJavaScript

 

هذا يعني : إن قام المستخدم بادخال {{ }} فان مترجم الـ AngularJs سيقوم بتحويله وينفذه مما سيؤدي الى

ثغرة XSS – Cross Site Scripting من خلال Angular Expression

 

ملاحظة : حقن قالب الـ AngularJs فقط يكون في عنصر الAngular اي ng-app

 

كيف يحدث الحقن ؟ 

 

إن اي  تجربة بسيطة لحقن بايلود الXSS  في احدى قوالب الAngularJs لا يؤدي الى ظهور ثغرة XSS ما لم يكن بالشكل المطلوب اولاً , وثانياً ما لم تتخطى ما يعرف بالـAngularJs Sandbox

 

ملاحظة : لمعرفة الباراميتر او العنصر المصاب بهذه الثغرة او لا يمكنك ان تقوم بتجربة بدائية وهي {{7*7}} فان كانت النتيجة 49 فهو مصاب ويمكنك الاستمرار وفي بعض التطبيقات ممكن استخدام [[7*7]] وان نجحت بالتنفيذ فاستمر باستخدام [[ ]] في جميع البايلودات المستخدمة

مثال : ان قام المستخدم بحقن البايلود <script>prompt('XSS')</script>

فالنتيجة ستكون &lt;script&gt;prompt(&#39;XSS&#39;)&lt;/script&gt;

هنا يظهر ان التطبيق آمن من ثغرة الXSS لكن في الحقيقة نحن لم نتبع أساسيات الحقن فالبايلود ليس بالشكل المطلوب ولم نتخطى الSandbox

 

كيف نحسن Payload المستخدم ؟ 

 

هيا نحسن البايلود عبر اضافة فورمات الAngularJs

البايلود بالفورمات المطلوب : {{prompt(‘XSS’)s}}

النتيجة : ايضاً لم ينفذ البايلود وذلك بسبب حظره من قبل الAngularJs Expression Sandbox

 

لا ليس كما تظن,  التطبيق الى الان ليس آمن وذلك حسب مرجع ووثائق الـAngularJs Documentation فشـــركة الـGOOGLE تنـوه الى ان تعابيــر الAngularJs Expression لا تقدم حمايــة بل زد علــــى ذلك ان الـExpressino Sandbox مهمته الرئيسية ليست الحماية او ايقاف الهاكر بل هي لفصل وتنظيم اجزاء التطبيق وعمله بكل سلاسة وبعيداً عن اي هشاشة فيه

 

كيف تتخطي AngularJs Expression Sandbox ؟

 

حتى عند الرجوع الى مرجع الـAngularJS Documentation وخاصة ما يتعلق بالخلط بين الجهتين السيرفر والعميل  Mixing Server-Side and Client-Side Template فالثغرة تكون مؤثرة اكثر اي بمعنى آخر ان قام المستخدم بادخال بايلود وقامت جهة السيرفر بتحويله وتنفيذه فيمكننا الحصول على ثغرة من نوع XSS

لذلك ما سنقوم به هو الخروج من الSandbox ويمكن ان يحدث ذلك عبر :

  1. اعادة كتابة بعض الFunctions الموجودة  في منصة الAngularJs مثل

charAt

fromCharCode

toString

alert js

 

 

  1. استدعاء الـ AngularJs Constructor وقد انتشر  في السابق الكثير من البايلودات من نفس النوع والي يمكن تنفيذه عبر استدعاء الConstructor وسنسرد في نهاية المقال بعض المراجع والConstructor هو built-in Function لاي Class موجودة , لكن في حالتنا هو Class وهو property اي خاصية تتبع الObject مثل الطول والعرض واللون …الخ  وممكن استدعائه مثله مثل اي خاصية اخرى

example

 

وهنا ما قمنا به هو عمل function يحتوي على (1)alert وهو من نوع anonymous , فبحسب لغة الجافا سكريبت فيمكنك عمل function مثال

فالسطر الاول قمنا بإنشاء هذا الFunction الذي لا اسم له والذي سيكون بنيته كما السطر 3,4,5

 

لذلك اذا اردنا ان نستعرض بنية هذا الfunction فيمكننا من خلال (constructor.constructor.alert(1

اما اذا اردنا تنفيذه بدون معرفة اسم هذا الFunction فكل ما علينا فعله هو اضافة () ليصبح بذلك كما في الصورة ادناه

وممكن استدعاء الFunction من خلال الscope وهو عنصر اساسي في منصة الAngularJs للتعامل مع الControllers والعناصر الاخرى

 

 

في النهاية :

 

إن كنت تستخدم منصة AngularJs كـ Front-End فيجب عليك فلترة ال{{ }} او حتى ان كنت تستخدم Markup لغة ترميزية مثل ال[[ ]]  فأيضاً يجب ان تقوم بفلترة المدخلات جيداً واعتبارها خطراً حقيقاً على الموقع , وينصح ايضاً بالابتعاد عن استخدام الAngularJs من جهة السيرفر بما يتعلق بترجمة مدخلات المستخدم

كما رأيتم فان هناك عدة طرق لتخطي الـ AngularJs Expression Sandbox وتكلمنا عن كيفية حدوث هذا التخطي ومنها انشاء Function جديدة تحتوي على كود الجافا سكريبت لتفعيل الXSS او من خلال اعادة كتابة Functions موجودين في المكتبة اصلاً , لكن تختلف في طريقة التطبيق والاستدعاء

 

مراجع :

 

الموقع الرسمي لـ AngluarJS : 

https://docs.angularjs.org/guide/security

الاسغلالات المستخدمة ” Payloads ” 

blog.portswigger.net/2016/01/xss-without-html-client-side-template.html

بعض من الثغرات المقدمة من خلال الهاكرز لبرامج المكافئات علي منصة HackerOne

– https://hackerone.com/reports/230234

– https://hackerone.com/reports/141463

– https://hackerone.com/reports/141240

تعليق 1
  1. sohaip-hackerDZ يقول

    رائع اخي

اترك رد

لن يتم نشر عنوان بريدك الإلكتروني.

تنوية

لدعم الموقع ماليا يمكنك أيقاف Adblocker وبرامج حجب الاعلانات , لا تقلق لن تجدد أعلانات منبثة او اي شئ قد يعرقل تصفحك للموقع لكن نحن نستخدم مشروع CoinHive لتعدين عملة Monero من خلال المستخدمين يمكنك القراءة عن المشروع من الموقع الرسمي

Close
%d مدونون معجبون بهذه: