ثغرة DOM XSS: اختراق القوائم المنسدلة والهروب من سجن الـ Select! 📑🔓
مرحباً بكم من جديد في رحلة صيد الثغرات! اليوم سنتعامل مع سيناريو يتكرر كثيراً في المواقع التي تخصص تجربة المستخدم بناءً على اختياراته، مثل اختيار "اللغة" أو "المدينة" أو "المتجر".
لاب اليوم من PortSwigger هو:
DOM XSS in document.write sink using source location.search inside a select element
اليوم سنتعلم كيف نكسر هيكل القائمة المنسدلة لنقوم بحقن كودنا الخاص. استعدوا للتركيز! 🚀
🔍 تحليل الكود (Reading the Script)
عند فتح اللاب، ستجد قائمة لاختيار المدينة. إذا فحصت الكود المصدري، ستجد كود JavaScript يقوم بمهمة محددة: هو يأخذ قيمة الـ storeId من رابط المتصفح (URL) ويضعها داخل القائمة باستخدام document.write.
الكود يبدو تقريباً هكذا:
var stores = ['London','Paris','Milan'];
var storeId = new URLSearchParams(window.location.search).get('storeId');
document.write('<select name="storeId">');
if(storeId) {
document.write('<option selected>' + storeId + '</option>');
}
// ... باقي الكود
أين تكمن الثغرة؟
الموقع يأخذ القيمة من الرابط (Source) ويضعها مباشرة بين وسمي <option> و </option> (Sink). المشكلة أننا إذا وضعنا كود XSS هنا، سيظن المتصفح أنه مجرد نص داخل القائمة وليس كوداً قابلاً للتنفيذ.
🛠️ خطة الهروب (The Breakout Plan)
لكي يعمل الكود الخاص بنا، لا يمكننا كتابته ببساطة داخل الـ Option. يجب أن نقوم بـ "تخريب" هيكل الـ HTML الذي يبنيه السكريبت. خطتنا هي:
- إغلاق وسم الـ
<option>الحالي. - إغلاق وسم الـ
<select>الرئيسي. - حقن كود الـ XSS الخاص بنا (وسم سكريبت أو صورة).
الـ Payload السحري:
</option></select><script>alert(1)</script>
📝 خطوات التنفيذ العملية
- افتح اللاب وانظر إلى الرابط (URL).
- ستجد في نهاية الرابط شيئاً مثل
?storeId=London. - قم بتغيير كلمة
Londonوضع مكانها الـ Payload الخاص بنا: - اضغط Enter لتحديث الصفحة.
?storeId=</option></select><script>alert(1)</script>
ماذا حدث خلف الكواليس؟
عندما قام السكريبت بتنفيذ document.write، أصبح شكل الـ HTML النهائي هكذا:
<select name="storeId">
<option selected></option></select><script>alert(1)</script></option>
</select>
المتصفح رأى أن الـ Select قد انتهى، ثم وجد سكريبت جديداً، فقام بتنفيذه فوراً! 💥
💡 نصيحة صياد (The Breaking Rule)
قاعدة ذهبية في الـ XSS: "إذا كنت محبوساً داخل وسم، فأول خطوة هي الهروب منه".
- دائماً استخدم Inspect Element لترى أين يقع الـ Payload الخاص بك.
- إذا رأيت كودك يظهر كنص عادي داخل قائمة أو مربع نص، جرب إغلاق الأوسمة الأبوية (Parent Tags) مثل
</textarea>أو</title>أو</select>.
🚀 الخاتمة
هذا اللاب يعلمنا أن الثغرات يمكن أن تختبئ في أماكن غير متوقعة مثل القوائم المنسدلة. المهم دائماً هو فهم كيف يتم بناء الصفحة برمجياً لتعرف كيف تكسر هذا البناء.
.png)