ثغرة Stored DOM XSS: عندما تخذلك دالة replace() وتفتح أبواب الجحيم! 💾🛠️
مرحباً بصيادي الثغرات! اليوم سنتحدث عن سيناريو كلاسيكي في عالم الـ Bug Bounty: المطور "يحاول" أن يكون آمناً، فيضع فلتر للحماية، لكنه لا يفهم تماماً كيف تعمل الدوال البرمجية التي يستخدمها.
تطبيقنا اليوم من PortSwigger هو:
Stored DOM XSS
اليوم سنتعلم كيف نتلاعب بذكاء بدالة replace() في JavaScript لتخطي الفلتر وحقن كودنا في قاعدة البيانات. لنبدأ! 🚀
🔍 ما هو الـ Stored DOM XSS؟
هذا النوع يجمع بين "الخطر الدائم" للثغرة المخزنة (Stored) وبين "ذكاء المعالجة" في المتصفح (DOM). البيانات يتم حفظها في السيرفر، وعندما يستدعيها الموقع، يقوم سكريبت JavaScript بمعالجتها بشكل غير آمن ووضعها في الصفحة.
🧠 الفخ: كيف أخطأ المطور؟
في هذا اللاب، الموقع يحاول منع الـ XSS في قسم التعليقات عن طريق تشفير الأقواس < >. المطور استخدم دالة replace() الشهيرة في JavaScript لتبديل الأقواس بأكواد HTML مشفرة.
الكود الذي استخدمه المطور يشبه هذا:
function sanitize(str) {
return str.replace('<', '<').replace('>', '>');
}
أين الخطأ؟
في JavaScript، دالة replace() عندما تأخذ "نصاً" (String) كأول معامل لها، فإنها تقوم باستبدال أول ظهور فقط للكلمة أو الرمز! أما باقي الرموز في النص، فتتركها كما هي بدون مساس. وهذا هو مفتاح الحل. 😈
🛠️ خطة الهروب (The First-Match Bypass)
بما أن الفلتر سيقوم بتشفير أول قوس يراه فقط، فالحل بسيط جداً: سنعطيه "قرباناً" في البداية! سنضع أقواساً فارغة لا قيمة لها ليقوم بتشفيرها، ونضع كودنا الحقيقي بعدها مباشرة.
الـ Payload السحري:
<><img src=1 onerror=alert(1)>
ماذا سيحدث داخل المتصفح؟
1. الدالة سترى أول < وتشفره.
2. ثم ترى أول > وتشفره.
3. عندما تصل لوسم <img>، ستعتبره الدالة قد انتهت من عملها وتتركه يمر بسلام إلى الـ DOM! 💥
📝 خطوات الحل العملية
- اذهب إلى أي مقال في المدونة وانزل لقسم التعليقات.
- في خانة التعليق، اكتب الـ Payload:
<><img src=1 onerror=alert(1)>. - أدخل اسماً وإيميلاً عشوائياً واضغط Post Comment.
- بمجرد العودة للمقال، ستظهر نافذة الـ
alertفوراً.
💡 نصيحة صياد (The Global Replace Tip)
كمطور، لتجنب هذه الكارثة، يجب استخدام "Regex" مع علامة الـ Global (g) هكذا: str.replace(/</g, '<'). لكن كصياد ثغرات، هذه فرصتك!
- اختبر دائماً: جرب إرسال الرمز مرتين (مثل
<<). إذا تشفر الأول وبقي الثاني، فأنت أمام ثغرة ذهبية. - السياق المخزن: تذكر أن هذا الكود سيبقى في الصفحة ويصيب كل الزوار، مما يجعل قيمة الثغرة عالية جداً في التقارير.
🚀 الخاتمة
الـ Stored DOM XSS يعلمنا أن "أنصاف الحلول" في الحماية هي أخطر من انعدامها. المطور الذي يثق في دالة بسيطة دون فهم تفاصيلها يفتح ثغرة قد تؤدي لسرقة بيانات آلاف المستخدمين.
.png)