ثغرة Stored XSS: عندما يصبح الـ HTML Encoding هو مفتاح الحل! 🔑 واستغلال onclick
مرحباً بمحترفي الـ Bug Bounty! اليوم نحن أمام تحدٍ من العيار الثقيل. المطور استخدم كل أسلحة الحماية الممكنة، وظن أن تشفير الأقواس وعلامات التنصيص والباك سلاش سيجعله في أمان. لكنه غفل عن كيفية معالجة المتصفح للبيانات داخل الأحداث (Events).
لاب اليوم من PortSwigger هو:
Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
اليوم سنتعلم تقنية "التشفير المزدوج" وكيف نجعل المتصفح يفك شفرتنا بنفسه لينفذ الكود. لنبدأ! 🚀
🔍 تحليل السياق (The Event Context)
في هذا اللاب، عندما تضع تعليقاً وتكتب رابط موقعك، يقوم الموقع بوضعه داخل خاصية onclick في وسم الرابط. الكود يبدو هكذا:
<a href="#" onclick="var http = new XMLHttpRequest(); http.open('GET', '/post/comment/confirmation?postId=1', false); http.send(); window.location='/كلامك هنا';">Your Name</a>
التحدي: إذا كتبت ' لغلق المسار، ستصبح \' ولن تعمل. وإذا كتبت < ستصبح <. الفلتر قوي جداً، أليس كذلك؟
🧠 الحل: سحر الـ HTML Entity Encoding
هنا تكمن المفاجأة: المتصفح عندما يقرأ الخصائص داخل الـ HTML (مثل onclick)، فإنه يقوم بـ فك تشفير أي HTML Entities (مثل ') قبل أن يمرر الكود لمحرك الـ JavaScript!
بمعنى آخر: إذا قمنا بكتابة علامة التنصيص مشفرة يدوياً، فإن الفلتر (الذي يبحث عن الرموز الحقيقية) لن يجد شيئاً ليشفره، ولكن المتصفح سيفكها ويحولها لعلامة تنصيص حقيقية عند التنفيذ.
🛠️ خطة الهجوم (The Encoded Payload)
سنقوم بتشفير علامة التنصيص المفردة ' لتصبح ' (أو '). وبهذا نخدع الفلتر.
الـ Payload السحري:
ضعه في خانة الـ Website URL عند كتابة التعليق:
');alert(1);//
ماذا سيحدث في الكود؟
1. الفلتر سيمرر النص كما هو لأن & و a و p ليست رموزاً ممنوعة عنده.
2. في صفحة التعليقات، سيظهر الكود هكذا:
... window.location='');alert(1);//';
3. بمجرد أن يضغط أحد على اسمك، المتصفح يقرأ ' ويحولها لـ '، فيصبح الكود المنفذ:
window.location='';alert(1);//';
💥 بوم! تم تنفيذ الـ alert بنجاح.
📝 خطوات الحل العملية
- افتح أي مقال وانزل لقسم التعليقات.
- في خانة الـ Website، ضع الـ Payload:
');alert(1);//. - اكتب أي اسم وتعليق واضغط Post comment.
- ارجع للمقال واضغط على "اسمك" الذي يظهر بجانب التعليق.
💡 نصيحة صياد (The Encoding Rule)
هذه التقنية هي "الطلقة الأخيرة" عندما تفشل كل المحاولات:
- أين تعمل؟ تعمل فقط داخل الـ Attributes التي تقبل JavaScript مثل
onclick،onmouseover،onerror. - لماذا تعمل؟ لأن المتصفح يقوم بفك تشفير HTMLEntities داخل هذه الخصائص قبل معالجتها برمجياً.
- تذكر: يمكنك تشفير الـ Payload بالكامل كـ HTML Entities لتجاوز أعتى أنواع الـ WAF.
🚀 الخاتمة
لاب اليوم يعلمنا أن ترتيب عمليات المتصفح (Parsing Order) هو ثغرة بحد ذاته. المطور الذي لا يفهم أن المتصفح يفك التشفير تلقائياً داخل الأحداث، يترك موقعه عرضة للاختراق حتى لو استخدم أقوى الفلاتر.
.png)