ثغرة DOM XSS في AngularJS: عندما تصبح الأقواس المشفرة بلا قيمة! 🅰️ سحر الـ Expressions
مرحباً بصيادي الثغرات! اليوم سندخل منطقة تقنية ممتعة جداً. في اللابات السابقة، كنا نعتمد على حقن وسوم HTML أو كسر الخصائص (Attributes). لكن ماذا لو أخبرتك أننا سنقوم بتنفيذ كود JavaScript بدون الحاجة لأقواس < > أو علامات تنصيص "؟
لاب اليوم من PortSwigger هو:
DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded
اليوم سنتعلم كيف نستغل محرك الـ Expressions في AngularJS لتنفيذ الـ XSS. لنبدأ! 🚀
🔍 ما هو الـ AngularJS Expression؟
في مكتبة AngularJS، يتم استخدام أقواس مزدوجة {{ }} لكتابة أكواد بسيطة داخل الـ HTML، وهو ما يسمى بالـ Expressions. محرك AngularJS يبحث عن هذه الأقواس ويقوم بتنفيذ ما بداخلها.
مثلاً، إذا كتبت {{ 1+1 }}، سيقوم المتصفح بعرض الرقم 2. المشكلة تبدأ عندما يتم وضع مدخلات المستخدم داخل وسم يحمل خاصية ng-app، لأن AngularJS سيعتبر أي شيء نكتبه بين الأقواس المزدوجة كوداً برمجياً!
🧠 تحليل اللاب (The No-Quotes Challenge)
في هذا اللاب، الموقع يقوم بتشفير الأقواس وعلامات التنصيص (HTML Encoding)، مما يعني أن الطرق التقليدية لن تعمل. ولكن، بما أن الصفحة تستخدم AngularJS (ابحث عن كلمة ng-app في وسم الـ <body>)، فنحن لسنا بحاجة للهروب من الـ HTML.
نحن فقط بحاجة لكتابة Expression يفهمه AngularJS ويقوم بتنفيذه.
🛠️ خطة الهجوم (The Expression Injection)
سنقوم بحقن كود داخل الأقواس المزدوجة {{ }}. وبما أننا ممنوعون من استخدام علامات التنصيص، سنستخدم خاصية في JavaScript للوصول إلى كائن الـ constructor الخاص بالسلاسل النصية وتنفيذ كود الـ alert.
الـ Payload السحري:
{{$on.constructor('alert(1)')()}}
أو النسخة التي تعمل غالباً في هذه اللابات:
{{constructor.constructor('alert(1)')()}}
كيف يعمل هذا الكود؟
1. الأقواس {{ }} تخبر AngularJS أن ما بداخلها هو Expression.
2. كلمة constructor تسمح لنا بالوصول إلى "باني" الدوال في جافا سكريبت.
3. نقوم بإنشاء دالة جديدة تحتوي على alert(1) ثم نقوم بتنفيذها باستخدام الأقواس النهائية ().
📝 خطوات الحل العملية
- افتح اللاب واذهب إلى مربع البحث.
- ضع الـ Payload التالي:
{{constructor.constructor('alert(1)')()}}. - اضغط Search.
النتيجة: 💥 ستجد أن الصفحة قامت بمعالجة الكود وظهرت نافذة الـ alert رغم أن كل مدخلاتك كانت مشفرة HTML! لماذا؟ لأن AngularJS قرأ الكود بعد أن قام المتصفح بفك تشفيره في الـ DOM.
💡 نصيحة صياد (Angular Discovery)
كيف تعرف أن الموقع مصاب أو يستخدم AngularJS؟
- ابحث عن الكلمات المفتاحية: ابحث في الكود المصدري عن
ng-app،ng-controller، أو روابط لملفاتangular.js. - اختبار بسيط: جرب كتابة
{{7*7}}في أي مربع إدخال. إذا رأيت الرقم49يظهر في الصفحة، فالموقع مصاب بـ Template Injection ويمكنك تحويلها لـ XSS بسهولة.
🚀 الخاتمة
ثغرة AngularJS Expression تعلمك أن الحماية التي تركز على "الرموز" (مثل تشفير الأقواس) قد تفشل تماماً أمام منطق عمل المكتبات البرمجية. كباحث أمني، دائماً انظر إلى "الأدوات" التي يستخدمها الموقع، فغالباً الثغرة تكون في طريقة عمل الأداة نفسها.
.png)