حقن الأوامر (Command Injection)
كيف يعمل المدخل الملصوق في أمر صدفة كأوامر على الخادم ولماذا لا ينفع حذف الفواصل وكيف يصلحها تمرير الوسائط كمصفوفة
- المسار
- أمن الويب
- الوقت المتوقع
- 25 د
- المستوى
- متوسط
قبل هذا الدرس
حقن الأوامر يحدث لما يبني التطبيق أمر صدفة مما كتبته أنت
الصدفة لغة أيضا: ; و | و $() والعلامتان المائلتان كلها تعني نفذ أمرا
فإذا نزل مدخلك على سطر صدفة توقفت عن كونك بيانات وبدأت تكون أوامر تعمل بصلاحيات الخادم
ما هي الثغرة؟
ميزة تشخيص تنفذ ping على مضيف تعطيه إياه:
exec('ping -c 1 ' + req.body.host);اكتب 8.8.8.8 فينفذ الخادم ping -c 1 8.8.8.8
واكتب 8.8.8.8; cat /flag فينفذ:
ping -c 1 8.8.8.8; cat /flagالفاصلة المنقوطة ; تنهي ping وتبدأ أمرا ثانيا
الصدفة تنفذ cat /flag بسرور وتعطيك الملف
صار الخادم صدفتك أنت
ليش تصير؟
دوال مثل exec تأخذ نصا واحدا وتعطيه لصدفة لتفسره
الصدفة صممت لربط الأوامر وتوسيعها فكل رمز من رموزها سلاح لما يصل مدخلك لذلك السطر كنص
ليش يفشل حذف الفواصل
الإصلاح المغري أن تحذف ; و &&
لكن الصدفة فيها طرق أكثر للربط والاستبدال:
| cmd $(cmd) `cmd` <newline>cmd & cmd ; cmdمنع بعضها يترك الباقي وبتتجاوز هذي الثغرة بالضبط في اللاب المتوسط وإخفاء المخرجات لا ينفع أيضا ففي اللاب الصعب ينفذ الأمر بلا مخرجات ظاهرة فتستخرج النتيجة عبر قناة جانبية ملف تقرأه أو تأخير زمني أو طلب خارجي وتستخرج السر بكتابته في سجل تقدر تقرأه
كيف تنحمى منها
// Pass arguments as an array: there is no shell line, so nothing to inject into.
if (!/^[a-z0-9.-]+$/i.test(req.body.host)) return res.status(400).end();
execFile('ping', ['-c', '1', req.body.host]);لا تمر بصدفة
استخدم واجهة تأخذ البرنامج ووسائطه كمصفوفة منفصلة (execFile أو spawn بلا shell: true) فالوسيط يمرر للبرنامج مباشرة ولا يفسر بحثا عن رموز
والأفضل تجنب استدعاء الصدفة أصلا واستخدام مكتبة
وإذا كانت الصدفة لا مفر منها فتحقق بقائمة بيضاء صارمة وشغل الخدمة بأقل صلاحية حتى يقل الضرر
اللابات
أمر داخل أمر
محلولسهللاب في المتصفح
نفذ أمرا إضافيا يقرأ ملف الـ flag ويظهر محتواه
ادخل اللابمقفليحذف فاصلة وينسى غيرها
محلولمتوسطلاب في المتصفح
اقرأ ملف الـ flag مرة أخرى متجاوزا حذف ; و &&
ادخل اللابمقفلحقن بلا مخرجات
محلولصعبلاب في المتصفح
اقرأ سر الـ flag رغم أن الأداة لا تعرض مخرجات (حقن أعمى)
ادخل اللابمقفل
