لاب رقم (17) | Reflected XSS into a JavaScript string with single quote and backslash escaped

تعلم كيفية تخطي حماية تشفير علامات التنصيص والباك سلاش في JavaScript. شرح عملي لاستخدام تقنية إغلاق الأوسمة (Tag Breaking) لحل لابات PortSwigger وتحقي

ثغرة XSS داخل كود الـ JavaScript: كيف تهرب من سجن الـ Escaping؟ ⛓️ استغلال وسم الـ Script

Reflected XSS into a JavaScript string with single quote and backslash escaped

مرحباً بكم يا صائدي الثغرات! اليوم سندخل منطقة حساسة جداً. المطور اليوم قام بعمل "تحصين" قوي؛ حيث قام بتشفير علامة التنصيص المفردة ' لتصبح \'، وقام بتشفير الباك سلاش \ لتصبح \\. هل يعني هذا أننا في طريق مسدود؟

لاب اليوم من 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> ويعتبره كوداً جديداً تماماً ويقوم بتنفيذه!


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

  1. اذهب لمربع البحث في اللاب.
  2. ضع الـ Payload: </script><script>alert(1)</script>.
  3. اضغط Search.

💥 مبروك! ستظهر نافذة الـ alert فوراً. لقد نجحت في تخطي تشفير الـ JavaScript بالكامل عبر التلاعب بهيكل الـ HTML.


💡 نصيحة صياد (The Breaking Context Rule)

دائماً تذكر: إذا كنت محبوساً داخل وسم <script> ولم تستطع الهروب من علامات التنصيص:

  • جرب إغلاق الوسم: استخدام </script> هو أسرع وأسهل طريقة لتجاوز فلاتر الـ JavaScript المعقدة.
  • تغيير الوسم: يمكنك بعد إغلاق السكريبت استخدام <img src=x onerror=alert(1)> بدلاً من فتح سكريبت جديد.
  • ملاحظة: هذه التقنية تعمل لأن المتصفح يقوم بـ "تحليل" (Parsing) الـ HTML قبل تنفيذ الـ JavaScript.

🚀 الخاتمة

لاب اليوم يعلمنا درساً ذهبياً: "السياق الأكبر يغلب السياق الأصغر". حماية السلسلة النصية داخل JavaScript لم تنفع المطور لأننا تلاعبنا بالـ HTML الذي يحتوي على الكود نفسه.

إرسال تعليق