صفحة دخول الغربان تحولك بعد تسجيل الدخول إلى العنوان في المعامل next ولا تتحقق أن العنوان يخص الموقع فتقدر تصنع رابطا يبدو من login.ravens.lab لكنه يرسل الضحية لموقعك
صفحة دخول الغربان تحولك بعد تسجيل الدخول إلى العنوان في المعامل next ولا تتحقق أن العنوان يخص الموقع تكتب العنوان في الحقل وتسجل الدخول فيظهر لك أين انتهى التحويل وهل غادرت الموقع
لماذا نجح الحل
هذا تحويل مفتوح الموقع يحول إلى عنوان من المستخدم بلا تحقق فالمهاجم يصنع رابطا على نطاق موثوق يرسل الضحية لموقع تصيد أو يسرب رموزا في عنوان التحويل الحل: لا تقبل عنوانا كاملا من المستخدم اقبل مسارا نسبيا فقط أو معرفا من قائمة وجهات معروفة وتحقق أن العنوان الناتج يخص موقعك بعد تحليله
السبب الجذري
الموقع يحول إلى عنوان من المستخدم بلا تحقق أن الوجهة تخص الموقع الجذر الثقة في وجهة يتحكم بها المستخدم
كيف يصلح الكود
اقبل مسارا نسبيا أو معرفا من قائمة لا عنوانا كاملا من المستخدم
الكود المصاب
app.post('/login', (req, res) => {
// Redirects to whatever the user put in next.
res.redirect(req.body.next);
});
الكود الآمن
const DESTS = { home: '/dashboard', billing: '/billing' };
app.post('/login', (req, res) => {
// Map an id to a known internal path; never redirect to a user URL.
res.redirect(DESTS[req.body.next] ?? '/dashboard');
});
الأثر في الواقع
التحويل المفتوح يصنع روابط تصيد على نطاق موثوق تسرق بيانات الدخول أو تسرب رموزا في عنوان التحويل
كيف يكتشفها المدافعون
المدافع يرصد قيم next التي تحمل عناوين كاملة أو مطلقة ويقصر التحويل على مسارات نسبية أو قائمة وجهات معروفة