ثغرة XSS داخل كود الـ JavaScript: كيف تهرب من سجن الـ Escaping؟ ⛓️ استغلال وسم الـ Script
مرحباً بكم يا صائدي الثغرات! اليوم سندخل منطقة حساسة جداً. المطور اليوم قام بعمل "تحصين" قوي؛ حيث قام بتشفير علامة التنصيص المفردة ' لتصبح \'، وقام بتشفير الباك سلاش \ لتصبح \\. هل يعني هذا أننا في طريق مسدود؟
لاب اليوم من PortSwigger هو:
Reflected XSS into a JavaScript string with single quote and backslash escaped
اليوم سنتعلم كيف "نكسر" السياق بالكامل بدلاً من محاولة الهروب من السلسلة النصية. لنبدأ الإثارة! 🚀
🔍 تحليل السياق (The Script Context)
عندما تبحث عن كلمة في هذا اللاب، فإن مدخلاتك لا تظهر في نص عادي، بل تظهر داخل وسم <script> لكي يتم عرضها لاحقاً. الكود في الصفحة يبدو هكذا:
<script>
var searchTerms = 'كلامك يوضع هنا';
document.write('<img src="/resources/images/tracker.gif?searchTerms='+searchTerms+'">');
</script>
المشكلة: إذا حاولت كتابة ' لغلق المتغير، سيقوم الموقع بتحويلها إلى \'، مما يجعلها مجرد نص داخل السلسلة ولا تكسر الكود. وإذا حاولت استخدام \، سيتم تشفيرها أيضاً.
🧠 الحل: الهروب من الوسم بالكامل (Tag Breaking)
بما أننا لا نستطيع الهروب من "السلسلة النصية" بسبب التشفير القوي، سنلجأ لحيلة أذكى: إغلاق وسم السكريبت نفسه!
المتصفح عندما يرى الوسم </script>، فإنه يتوقف عن قراءة كود الـ JavaScript فوراً، حتى لو كان هذا الوسم موجوداً داخل سلسلة نصية مشفرة. المتصفح يبحث عن نهاية الوسم قبل أن يفهم منطق الكود.
🛠️ خطة الهجوم (The Payload)
سنقوم بكتابة نص يغلق وسم السكريبت الحالي، ثم نفتح وسماً جديداً تماماً يحتوي على كودنا.
الـ Payload السحري:
</script><script>alert(1)</script>
ماذا سيحدث في كود الصفحة؟
سيصبح الكود مشوهاً هكذا، لكنه سيعمل:
<script>
var searchTerms = '</script><script>alert(1)</script>';
...
</script>
المتصفح سيقرأ حتى </script> الأولى ويتوقف، ثم يرى <script>alert(1)</script> ويعتبره كوداً جديداً تماماً ويقوم بتنفيذه!
📝 خطوات الحل العملية
- اذهب لمربع البحث في اللاب.
- ضع الـ Payload:
</script><script>alert(1)</script>. - اضغط Search.
💥 مبروك! ستظهر نافذة الـ alert فوراً. لقد نجحت في تخطي تشفير الـ JavaScript بالكامل عبر التلاعب بهيكل الـ HTML.
💡 نصيحة صياد (The Breaking Context Rule)
دائماً تذكر: إذا كنت محبوساً داخل وسم <script> ولم تستطع الهروب من علامات التنصيص:
- جرب إغلاق الوسم: استخدام
</script>هو أسرع وأسهل طريقة لتجاوز فلاتر الـ JavaScript المعقدة. - تغيير الوسم: يمكنك بعد إغلاق السكريبت استخدام
<img src=x onerror=alert(1)>بدلاً من فتح سكريبت جديد. - ملاحظة: هذه التقنية تعمل لأن المتصفح يقوم بـ "تحليل" (Parsing) الـ HTML قبل تنفيذ الـ JavaScript.
🚀 الخاتمة
لاب اليوم يعلمنا درساً ذهبياً: "السياق الأكبر يغلب السياق الأصغر". حماية السلسلة النصية داخل JavaScript لم تنفع المطور لأننا تلاعبنا بالـ HTML الذي يحتوي على الكود نفسه.
.png)