تعتبر هجمات Command Injection من أشهر الهجمات التي تقع تحت بند هجمات Injection بعد هجمات SQLi بالطبع.
معظم هجمات الـInjection بشكل عام تعمل بنفس الطريقة، فأنت تقوم بإلحاق كود إضافي بجانب المدخلات الطبيعية التي يعمل معها التطبيق.

1

فلنفترض أن هناك تطبيق وظيفته أن يقوم بعمل Domain Lookup مثلاً، إذن فهذه هي الوظيفة الطبيعية للتطبيق، ولكن يمكننا بعد إضافة مثلاً اسم الدومين أن نضيف أمر أخر لنرى إن كان سيعمل أم لا. إن كانت النتائج تحتوي على نتائج خاصة بالأمر الإضافي فهذا يعني أن التطبيق معرض لثغرات الـCommand Injection.
أعلم أن ربما البعض لم يفهم جيدًا ما أعنيه، حسنٌ.. سنوضح الأمر أكثر من خلال مثال بعد قليل.
ماذا يمكنني أن أستفيد من إلحاق أمر إضافي كمختبر اختراق!؟
هذا يعتمد على نية مختبر الاختراق، فهناك الكثير من الأمور التي يمكن فعلها في هذا الشأن. من المهم أن نذكر أن كل الصلاحيات التي ستمتلكها في إعطاء الأوامر تعتمد على الصلاحيات التي يملكها التطبيق نفسه. فإن كان التطبيق يعمل مثلاً بمستخدم مدير للنظام فإمكانيتك على إعطاء الأوامر ستكون كمستخدم مدير للنظام. أما إن كان التطبيق يعمل بمستخدم صلاحياته محدوده وهذا هو الأكثر شيوعًا بالطبع فقدرتك على إعطاء الأوامر سترتبط أيضًا بذلك.

على العموم، يجب أن تستفيد من قدرتك على إعطاء الأوامر حتى لو لم تكن تستطيع إعطاء الأوامر كمستخدم مدير للنظام.. فأنتَ يجب أن تسفيد بقدر الإمكان.. فمثلاً إن كنت تملك صلاحيات مدير للنظام فيمكنك استغلال ذلك في إضافة مستخدم جديد بصلاحيات مدير للنظام.. وذلك للإبقاء على مستخدم خاص بك.. أما إن كنت تملك صلاحيات أقل فيمكنك استغلال ذلك في الإطلاع على بعض المعلومات الحساسة فيمكنك مثلاً الإطلاع على الملف الذي يحتوي على كلمات مرور المستخدمين الخاصة بالنظام.
دعنا الآن نوضح كيفية تنفيذ هذه الهجمة من خلال مثال عملي:

2

هذا التطبيق يقوم بعمل Ping بشكل طبيعي، فمثلاً إن قمت بإدخال IP الشبكة الداخلية عندي فسنرى أنه يعمل كما موضع في الصورة القادمة:

3

 

لقد أرسل ثلاثة حزم بشكل طبيعي جدًا، حسنٌ، دعنا نجرب الآن إدخال أمر مرافق.. كل ما سأقوم بفعله هو أنني سأقوم بإضافة أمر مرافق للـمدخل الطبيعي للتطبيق وهو في هذه الحالة هو الـIP الذي تريد أن تقوم بتنفيذ Ping عليه.. سأقوم بفصل الأمر الإضافي عن المدخل الطبيعي من خلال علامة (;)

4

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

حسنٌ، ما الذي يثبت أن هذه ثغرة حقًا، فقد يكون التطبيق يقبل أساسًا أوامر غير الـIP.. دعنا نجرب، سأحاول إدخال pwd فقط بدون الـمدخل الطبيعي للتطبيق وهو الـIP ولنرى ماذا سيحدث!؟

5

للأسف لم تظهر أي نتائج، وكأننا لم نقم بإدخال أي مدخلات. إذن فالطبيعي للتطبيق هو أنه يقبل IP فقط، ولكننا استطعنا إضافة أمر أخر بعد المدخل الطبيعي للتطبيق.

حتى الآن، قمنا باستغلال أمر واحد وهو الأمر pwd، هذا مثال على مستوى الصلاحيات التي تملكها، فمثلاً إن كنت لا تملك صلاحيات مدير للنظام يمكنك جمع معلومات عن التطبيق من خلال أوامر تملك الصلاحيات لتنفيذها مثل ls أو pwd أو حتى cat.. يمكنك استغلال كل الأوامر التي تملك الصلاحيات لتنفيذها من أجل جمع أكبر قد من المعلومات عن التطبيق..

دعنا نجرب الإطلاع على الملف الذي يحتوي على كلمات مرور المستخدمين الخاصة بالنظام:

6

يمكنك أيضًا أن تقوم باستخدام بدلاً من (;) أي من المفاتيح البديلة مثل علامة الـPipe (|) أو علامة (&&(..

يمكنك الاستغناء عن إدخال المدخل الطبيعي وذلك كالتالي:

7

لاحظ أننا بدأنا السطر بـ(;) وذلك جعلنا نستغني عن إدخال الـIP

يمكنك أيضًا تنفيذ نفس الأمر باستبدال (;) بـ)|( أو (&&)

حسنٌ، حتى الآن قمنا بتوضيح الكثير عن الثغرة نفسها وكيفية استغلالها.. دعنا نرى كيف يمكننا إصلاح هذه الثغرة بحيث نقوم بعمل Patching لها.

8

كما نرى الكود لا يقوم بتنفيذ أي عملية فلترة للمدخلات، وهذا هو سبب المشكلة.

الحل هنا هو بإضافة آلية للفلترة ويمكننا فعل ذلك بأبسط الطرق وهي باستخدام دالة “escapeshellcmd”:

9

بالفعل الثغرة لم تعد تعمل ولكن لماذا!؟ ما وظيفة دالة escapeshellcmd!؟

وظيفتها هي أنها تقوم بعمل تصفية أو تنقية للبيانات المدخلة بواسطة المستخدم بحيث أنها تقوم بتنقية أي مدخلات من نوع String أو ما يسمى بعملية escape وذلك قبل تمرير الكود إلى دالة exec أو system.

يمكنك أيضًا استخدام دالة escapeshellarg وستؤدي إلى نفس النتيجة وهي إصلاح الثغرة ولكن وظيفتها مختلفة.

لمعلومات أكثر عن هاتين الدالتين يمكنك الإطلاع على الروابط التالية:

http://php.net/manual/en/function.escapeshellarg.php

http://php.net/manual/en/function.escapeshellcmd.php

أتمنى أن تكونوا قد استفدتم ولو بالقليل وحتى نلتقي مرة أخرى . أستودعكم الله.