
ثغرة البرمجة النصية عبر المواقع (XSS) المبنية على DOM في novel V3.5.0 (CWE-79)
منصة قراءة الروايات novel (V3.5.0) المبنية على Spring Boot 3 + Vue 3 تحتوي على ثغرة XSS مستندة إلى DOM في وحدة تعليقات الكتب. يكمن الخلل في عدم كفاية التحقق/الترميز لمحتوى التعليقات المُرسَلة من المستخدم: الواجهة الخلفية: يُخزَّن حقل commentContent (في كيان/DTO الخاص بـ BookComment) في قاعدة البيانات ويُعاد عبر API دون تصفية أكواد HTML/JS الخبيثة؛ الواجهة الأمامية: تسترجع المنصة التعليقات غير المرمّزة، وتخزّنها في window.localStorage (المفتاح: book_comment_{bookId})، وتعرض البيانات مباشرةً في DOM عبر v-html الخاص بـ Vue 3 (بدون تنقية). يمكن للمهاجمين إرسال تعليقات خبيثة (بعد تسجيل الدخول)، وحثّ المستخدمين على الوصول إلى الصفحات المتأثرة، وتشغيل تنفيذ كود لسرقة ملفات تعريف الارتباط الخاصة بالجلسة، أو انتحال الهويات، أو العبث بمحتوى الصفحة.
الإصدار المستهدف: novel V3.5.0 البيئة: Chrome/Firefox، حساب مستخدم شرعي (يتطلب تسجيل الدخول) الروابط المتأثرة: صفحة تفاصيل الرواية (http://117.72.165.13:8888/book/detail.html?id={bookId}) وصفحة قائمة التعليقات (http://117.72.165.13:8888/book/comment-{bookId}.html)
يتم تشغيل الثغرة في وحدة تعليقات الكتب (منطق الأعمال الأساسي):
الواجهة الخلفية: يُخزَّن حقل commentContent في كيان/DTO الخاص بـ BookComment في جدول قاعدة البيانات book_comment ويُعاد عبر API قائمة التعليقات (/api/book/comment/list?bookId={bookId}) دون تصفية أكواد HTML/JS الخبيثة.
الواجهة الأمامية: تسترجع الصفحة محتوى التعليقات غير المرمّز من API، وتخزّنه في window.localStorage (المفتاح: book_comment_{bookId}، على سبيل المثال book_comment_37 لمعرّف الكتاب 37)، وتعرض البيانات مباشرةً في DOM عبر توجيه v-html الخاص بـ Vue 3 (يُدرَج في وسم <li class="dec">) دون تنقية.
http://117.72.165.13:8888/book/1935650139770011648/1984484631582167040.html?switch=on&wvstest=<svg onload="alert('DOM-XSS-Test')">
(ستقوم الصفحة بتخزين قيمة معامل wvstest في window.localStorage)
localStorage.setItem('book_comment_37', '');
قم بالوصول إلى http://117.72.165.13:8888/user/login.html، وسجّل الدخول بحساب شرعي، ثم انتقل إلى صفحة تفاصيل الرواية.
حدد مربع نص التعليق (id="txtComment") في الصفحة، وأدخل الحمولة الخبيثة (). انقر فوق الزر "Submit" لتشغيل طريقة BookDetail.SaveComment(37, 0, payload) (37 هو bookId).
حدّث صفحة تفاصيل الرواية؛ تستدعي الواجهة الأمامية /api/book/comment/list?bookId=37 لاسترجاع التعليق الخبيث، وتخزّنه في window.localStorage (المفتاح: book_comment_37).
لاحظ ظهور نافذة منبثقة في الصفحة تعرض ملف تعريف الارتباط الخاص بجلسة المستخدم (تأكيد تنفيذ الكود الخبيث).
اضغط F12 لفتح أدوات المطوّر، وانتقل إلى لوحة «Elements»، وابحث عن في بنية DOM (تأكيد إدراج الحمولة في وسم <liclass="dec">).
