منتدى الغربان فيه خانة بحث الخادم يرد بصفحة يكتب فيها كلمة بحثك كما هي داخل نص الصفحة بدون أي معالجة المراقب يفتح نتائج البحث التي ترسلها له
منتدى الغربان تطبيق فيه قائمة مواضيع وصفحة بحث تكتب كلمة في البحث فيرسلها إلى /search ويبني الخادم صفحة نتائج يلصق فيها كلمتك كما هي داخل html الصفحة بدون ترميز زر المراقب يحاكي فتح الضحية لرابط نتائجك في متصفحه
اجعل صفحة النتائج تشغل شيفرة تنادي steal() وهي الشيفرة التي سترسل جلسة الضحية للغربان في هجوم حقيقي
لماذا نجح الحل
هذا XSS منعكس (reflected) ما كتبته رجع فورا داخل صفحة الرد ونفذ السبب إن الخادم بنى html بلصق مدخلك بدون ترميز فتحول النص إلى عنصر script الحل: رمز المخرجات حسب مكانها قبل وضعها في الصفحة علامات مثل < و > و " و & تتحول إلى كياناتها (< >) فيبقى مدخل المستخدم نصا لا شيفرة
السبب الجذري
الخادم يبني html بدمج مدخل المستخدم مباشرة بدون ترميز للسياق فيتحول النص إلى عنصر الخلل في الإخراج لا الإدخال
كيف يصلح الكود
القاعدة: رمز عند الإخراج لا عند الإدخال وبالترميز المناسب لكل سياق (نص html سمة html جافاسكربت عنوان url) أطر القوالب الحديثة تفعل هذا تلقائيا
الكود المصاب
app.get('/search', (req, res) => {
const q = req.query.q;
// The term is pasted straight into HTML: text becomes markup.
res.send('<p class="results">No posts match: ' + q + '</p>');
});
الكود الآمن
app.get('/search', (req, res) => {
const q = req.query.q;
// Encode for the HTML text context, so < > " & can never start a tag.
res.send('<p class="results">No posts match: ' + escapeHtml(q) + '</p>');
});
الأثر في الواقع
XSS المنعكس يأتي عبر رابط مصمم يرسل للضحية وبمجرد فتحه تعمل شيفرة المهاجم في سياق الموقع فتسرق الجلسات وتنفذ أفعالا باسم الضحية وهو من أكثر ثغرات الويب انتشارا
كيف يكتشفها المدافعون
المدافع يرصد في سجلات الطلبات معاملات فيها وسوم وأحرف مثل < > ووجود كلمات مثل onerror ويطبق سياسة CSP صارمة تمنع تنفيذ السكربتات غير المصرح بها كطبقة ثانية