
ماسح ضوئي لثغرات DOM XSS لتطبيقات الصفحة الواحدة
DOMDig هو ماسح ضوئي لثغرات DOM XSS يعمل داخل متصفح Chromium ويمكنه مسح تطبيقات الصفحة الواحدة (SPA) بشكل تكراري.
على عكس الماسحات الأخرى، يمكن لـ DOMDig الزحف في أي تطبيق ويب (بما في ذلك Gmail) من خلال تتبع تعديلات DOM وطلبات XHR/fetch/websocket، ويمكنه محاكاة تفاعل مستخدم حقيقي عن طريق إطلاق الأحداث. خلال هذه العملية، يتم إدخال حمولات XSS في حقول الإدخال ويتم تتبع تنفيذها للعثور على نقاط الحقن والتعديلات المرتبطة بعنوان URL.
يعتمد على htcrawl، وهي مكتبة Node.js قوية بما يكفي للزحف بسهولة في حساب Gmail.
git clone https://github.com/fcavallarin/domdig.git
cd domdig && npm i && cd ..
node domdig/domdig.js
node domdig.js -c 'foo=bar' -p http:127.0.0.1:8080 https://fcvl.net/htcap/scanme/domxss.php
يمكن لـ DOMDig إجراء ثلاثة فحوصات مختلفة:
يمكن تكوين فحص DOM XSS بأوضاع مختلفة، مما يتيح سلوكيات مختلفة. افتراضياً، جميعها مفعلة.
الأوضاع هي:
يقوم بالزحف في الـ DOM بحثاً عن الأماكن التي يمكن للمستخدم من خلالها حقن كود JavaScript، مثل مربع النص. يمكنه اكتشاف نقاط الحقن التي لا يمكن للماسح تخمينها. مثال على ذلك وظيفة بحث تأخذ نص مربع الإدخال، ولتشغيل البحث تضعه في تجزئة عنوان URL (hash) كسلسلة JSON.
يقوم بتوليد إدخالات عشوائية (fuzzing) لعنوان URL (معلمات الاستعلام والتجزئة) لمعرفة ما إذا كان الكود الخاص بنا يُنفَّذ عند تحميل الصفحة. إذا لم يُنفَّذ أي كود، فإنه يزحف في الـ DOM مطلقاً أحداث HTML على أمل العثور على شيء ينفذ الحمولة.
يمكنه أيضاً اكتشاف ثغرات Reflected XSS التقليدية.
بعد إجراء فحص DOM XSS، يقوم DOMDig بالزحف في نفس الصفحة منتظراً تنفيذ حمولات مستخدمة سابقاً. إذا تم العثور على واحدة، فهذا يعني أنها يمكنها البقاء بعد تحديث الصفحة.
يبحث عن الأماكن التي قد يتم فيها تقييم عناصر نائبة للقالب (مثل {var1}) ككود JavaScript.
كل ثغرة مبلغ عنها تحتوي على الحقول التالية:
domxss, stored أو templateinjيستخدم DOMDig htcrawl كمحرك زحف.
يوضح الرسم البياني عملية الزحف التكراري.
.
الفيديو أدناه يوضح المحرك وهو يزحف في Gmail. استمر الزحف لعدة ساعات وتم التقاط حوالي 3000 طلب XHR.
تسلسل تسجيل الدخول (أو التسلسل الأولي) هو كائن JSON يحتوي على قائمة من الإجراءات التي يجب اتخاذها قبل بدء الفحص.
كل عنصر في القائمة هو مصفوفة حيث العنصر الأول هو اسم الإجراء المراد اتخاذه والعناصر المتبقية هي "معاملات" لهذا الإجراء.
الإجراءات هي:
[
["navigate", "https://target.local/login-page"],
["write", "#username", "demo"],
["write", "#password", "demo"],
["sleep", 2],
["clickToNavigate", "#btn-login"]
]
يمكن تحميل الحمولات من ملف JSON (الخيار -P) كمصفوفة من السلاسل النصية. لبناء حمولات مخصصة، يجب استخدام السلسلة window.___xssSink({0}) كالدالة المراد تنفيذها (بدلاً من alert(1) الكلاسيكية).
[
';window.___xssSink({0});',
'<img src="https://raw.githubusercontent.com/fcavallarin/domdig/HEAD/a" onerror="window.___xssSink({0})">'
]