في نظام الويب الحديث، يلعب نموذج كائن المستند (DOM) دورًا محوريًا في تمكين تجارب المستخدم التفاعلية والديناميكية. فكِّر في نموذج كائن المستند كخريطة أو مخطط ينشئه متصفح الويب عند تحميل صفحة ويب. يتم تمثيل كل عنصر تراه - العناوين والفقرات والأزرار والصور - كعقدة داخل هذه البنية الهرمية. يمكن للمطوّرين استخدام JavaScript للتنقل في هذه الخريطة أو تغيير العناصر أو إضافة عناصر جديدة أو الاستجابة لإجراءات المستخدم مثل النقرات وإرسال النماذج. على سبيل المثال، قد يؤدي النقر على زر "إظهار المزيد" إلى تشغيل برنامج نصي يعدّل نموذج كائن المستند DOM لعرض نص مخفي. ونظرًا لأن نموذج كائن المستند DOM تفاعلي ويتم تحديثه باستمرار، فإنه يعمل كواجهة بين شيفرة HTML الثابتة والسلوك الديناميكي الذي يختبره المستخدمون، مما يؤدي إلى الميزات التفاعلية التي نعتبرها من المسلمات.
ومع ذلك، يمكن لهذا التفاعل نفسه أن يفتح الباب أمام الثغرات الأمنية التي ترتبط بشكل فريد بالشيفرة البرمجية من جانب العميل. بالنسبة لمحترفي الأمن - سواء كانوا مختبري الاختراق أو مهندسين مكلفين بالدفاع عن أصول الشركة - فإن فهم نقاط ضعف DOM أمر ضروري ليس فقط للاستغلال ولكن أيضًا للوقاية.

