أصبح استخدام تطبيقات الويب أمراً شائعاً في كل مجتمع. فنحن نتعامل معها كل يوم. يمكننا القول إنها تحيط بنا. فنحن نستخدمها في العمل والترفيه وكأدوات للتواصل مع الآخرين. في كثير من الأحيان، كمستخدمين وكمطورين، لا ندرك كم عدد الثغرات الأمنية التي يتم اكتشافها كل يوم في هذه التطبيقات.
لقد كانت نقطة الضعف التي نناقشها في هذه الورقة البحثية معنا منذ فترة طويلة وبسبب بساطتها، غالبًا ما يتم التقليل من شأنها أو حتى عدم معرفتها من قبل البعض مطورو تطبيقات الويب.
يحتوي كل تطبيق ويب تقريبًا على روابط تفتح عند النقر عليها في علامة تبويب جديدة حتى لا يتم إغلاق علامة التبويب بالصفحة الأصلية. هذا سلوك مفضل لأن منشئي التطبيق يريدون أن يقضي المستخدم أكبر وقت ممكن في التطبيق.
من الهجمات التي تستغل هذه الثغرة ما يسمى بـ "الاختراق العكسي لصفحة ما". وهو هجوم حيث تكون الصفحة المرتبطة من الصفحة المستهدفة قادرة على استبدال تلك الصفحة بموقع تصيّد احتيالي على سبيل المثال.
سيناريو الهجوم
لنفترض أن الضحية يستخدم فيسبوك المعروف بفتح الروابط عبر target="_blank",
أنشئ صفحة فيروسات مزيفة,
إنشاء موقع تصيّد احتيالي يشبه صفحة تسجيل الدخول إلى فيسبوك,
ضع ما يلي الكود على الصفحة الفيروسية على سبيل المثال، عبر ثغرة XSS التي تم العثور عليها window.opener.location = 'https://phishing-website/facebook.com';
تنقر الضحية على الرابط الموجود على فيسبوك للصفحة المنتشرة,
تقوم الصفحة الفيروسية بإعادة توجيه علامة تبويب فيسبوك إلى موقع التصيّد الاحتيالي وتطلب من المستخدم تسجيل الدخول مرة أخرى.
لذلك، يمكننا تغيير علامة التبويب الرئيسية من الصفحة المستهدفة المصابة عن طريق كائن النافذة من واجهة برمجة تطبيقات الويب. عادةً ما ينطوي الهجوم على استخدام العديد من الثغرات المكتشفة وعمليات التصيد الاحتيالي بالتوازي.
المشكلة
عندما نفتح علامة تبويب جديدة في المتصفح باستخدام رابط مع الهدف="_blank" لدينا إمكانية الوصول إلى "المُحيل" من علامة التبويب الجديدة. وبشكل أكثر تحديدًا، إلى الافتتاحية خاصية النافذة والتي تُرجع مرجعًا إلى النافذة التي فتحتها، وهي صفحتنا الأم.
ويرجع ذلك إلى سلوك Window.open() الدالة. من خلال الوصول إلى هذه السمة، يمكننا بسهولة استبدال صفحتنا الأم. لاحظ أن بعض المتصفحات الحديثة يمكن أن تجعل فتاحة النوافذ في علامة التبويب الهدف ك لا شيء لمنع هذا السلوك.
مثال على الرمز
<code> <a href="https://github.com" target="_blank">الانتقال إلى GitHub - الرابط المصاب</a>تشكل
إذا (الرابط)
رابط [0].onclick = () => {
إذا (نافذة) window.opener.location = 'https://stackoverflow.com'
}
يمكنك أن ترى أعلاه الرابط المصاب الذي يفتح في الأصل علامة تبويب جديدة مع صفحة GitHub ولكن في الوقت نفسه يغير الصفحة "الأم" إلى موقع Stackoverflow.
مثال حي
1. روابط HTML
إضافة rel="noopener noreferrer" إلى <a> الوسم.
إن متعلق تحدد العلاقة بين المورد المرتبط والمستند الحالي.
نوبنر يخبر المتصفح بالانتقال إلى الهدف دون منح حق الوصول إلى الأصل الذي فتحه. علامة تبويب الهدف فتاحة النوافذ سيكون لا شيء.
نوريفرير يمنع المتصفح، عند التنقل إلى الهدف، من إرسال العنوان أو أي قيمة أخرى كمرجع عبر المرجع رأس HTTP. لاحظ أن اسم رأس HTTP هذا خطأ إملائي متعمد باسم "المُحيل".
بالنسبة لـ JavaScript Window.open يمكنك إضافة القيم نوبنر و نوريفرير في النافذةالميزات من معلمة Window.open ولكن قد تستجيب المتصفحات المختلفة بشكل مختلف، لذا يوصى بإجراء فتاحة النوافذ كما لا شيء بعد استخدام Window.open() الوظيفة.