أداة تشخيص الشبكة عند الغربان تنفذ أمر ping على المضيف الذي تكتبه الخادم يبني الأمر بلصق مدخلك مباشرة في سطر الأوامر وفي النظام ملف flag فيه سر الجذر
أداة تشخيص شبكة في أدوات الغربان تأخذ اسم مضيف وتنفذ عليه ping. الخادم يبني سطر الأوامر بدمج ما تكتبه مباشرة ويعرض لك السطر والمخرجات في نظام الملفات ملف flag فيه سر الجذر
لماذا نجح الحل
هذا حقن أوامر النظام مدخلك دخل سطر الصدفة كأوامر لا كبيانات فالفاصلة المنقوطة بدأت أمرا جديدا تحت صلاحية الخادم الحل: لا تبن أوامر الصدفة بلصق نصوص استخدم واجهة تمرر الوسائط كمصفوفة منفصلة عن الأمر (execFile بدل exec) فلا يوجد سطر صدفة يفسر وإذا لزم الأمر فتحقق بقائمة بيضاء صارمة للمدخل
السبب الجذري
الخادم يمرر مدخل المستخدم إلى صدفة نظام التشغيل داخل سطر أوامر مدموج فأي فاصل أوامر يحقن أمرا جديدا الجذر تمرير بيانات غير موثوقة إلى مفسر الصدفة
كيف يصلح الكود
القاعدة: افصل الأمر عن وسائطه (مصفوفة) ولا تمر بصدفة أصلا فلا يوجد ما يفسر الفواصل
الكود المصاب
app.post('/ping', (req, res) => {
// Input is concatenated into a shell line: ; | $() all become operators.
exec('ping -c 1 ' + req.body.host, (e, out) => res.send(out));
});
الكود الآمن
app.post('/ping', (req, res) => {
// Arguments are an array; there is no shell to interpret separators.
if (!/^[a-z0-9.-]+$/i.test(req.body.host)) return res.status(400).end();
execFile('ping', ['-c', '1', req.body.host], (e, out) => res.send(out));
});
الأثر في الواقع
حقن الأوامر يمنح المهاجم تنفيذ أوامر على الخادم وهو من أخطر الثغرات لأنه يقود غالبا للسيطرة الكاملة على النظام
كيف يكتشفها المدافعون
المدافع يرصد في المدخلات رموز الصدفة ; و | و الفواصل ويراقب تنفيذ عمليات فرعية غير متوقعة من خدمة الويب