SSRF (Server-Side Request Forgery)
كيف يتيح جعل الخادم يجلب عنوانا تختاره الوصول إلى الأنظمة الداخلية ولماذا لا تصمد القوائم السوداء للعناوين
- المسار
- أمن الويب
- الوقت المتوقع
- 25 د
- المستوى
- متوسط
قبل هذا الدرس
SSRF هو أن يجلب الخادم عنوانا تتحكم به أنت ميزات كثيرة تفعل هذا: معاينة رابط أو صورة شخصية تستورد من عنوان أو webhook أو مولد PDF يحمل صورا الطلب يخرج من الخادم داخل شبكة الخادم فتصل إلى أشياء لا يصلها متصفحك أبدا: خدمات داخلية ولوحات إدارة وعنوان بيانات السحابة الذي يسلم مفاتيح الخادم
ما هي الثغرة؟
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.1 2130706433 0x7f000001 0177.0.0.1 [::1] localhostفلتر نصي يمنع كتابة واحدة يفوته الباقي
وحتى فلتر يحلل العنوان ويمنع النطاقات الخاصة قد الاعتماد على سرد كل حالة سيئة ويفشل لحظة نسيان حالة واحدة هنا نطاق بيانات السحابة المحلي للرابط وهو النطاق المحلي للرابط 169.254.0.0/16 حيث تعيش خدمة البيانات
وتمشي على الثغرتين في اللاب المتوسط والصعب
كيف تنحمى منها
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 لبيانات السحابة وامنح الخادم أقل صلاحية فحتى لو تسربت المفاتيح يقل الضرر
اللابات
الخادم يجلب أي عنوان
محلولسهللاب في المتصفح
اجعل الخادم يجلب لوحة الإدارة الداخلية على عنوانه المحلي واحصل على رمز المخبأ الرئيسي
ادخل اللابمقفلفلتر يطابق نصا
محلولمتوسطلاب في المتصفح
صل إلى لوحة الإدارة الداخلية مرة أخرى متجاوزا الفلتر النصي
ادخل اللابمقفلعنوان يحفظه الجميع إلا الفلتر
محلولصعبلاب في المتصفح
اسرق مفاتيح وصول الغربان السحابية من خدمة بيانات السحابة عبر الخادم
ادخل اللابمقفل
