ثغرة XSS في رابط JavaScript: كيف تستدعي الدالة بدون "أقواس"؟ 🧩🔓
مرحباً يا صديقي! اليوم سنحل لغزاً برمجياً حقيقياً. تخيل أنك تريد مناداة شخص (دالة)، لكنك ممنوع من استخدام فمك (الأقواس ()). كيف ستجعله ينتبه لك؟ سنستخدم اليوم "الخطأ البرمجي" لنجبر المتصفح على مناداته بدلاً منا!
لاب اليوم من PortSwigger هو:
Reflected XSS in a JavaScript URL with some characters blocked
💡 الفكرة ببساطة (الخطة البديلة)
بما أننا لا نستطيع كتابة alert()، سنعتمد على فكرة عبقرية:
- سنقوم بتعريف "خطأ" (Error).
- سنخبر المتصفح: "يا متصفح، إذا حدث أي خطأ، اذهب فوراً وشغّل دالة الـ
alert". - ثم سنقوم برمي (Throw) هذا الخطأ عمداً!
🧠 شرح الحل (قطعة بقطعة)
هذا هو الرابط الذي سنستخدمه، وسأشرح لك كل جزء منه بلغة بسيطة:
...&'%7D,x=x=%3E%7Bthrow/**/onerror=alert,1337%7D,toString=x,window%2b''%2C%7Bx:'
ماذا يحدث هنا؟
x=x=>{throw/**/onerror=alert,1337}:
هنا قمنا بإنشاء دالة صغيرة (Arrow Function). وظيفتها أنها عندما تعمل، تقوم بجعل الـonerror(المسؤول عن الأخطاء) يساويalert، ثم ترمي الرقم1337كخطأ.toString=x:
هذه هي الخدعة الكبرى! قمنا بتغيير وظيفةtoStringالخاصة بالمتصفح وجعلناها هي الدالةxالتي صنعناها فوق.window+'':
المتصفح عندما يرى أنك تحاول جمع كلمةwindowمع نص فارغ''، فإنه يضطر تلقائياً لاستدعاء دالةtoStringليرى النتيجة.- النتيجة النهائية:
بما أننا جعلناtoStringهي نفسها الدالةx، فبمجرد محاولة الجمع، ستعملx، فيحدث الخطأ، فينطلق الـalert! 💥
📝 خطوات الحل العملية
- افتح أي مقال في اللاب.
- انسخ الرابط التالي مع استبدال
YOUR-LAB-IDبرابط اللاب الخاص بك: - اضغط Enter.
[https://YOUR-LAB-ID.web-security-academy.net/post?postId=5&%27](https://YOUR-LAB-ID.web-security-academy.net/post?postId=5&%27)},x=x=%3E{throw/**/onerror=alert,1337},toString=x,window%2b%27%27,{x:%27
ستجد الـ alert ظهرت أمامك بنجاح رغم أنك لم تستخدم أي أقواس في الكود!
💡 لماذا هذا اللاب مهم؟
هذا اللاب يعلمك أن JavaScript لغة مرنة جداً. إذا أغلق المطور باباً (حظر الأقواس)، يمكنك الدخول من النافذة (استغلال الـ Error Handling والـ Type Conversion).
🚀 الخاتمة
لا تتعجب من تعقيد الكود، فصيد الثغرات أحياناً يتطلب "خداع" المتصفح ليقوم بما نريد. أنت الآن تمتلك مهارة الهروب من القيود الصعبة!
.png)