تخط إلى المحتوى
English

حقن الأوامر (Command Injection)

كيف يعمل المدخل الملصوق في أمر صدفة كأوامر على الخادم ولماذا لا ينفع حذف الفواصل وكيف يصلحها تمرير الوسائط كمصفوفة

المسار
أمن الويب
الوقت المتوقع
25 د
المستوى
متوسط
تقدمك في المسار0%

حقن الأوامر يحدث لما يبني التطبيق أمر صدفة مما كتبته أنت الصدفة لغة أيضا: ; و | و $() والعلامتان المائلتان كلها تعني نفذ أمرا فإذا نزل مدخلك على سطر صدفة توقفت عن كونك بيانات وبدأت تكون أوامر تعمل بصلاحيات الخادم

ما هي الثغرة؟

ميزة تشخيص تنفذ ping على مضيف تعطيه إياه:

ping.js
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

منع بعضها يترك الباقي وبتتجاوز هذي الثغرة بالضبط في اللاب المتوسط وإخفاء المخرجات لا ينفع أيضا ففي اللاب الصعب ينفذ الأمر بلا مخرجات ظاهرة فتستخرج النتيجة عبر قناة جانبية ملف تقرأه أو تأخير زمني أو طلب خارجي وتستخرج السر بكتابته في سجل تقدر تقرأه

كيف تنحمى منها

safe.js
// 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) فالوسيط يمرر للبرنامج مباشرة ولا يفسر بحثا عن رموز والأفضل تجنب استدعاء الصدفة أصلا واستخدام مكتبة وإذا كانت الصدفة لا مفر منها فتحقق بقائمة بيضاء صارمة وشغل الخدمة بأقل صلاحية حتى يقل الضرر

سؤال مراجعةأداة ping تحذف ; و && من المضيف قبل تنفيذ exec('ping ' + host) هل هي آمنة؟

اللابات

  • أمر داخل أمر

    سهللاب في المتصفح

    نفذ أمرا إضافيا يقرأ ملف الـ flag ويظهر محتواه

  • يحذف فاصلة وينسى غيرها

    متوسطلاب في المتصفح

    اقرأ ملف الـ flag مرة أخرى متجاوزا حذف ; و &&

  • حقن بلا مخرجات

    صعبلاب في المتصفح

    اقرأ سر الـ flag رغم أن الأداة لا تعرض مخرجات (حقن أعمى)