تخط إلى المحتوى
English

SSRF (Server-Side Request Forgery)

كيف يتيح جعل الخادم يجلب عنوانا تختاره الوصول إلى الأنظمة الداخلية ولماذا لا تصمد القوائم السوداء للعناوين

المسار
أمن الويب
الوقت المتوقع
25 د
المستوى
متوسط
تقدمك في المسار0%

SSRF هو أن يجلب الخادم عنوانا تتحكم به أنت ميزات كثيرة تفعل هذا: معاينة رابط أو صورة شخصية تستورد من عنوان أو webhook أو مولد PDF يحمل صورا الطلب يخرج من الخادم داخل شبكة الخادم فتصل إلى أشياء لا يصلها متصفحك أبدا: خدمات داخلية ولوحات إدارة وعنوان بيانات السحابة الذي يسلم مفاتيح الخادم

ما هي الثغرة؟

preview.js
app.post('/fetch', async (req, res) => {
  const r = await fetch(req.body.url); // whatever URL the user sent
  res.send(await r.text());
});

ترسل https://example.com فيعرض صفحة عادية وترسل http://127.0.0.1/admin فيجلب الخادم لوحة إدارته الداخلية ويعطيك الرد الخادم نائب مخدوع: يملك وصولا لا تملكه أنت وهو يستخدمه نيابة عنك

ليش تصير؟

الخادم يعامل وجهة يحددها المستخدم كأنها موثوقة لا يسأل أبدا هل يحق لي جلب هذا تحديدا الأهداف الخطيرة هي ما لا يوصل إليه إلا من الداخل: الاسترجاع 127.0.0.1 والنطاقات الخاصة 10.x و 192.168.x و 172.16-31.x وخدمة بيانات السحابة على 169.254.169.254 التي تعيد مفاتيح مؤقتة لدور الخادم

ليش تفشل القوائم السوداء

الغريزة أن تمنع localhost و 127.0.0.1 لكن العنوان الواحد له كتابات كثيرة:

كلها تساوي 127.0.0.1
127.0.0.1   127.1   2130706433   0x7f000001   0177.0.0.1   [::1]   localhost

فلتر نصي يمنع كتابة واحدة يفوته الباقي وحتى فلتر يحلل العنوان ويمنع النطاقات الخاصة قد الاعتماد على سرد كل حالة سيئة ويفشل لحظة نسيان حالة واحدة هنا نطاق بيانات السحابة المحلي للرابط وهو النطاق المحلي للرابط 169.254.0.0/16 حيث تعيش خدمة البيانات وتمشي على الثغرتين في اللاب المتوسط والصعب

كيف تنحمى منها

safe.js
const ALLOW = new Set(['https://images.cdn.example', 'https://docs.example']);
app.post('/fetch', async (req, res) => {
  const url = new URL(req.body.url);
  if (!ALLOW.has(url.origin)) return res.status(400).end();   // allowlist, not blacklist
  const r = await fetch(url, { redirect: 'error' });          // no redirect to internal
  res.send(await r.text());
});

اسمح فقط بالوجهات التي تحتاجها الميزة فعلا ولا تحاول سرد كل عنوان سيئ حلل اسم المضيف وارفض العناوين الخاصة والاسترجاع والمحلية للرابط (افحص بعد التحليل وبعد أي تحويل) واعزل الخدمة الجالبة في جزء شبكة لا يصل للأنظمة الداخلية واطلب IMDSv2 لبيانات السحابة وامنح الخادم أقل صلاحية فحتى لو تسربت المفاتيح يقل الضرر

سؤال مراجعةفلتر SSRF يمنع أي عنوان نصه يحتوي 127.0.0.1 كيف يتجاوز؟

اللابات

  • الخادم يجلب أي عنوان

    سهللاب في المتصفح

    اجعل الخادم يجلب لوحة الإدارة الداخلية على عنوانه المحلي واحصل على رمز المخبأ الرئيسي

  • فلتر يطابق نصا

    متوسطلاب في المتصفح

    صل إلى لوحة الإدارة الداخلية مرة أخرى متجاوزا الفلتر النصي

  • عنوان يحفظه الجميع إلا الفلتر

    صعبلاب في المتصفح

    اسرق مفاتيح وصول الغربان السحابية من خدمة بيانات السحابة عبر الخادم