استعادة كلمة المرور في الغربان تبني رابط الاستعادة في البريد من ترويسة المضيف في الطلب فإذا ضبطت X-Forwarded-Host إلى موقعك صار رابط admin يشير إليك وعندما يضغطه admin يصلك الرمز
صفحة استعادة فيها زر يطلب رابطا لحساب admin وتعرض الرابط الذي سيرسل إلى بريده الخادم يبني مضيف الرابط من ترويسة يرسلها العميل
لماذا نجح الحل
الخادم بنى الرابط من مضيف يتحكم به العميل فيمكن توجيه الرمز لأي موقع الحل بناء الروابط من مضيف ثابت مضبوط في الخادم لا من ترويسة الطلب
السبب الجذري
مضيف الرابط يأتي من ترويسة يتحكم بها العميل الجذر الثقة في ترويسة المضيف لبناء روابط حساسة
كيف يصلح الكود
ابن الروابط الحساسة من مضيف ثابت مضبوط في الخادم لا من ترويسة الطلب
الكود المصاب
const link = `https://${req.headers['x-forwarded-host'] || req.headers.host}/reset?token=${t}`;
الكود الآمن
const link = `https://${config.canonicalHost}/reset?token=${t}`; // fixed, server-configured host
الأثر في الواقع
تسميم ترويسة المضيف يسرب رموز الاستعادة ويؤدي للاستيلاء على الحسابات وقد أصاب أطر ويب شهيرة
كيف يكتشفها المدافعون
المدافع يبني الروابط من مضيف ثابت ويتحقق من ترويسة المضيف مقابل قائمة مسموحة ويرصد مضيفات غير متوقعة