خفايا الـ DOM XSS: استغلال innerHTML والبحث عن الـ Sinks 🕵️♂️💥
في رحلتنا المستمرة داخل Web Security Academy، نلتقي اليوم بوحش جديد من وحوش الـ DOM XSS. إذا كنت تظن أن كل الثغرات تُحل بـ <script>، فمقالة اليوم ستغير نظرتك تماماً!
تطبيقنا اليوم على لاب:
DOM XSS in innerHTML sink using source location.search
اليوم سنتعلم لماذا يفشل وسم <script> أحياناً، وكيف نستخدم بدائل ذكية لتحقيق مرادنا. لننطلق! 🚀
🔍 ما هو الـ innerHTML Sink؟
في لغة JavaScript، خاصية innerHTML تُستخدم لتغيير محتوى عنصر HTML أو قراءته. الخطورة تبدأ عندما يأخذ المطور نصاً من المستخدم (Source) ويضعه داخل عنصر باستخدام innerHTML دون تنظيف.
لماذا هذا اللاب مختلف؟
المتصفحات الحديثة لديها حماية فطرية: إذا قمت بحقن وسم <script> باستخدام innerHTML، فإن المتصفح لن يقوم بتنفيذه كإجراء أمني. لذا، علينا أن نكون أكثر ذكاءً! 😎
🧠 تحليل كود اللاب (Behind the Scenes)
إذا فحصت الكود المصدري للاب، ستجد قطعة JavaScript بريئة المظهر تقوم بالتالي:
function doSearchQuery(query) {
document.getElementById('searchMessage').innerHTML = query;
}
هنا، الموقع يأخذ ما كتبته في رابط البحث (location.search) ويضعه مباشرة داخل العنصر الذي يحمل معرف searchMessage. المطور يظن أنه آمن لأن <script> لن يعمل هنا.. حسناً، دعنا نثبت له العكس.
🛠️ خطة الهجوم (The Bypass)
بما أن وسم السكريبت "ممنوع من العرض" بواسطة المتصفح عند استخدام innerHTML، سنستخدم وسوماً أخرى تنفذ JavaScript بطريقة غير مباشرة (Event Handlers). أشهرها هو وسم الصور <img>.
الـ Payload السحري:
<img src="x" onerror="alert(1)">
لماذا يعمل هذا الكود؟
1. المتصفح سيحاول تحميل صورة من المسار "x".
2. طبعاً لا يوجد صورة بهذا الاسم، فيحدث خطأ (Error).
3. بمجرد حدوث الخطأ، يتم تفعيل خاصية onerror، وهي خاصية تقبل كود JavaScript.. وهنا يظهر الـ alert! 💥
📝 خطوات الحل
- افتح اللاب واذهب لمربع البحث.
- اكتب الـ Payload:
<img src=x onerror=alert(1)>. - اضغط Enter أو Search.
مبروك! لقد تجاوزت قيود المتصفح وحققت الـ XSS بنجاح. 🥳
💡 نصيحة الصياد (Bug Bounty Tip)
دائماً تذكر: إذا وجدت ثغرة XSS ولكن وسم <script> لا يعمل أو يتم حظره، لا تستسلم! هناك مئات الطرق البديلة:
- استخدام
<svg onload=alert(1)>. - استخدام
<iframe onload=alert(1)>. - استخدام وسوم الفيديو أو الصوت مع خاصية
onerror.
🚀 الخاتمة
فهم الـ DOM Context يعني فهم كيف يتعامل المتصفح مع كل "مصب" (Sink) بشكل مختلف. الـ innerHTML درس رائع يعلمنا أن الحماية البسيطة يمكن تخطيها بقليل من الإبداع.
