خادم مستندات الغربان يفتح ملفا من مجلد /var/www/docs حسب الاسم الذي تكتبه ويبني المسار بدمج المجلد مع اسمك مباشرة وفي النظام ملف /etc/passwd يكشف حسابات الخادم
خادم مستندات الغربان يفتح ملفا من مجلد var/www/docs حسب الاسم الذي تكتبه ويعرض المسار الذي قرأه والمحتوى لا يوجد تحقق من أن الاسم يبقى داخل المجلد فمقاطع الصعود تخرجك منه إلى ملفات النظام
لماذا نجح الحل
هذا تسلق المسارات اسمك دخل في بناء مسار الملف فالرمز ../ صعد خارج المجلد المقصود إلى أي ملف يقرأه الخادم الحل: لا تبن مسارا من مدخل المستخدم عامل الاسم كاسم ملف فقط (خذ آخر جزء منه) وحلل المسار النهائي ثم تحقق أنه يبدأ بالمجلد المسموح بعد التحليل وامنع أي اسم فيه / أو ..
السبب الجذري
الخادم يدمج اسم المستخدم مع مجلد الأساس ويقرأ النتيجة بلا تحقق أن المسار النهائي ما زال داخل المجلد فمقاطع الصعود تهرب منه
كيف يصلح الكود
خذ اسم الملف فقط وحلل المسار ثم تأكد أنه داخل المجلد المسموح بعد التحليل لا قبله
الكود المصاب
app.get('/open', (req, res) => {
// User name joined straight onto the base: ../ climbs out.
res.send(fs.readFileSync('/var/www/docs/' + req.query.name, 'utf8'));
});
الكود الآمن
import path from 'node:path';
app.get('/open', (req, res) => {
const base = '/var/www/docs';
const full = path.resolve(base, path.basename(req.query.name)); // only the file name
if (!full.startsWith(base + path.sep)) return res.status(400).end(); // stay inside base
res.send(fs.readFileSync(full, 'utf8'));
});
الأثر في الواقع
اجتياز المسار يقرأ ملفات حساسة ملفات إعداد مفاتيح خاصة بيانات اعتماد وقد يقود لتنفيذ شيفرة عند قراءة ملفات معينة
كيف يكتشفها المدافعون
المدافع يرصد في المدخلات مقاطع الصعود ويحل المسار النهائي ويتأكد أنه يبدأ بمجلد الأساس قبل القراءة