موقع الغربان يتيح رفع صورة شخصية ويخزن الملف في مجلد يخدمه للزوار ولا يفحص نوعه أبدا لو رفعت ملف شيفرة خادم فسينفذ عند فتحه
صفحة رفع الصورة الشخصية في أعضاء الغربان تأخذ اسم ملف ومحتواه وتخزنه في مجلد يخدمه الخادم للزوار لا يوجد أي تحقق من نوع الملف فتستطيع رفع ملف ينفذ كشيفرة على الخادم web shell
لماذا نجح الحل
رفع ملف بلا فحص يتيح زرع شيفرة تنفذ على الخادم (web shell) تمنح المهاجم تحكما كاملا الحل: افحص النوع بقائمة بيضاء للامتدادات المسموحة وتحقق من محتوى الملف فعلا (magic bytes) وأعد تسمية الملف باسم عشوائي واخزنه خارج جذر الويب أو في مكان لا ينفذ منه شيء وقدمه عبر مسار لا يشغل الكود
السبب الجذري
الخادم يقبل أي ملف ويخزنه في مجلد ينفذ محتواه فملف بامتداد شيفرة يصبح web shell الجذر غياب التحقق من النوع وتخزين المرفوع في مكان قابل للتنفيذ
كيف يصلح الكود
قائمة بيضاء للنوع وفحص المحتوى وإعادة تسمية والتخزين خارج جذر الويب أربع طبقات تكمل بعضها
الكود المصاب
app.post('/upload', (req, res) => {
// Stores whatever was sent, under the user's name, in a served folder.
fs.writeFileSync('/var/www/uploads/' + req.file.name, req.file.data);
res.json({ ok: true });
});
الكود الآمن
const ALLOW = new Set(['image/png', 'image/jpeg']);
app.post('/upload', (req, res) => {
if (!ALLOW.has(detectType(req.file.data))) return res.status(400).end(); // check content
const name = randomId() + '.' + extFor(req.file.data); // rename
fs.writeFileSync('/srv/blobs/' + name, req.file.data); // outside web root
res.json({ ok: true });
});
الأثر في الواقع
رفع ملف خبيث يؤدي لتنفيذ شيفرة عن بعد والسيطرة الكاملة على الخادم وهو من أخطر ما يصيب ميزات الرفع
كيف يكتشفها المدافعون
المدافع يرصد رفع ملفات بامتدادات تنفيذية ويخزن المرفوعات خارج جذر الويب بأسماء مولدة ويمنع تنفيذها