لاب رقم (5) | DOM XSS in jQuery anchor href attribute sink using location.search source

تعلم كيفية استغلال ثغرة DOM XSS في مكتبة jQuery عبر خاصية href. شرح عملي لحل لابات PortSwigger باستخدام بروتوكول javascript: لتنفيذ الأكواد الخبيثة بض

ثغرة DOM XSS في jQuery: عندما تصبح الروابط فخاً! ⚓🎯

DOM XSS in jQuery anchor href attribute sink using location.search source

مرحباً بصيادي الثغرات! اليوم سنبتعد قليلاً عن JavaScript الخام (Vanilla JS) لنلقي نظرة على مكتبة jQuery. رغم أنها سهلت حياة المطورين، إلا أنها أحياناً تسهل مهمتنا نحن أيضاً إذا لم تُستخدم بحذر!

لاب اليوم من PortSwigger هو:
DOM XSS in jQuery anchor href attribute sink using location.search source

اليوم سنتعلم كيف "نحقن" كودنا داخل رابط (Anchor Tag) وكيف نستخدم بروتوكول javascript: لتنفيذ المهمة. اربطوا الأحزمة! 🚀


🔍 ما هو الـ href attribute sink؟

في لابات XSS السابقة، كنا نحقن وسوم HTML كاملة مثل <img>. لكن اليوم، نحن محبوسون داخل خاصية الـ href (التي تحتوي على الرابط) في وسم الـ <a>.

المشكلة هنا أن الموقع يستخدم jQuery لتغيير مسار رابط "العودة" أو "الإرسال" بناءً على بيانات تأتي من الـ URL (المصدر هو location.search).


🧠 تحليل كود اللاب (The jQuery Code)

إذا فحصت الكود المصدري للاب، ستجد شيئاً يشبه هذا:

$(function() {
    var backLink = $('#backLink');
    var returnUrl = (new URLSearchParams(window.location.search)).get('returnUrl');
    backLink.attr('href', returnUrl);
});

ماذا يحدث هنا؟
1. الكود يبحث عن عنصر يحمل ID باسم backLink.
2. يقرأ قيمة من الرابط تسمى returnUrl.
3. يستخدم دالة .attr('href', ...) الخاصة بـ jQuery ليضع هذه القيمة داخل الرابط.

هنا تقع الثغرة! المطور سمح لنا بالتحكم في محتوى الـ href بالكامل. 😈


🛠️ خطة الهجوم (The Pseudo-protocol)

بما أننا داخل href، لا يمكننا كتابة <script> لأنها ستُعامل كجزء من الرابط ولن تعمل. الحل؟ استخدام بروتوكول الجافا سكريبت الوهمي!

الـ Payload السحري:

javascript:alert(1)

كيف يعمل؟
عندما يبدأ الرابط بكلمة javascript:، المتصفح يفهم أنه بدلاً من الانتقال لصفحة جديدة، عليه "تنفيذ" الكود الذي يليه فوراً بمجرد الضغط على الرابط.


📝 خطوات الحل العملية

  1. افتح اللاب وتفاعل مع الصفحة حتى تجد رابط "Back" أو ما يشبهه.
  2. في رابط المتصفح (URL)، ابحث عن الجزء الذي يبدأ بـ ?returnUrl=.
  3. قم بتغيير القيمة الموجودة لتصبح:
    ?returnUrl=javascript:alert(1)
  4. اضغط Enter لتحديث الصفحة بالرابط الجديد.
  5. الآن، اضغط على رابط "Back" الموجود في الصفحة.

النتيجة: 💥 بمجرد الضغط، ستنفجر نافذة الـ alert في وجهك! مبروك، لقد استغليت DOM XSS بنجاح.


💡 نصيحة الصياد (Bug Bounty Tip)

هذا النوع من الثغرات "خبيث" جداً لأن الكود لا يعمل بمجرد تحميل الصفحة (مثل الـ Reflected XSS)، بل يحتاج من الضحية أن **يضغط** على رابط.

  • أين تبحث؟ ابحث عن أزرار "رجوع"، "إلغاء"، أو "تغيير اللغة" التي تعتمد على روابط ديناميكية.
  • التطوير: في سيناريو حقيقي، يمكنك جعل الـ Payload يقوم بتحويل المستخدم لموقع تصيد أو سرقة بياناته بضغطة واحدة.

🚀 الخاتمة

jQuery أداة قوية، ولكن "القوة العظيمة تأتي معها مسؤولية أعظم". كباحث أمني، فهمك لكيفية تعامل المكتبات البرمجية مع المدخلات هو ما يميزك عن "الهاكر التقليدي".

إرسال تعليق