DOM في سياق أمني
في الترميز الآمن، من المهم مراقبة كيفية تدفق البيانات داخل DOM. مصدر يتحكم فيه المهاجم - مثل معلمة عنوان URL (الموقع.بحث
)، ملف تعريف الارتباط (ملف تعريف الارتباط
)، أو معلومات المُحيل (المحيل المستند.referrer
) - يمكن أن تصبح خطيرة عند حقنها في حوض غير آمن، مثل داخليHTML
أو eval()
. السلسلة من المصدر إلى الحوض هي ما يمكّن الثغرات القائمة على DOM.
ثغرات DOM الشائعة
نوع الضعف | مثال الحوض | الوصف | التأثير المحتمل |
---|---|---|---|
XSS المستندة إلى DOM | المستند.write()element.innerHTML | يسمح حقن البيانات التي يتحكم فيها المهاجم في HTML بدون تعقيم بتنفيذ JavaScript عشوائي. | سرقة ملفات تعريف الارتباط، واختطاف الجلسات، وحقن المحتوى الخبيث. |
إعادة التوجيه المفتوح | موقع النافذة | تتيح المعالجة غير الصحيحة لعناوين URL للمهاجمين إعادة توجيه المستخدمين إلى مواقع خبيثة. | هجمات التصيّد الاحتيالي، وتوزيع البرمجيات الخبيثة، والإضرار بثقة العلامة التجارية. |
التلاعب بملفات تعريف الارتباط | ملف تعريف الارتباط | يمكن للمهاجمين الكتابة فوق ملفات تعريف الارتباط الخاصة بجلسة العمل أو سرقتها من خلال كود JavaScript غير آمن. | الاستيلاء على الحساب، واختطاف الجلسات، وانتحال الشخصية. |
حقن جافا سكريبت | eval() | ينفذ السلسلة التي يقدمها المهاجم على هيئة كود JavaScript. | الاختراق الكامل من جانب العميل، واختراق البيانات. |
التلاعب في مجال المستند-المجال | مجال المستند | تغيير النطاق لتجاوز قيود الأصل نفسه. | تسريبات البيانات عبر النطاقات وتصاعد الامتيازات. |
تسمم عنوان URL WebSocket | ويب سوكيت() | توفير نقاط نهاية خبيثة لاتصالات WebSocket. | اعتراض تدفقات البيانات والإجراءات غير المصرح بها. |
التلاعب في الروابط | العنصر.src | يقوم المهاجم بتعديل روابط الموارد لتحميل تعليمات برمجية خبيثة أو سرقة البيانات. | حقن البرمجيات الخبيثة، والتتبع، وصفحات الهبوط التصيدية. |
معالجة رسائل الويب | postMessage() | إرسال رسائل مصممة لمعالجة الإطار/النافذة المستهدفة. | تسريب البيانات، والهجمات العابرة للأصول. |
معالجة رأس طلب أجاكس الطلبات | تعيينRequestHeader() | يتحكم المهاجم في رؤوس طلبات HTTP في التعليمات البرمجية من جانب العميل. | إساءة استخدام واجهة برمجة التطبيقات (API)، والاستغلال الشبيه بـ CSRF. |
معالجة مسار الملف المحلي | FileReader.readAsText() | قراءة الملفات المحلية من خلال JS من جانب العميل دون قيود مناسبة. | تسرّب البيانات المحلية الحساسة. |
من جانب العميل حقن SQL | ExecuteSql() | تمرير بيانات غير مفهرسة إلى استعلامات قاعدة البيانات من جانب العميل. | سرقة البيانات، والتلاعب في قاعدة البيانات |
معالجة تخزين HTML5 التخزين HTML5 | SessionStorage.setItem() / localStorage.setItem() | تخزين الحمولات الخبيثة في مخزن المتصفح لتنفيذها لاحقًا. | XSS مستمر، وصول غير مصرح به لبيانات العميل. |
حقن XPath من جانب العميل | تقييم المستند() | يمكن أن يؤدي الحقن في استعلامات XPath إلى منح المهاجمين إمكانية الوصول إلى بيانات XML. | تسريب البيانات، والتلاعب بالبيانات منطق التطبيق المستند إلى XML. |
حقن JSON من جانب العميل | تحليل JSON.parse() | يسمح تحليل JSON المتلاعب به من مصادر غير موثوقة بحقن كائنات عشوائية. | الكتابة فوق البيانات، والتلاعب المنطقي. |
معالجة بيانات DOM-بيانات DOM | العنصر.setAttribute() | يمكن أن يؤدي تعيين السمات ببيانات غير موثوق بها إلى سلوكيات ضارة. | XSS، واختراق النقرات، وتجاوز المنطق. |
الحرمان من الخدمة (DoS) | RegExp() | تؤدي أنماط الرجعيات الكبيرة أو الخبيثة إلى تجميد المتصفح. | تعطل التطبيق، وتدهور الأداء. |
كيف يتم العثور على ثغرات DOM
تستخدم فرق الأمن عادةً مزيجاً من الاستراتيجيات.
- المسح النشطباستخدام أدواتٍ مثل Burp Suite أو OWASP ZAP، تسمح للمختبرين بمحاكاة ومراقبة تفاعلات DOM غير الآمنة.
- الاكتشاف السلبي يتضمن البحث في موارد مثل Shodan وZoomEye وPublicWWWWWW، أو حتى اللقطات التاريخية في Wayback Machine، للكشف عن البيانات الحساسة المخفية في طبقة DOM.
- تحليل الريجكس الآلي والذكاء الاصطناعي, يجمع بين مطابقة الأنماط لبيانات الاعتماد المعروفة والتحليل القائم على الذكاء الاصطناعي الذي يعيّن تدفقات المصدر → تدفق البالوعة، مما يقلل بشكل كبير من الوقت بين الاكتشاف والمعالجة.
الدفاع ضد ثغرات DOM
تبدأ الدفاعات القوية بالتحقق المنضبط من صحة المدخلات - من الناحية المثالية من خلال قائمة بيضاء - لضمان وصول البيانات الموثوقة فقط إلى DOM.
يجب أن تكون استراتيجيات الترميز مصممة حسب السياق: ترميز HTML لإخراج الصفحات، وترميز JavaScript لنقاط حقن النصوص البرمجية، وترميز URL لبناء الروابط.
يجب قفل مفاتيح واجهة برمجة التطبيقات، عندما يجب أن تظهر في التعليمات البرمجية للواجهة الأمامية، باستخدام عمليات التحقق من المُحيل والأصل، وقيود IP، وحدود المعدل.
يجب على الفرق إجراء مراجعة DOM قبل النشر مباشرة، وإزالة الأسرار والتعليمات البرمجية غير الآمنة، وإلغاء أي بيانات اعتماد تم كشفها من قبل، حتى في اللقطات المؤرشفة.

رفع مستوى أمان DOM مع Penligent
تقليديًا، كان إجراء تدقيق أمني شامل ل DOM يتطلب تجميع العديد من الأدوات - Nmap للاكتشاف، وBurp Suite لاختبار الحقن، وSQLmap للاستغلال - ثم مراجعة كل نتيجة يدويًا للتأكد من دقتها.
يغيّر Penligent هذا الأمر من خلال السماح للمختبرين بوصف هدفهم بلغة إنجليزية بسيطة. يؤدي طلب مثل "افحص هذا الموقع الإلكتروني بحثًا عن ثغرات DOM" إلى تشغيل سير عمل ذكي: يدمج الذكاء الاصطناعي أكثر من مائتي أداة أمنية، بما في ذلك Nmap وBurp Suite, خريطة SQLmapإلخ، لإجراء فحوصات مستهدفة على سلاسل المصدر → المغسلة المحتملة، والتحقق من صحة كل نتيجة لإزالة النتائج الإيجابية الخاطئة، وترتيبها حسب الخطورة. بالنسبة لكل من الخبراء الأمنيين المتمرسين والقادمين الجدد، فإن هذا يحول عمليات تدقيق DOM من ماراثون يدوي يستغرق عدة أيام إلى عمليات مبسطة ودقيقة للغاية يتم إنجازها في ساعات أو حتى دقائق.