في هذا المقال سوف نتحدث عن نوع من انواع الثغرات يسمى بـ CSV Injection وسوف نتطرق الى كيفيه تفادي هذا النوع من الثغرات . هذا النوع يعتبر من انواع ثغرات تطبيقات الويب, و الذي اكتشفته شركة Context في عام 2014. عادةً، يتم استغلال هذه الثغرة عن طريق حقن اكواد في forms، و التي تصدر بعد ذلك في هيئة ملف CSV.

بعد التصدير يتم تشغيل الملف المصاب في برامج مخصصة لذلك، أشهرها هو Microsoft Excel، و في ذلك الوقت يتم تشغيل الحقن و تفعيل الكود.
سيناريو الهجوم الخاص بهذا النوع من الثغرات يكون بهدف استغلال الثغرة ضد من يقم بتحميل الملف و تشغيله. هذا النوع من الثغرات يتم تجاله من كثير من المواقع و الشركات لاعتماد الهجوم الكامل علي موافقة الضحية علي تشغيل الcommand المحقون. و لكن يجب معرفة ان هذه الثغرة و ان لم تكن خطيرة في البداية، فهي قد تؤدي الي Command Execution  علي الكمبيوتر المصاب.

مثال :


هناك العديد من الpayloads لشرح و برهنة وجود هذا النوع من الثغرات، و لكن اشهرها هو الآتي:

cmd|’ /C calc’!A0=

الـ payload المذكور أعلاه يقوم بإعلام البرنامج المُستخدم لتشغيل الملف المصاب بأنه يريد استخدام برنامج cmd.exe (علي أنظمة الويندوز)  وذلك باستخدام الامر  C calc/  ، و الذي سيقوم بدوره بتشغيل اﻵلة الحاسبة  (calc.exe) في أنظمة الويندوز. يمكن أيضا استغلال الثغرة عن طريق إضافة @، +، أو – في بداية الpayload بدلاً من =، المثال التالي يوضح طريقة الاستغلال:

SUM(1+1)*cmd|’ /C calc’!A0@

في المثال السابق يعمل الpayload عن طريق استخدام دالة SUM، و التي تقوم بجمع القيم المعطاة لها، ثم تقوم بضرب الناتج في باقي الpayload، و الذي هو أول payload شرحناه في هذا المقال.

طبعا لن يكون هناك ناتج حسابي حقيقي في هذه الحالة، و لكن سوف يتم تشغيل الcommand المحقون .

 

حلول و طرق علاج الثغرة:


بدايةً يجب التأكد من أن كل مدخل يجب ان يكون في هيئة alpha-numeric، بمعني ان يكون المدخل إما حرف من حروف اللغة الإنجليزية أو رقم من 0 إلي 9، و ذلك عبر فلترة كل مدخل و التأكد من كل حرف.
كما هو الحال في طرق الحماية ضد معظم الثغرات، و علي الرغم من أننا فلترنا كل المدخلات، يجب عدم الثقة في أي مدخل من المستخدم و يجب encoding أي character قد لا يكون في هيئة alpha-numeric.

المشكلة في هذا النوع من الثغرات ليس في وجود @، +، -، أو = في بداية الـ payload، بل في وجود الـ | ، و الذي تعتبره معظم البرامج المستخدمة لتشغيل ملفات الCSV إشارة لتنفيذ أمر خارجي مثل cmd.exe أو powershell.exe. الحل الأمثل لهذه المشكلة يكمن في إضافة \ قبل ال |. فمثلا إذا كان الpayload الأصلي كالآتي:

cmd|’ /C calc’!A0=

يكون الpayload الناتج:

cmd\|’ /C calc’!A0=

و الذي سيمنع الpayload من التشغيل، و من ثم حماية المستخدم من هذا النوع من الثغرات.
يمكن توضيح هذه العملية من خلال كتابة كود python بسيط. يمكن رؤية الكود في الصورة التالية:

csv injection

 

في الكود الموضح أعلاه يتم تعريف function تقوم بالتحقق من أول حرف من المدخل. إذا كان الحرف واحد من @، +، -، =، أو | يتم استخدام replace لتغيير أي | في الpayload ل |\. بعد ذلك يتم وضع الناتج بين علامتي ‘، و ذلك لعرض الpayload كنص بدلا من formula.

إذا تم تشغيل الكود المذكور يصبح لدينا الناتج التالي:

selection_004

 

ترجمة لمقال : CSV Injection Revisited – Making Things More Dangerous  لصاحبها Andy G .

تعرف ايضا على هجمات  الـCommand Injection