التحويل المفتوح Open Redirect
كيف يرسل رابط يبدو موثوقا الضحية إلى موقع المهاجم ولماذا لا يصمد فحص العنوان كنص
- المسار
- أمن الويب
- الوقت المتوقع
- 20 د
- المستوى
- متوسط
قبل هذا الدرس
التحويل المفتوح (Open Redirect) صفحة ترسل المتصفح إلى عنوان تعطيه أنت بلا تحقق أن الوجهة تخص الموقع وحده لا يسرق بيانات من الخادم لكن خطره في الثقة: الرابط يبدأ من نطاق يعرفه الضحية فيضغط عليه ثم يجد نفسه في مكان آخر صفحة تصيد أو عنوان يلتقط رمزا مرر في التحويل
ما هي الثغرة؟
صفحة الدخول تريد إرجاعك إلى حيث كنت بعد تسجيل الدخول فتأخذ معامل next وتحول إليه
app.post('/login', (req, res) => {
// يحول إلى ما وضعه المستخدم في next
res.redirect(req.body.next);
});رابط مثل https://login.ravens.lab/login?next=https://falcon.owl.lab/phish يبدأ من النطاق الموثوق وينتهي عند المهاجم والضحية يقرأ الجزء الأول فقط
لماذا تحدث؟
الخادم يعامل قيمة من المستخدم كوجهة آمنة ثم يحاول المبرمج إصلاحها بفحص العنوان كنص هل يبدأ بشرطة هل يحتوي نطاقنا بدل تحليله للعنوان بنية لا يكشفها النص: الشرطتان تبدآن عنوانا مطلقا والعنوان https://trusted@attacker/ مضيفه الحقيقي بعد العلامة كل فحص نصي له صيغة تفوته
كيف تتوقف؟
لا تقبل عنوانا كاملا من المستخدم فضل معرفا يقابل مسارا داخليا معروفا أو مسارا نسبيا نقيا وعند المقارنة حلل العنوان وقارن المضيف الناتج بقائمة سماح بمطابقة تامة لا باحتواء نصي للعنوان الخام
const ALLOWED = new Set(['login.ravens.lab', 'www.ravens.lab']);
app.post('/login', (req, res) => {
const url = new URL(req.body.next, 'https://login.ravens.lab');
res.redirect(ALLOWED.has(url.host) ? url.href : '/dashboard');
});اللابات الثلاثة تمشي هذا السلم بلا فحص ثم فحص الشرطة الذي تكسره الشرطتان ثم قائمة السماح النصية التي تكسرها حيلة العلامة
اللابات
تحويل إلى أي مكان
محلولسهللاب في المتصفح
اجعل التحويل ينتهي إلى موقع خارجي تتحكم به falcon.owl.lab
ادخل اللابمقفلعنوان نسبي فقط
محلولمتوسطلاب في المتصفح
اجعل التحويل ينتهي إلى موقع خارجي falcon.owl.lab رغم فحص الشرطة المائلة
ادخل اللابمقفلقائمة سماح بالنص
محلولصعبلاب في المتصفح
اجعل التحويل ينتهي إلى falcon.owl.lab رغم أن العنوان يحتوي النطاق الموثوق
ادخل اللابمقفل
