تعريف Path Traversal
Path Traversal، المعروف أيضًا باسم Directory Traversal، هو تقنية تُستخدم لاستغلال ثغرات في التطبيقات للوصول إلى ملفات حساسة على الخادم. الهدف الأساسي من هذه التقنية هو الخروج من المسار المحدد للوصول إلى مسارات أو ملفات غير مصرح بها.
أسباب حدوث Path Traversal
تحدث ثغرة Path Traversal عندما يستدعي التطبيق ملفات أو صورًا من الخادم دون وجود قيود مناسبة على المدخلات. على سبيل المثال، إذا كان لدينا رابط مثل:
www.example.com/test.php?imagepath=205.png
فهذا يسمح للمهاجم بتعديل المعلمة imagepath للوصول إلى ملفات حساسة مثل /etc/passwd
عن طريق استخدام مسارات النقطتين (..
) للانتقال لأعلى في الهيكلية.
كيف يتم اكتشاف Path Traversal
يمكن اكتشاف Path Traversal من خلال:
- التحقق من مدخلات المستخدم: البحث عن أي مدخلات تقبل بيانات تتعلق بالملفات.
- هل هناك معلمات في الطلب يمكن استخدامها للوصول إلى ملفات؟
- هل هناك امتدادات ملفات غير اعتيادية؟
- الأساليب التلقائية: استخدام أدوات مثل Burp Suite أو أدوات فحص أخرى للتحقق من وجود الثغرات.
كيفية استغلال Path Traversal
يمكن استغلال Path Traversal عن طريق قراءة ملفات حساسة مثل /etc/passwd
أو ملفات التكوين. أمثلة على الملفات التي يمكن الوصول إليها تشمل:
/proc/version
للتحقق من إصدار نظام التشغيل.
/proc/mounts
للحصول على قائمة الملفات الموجودة على النظام.
بعض طرق bypass
هناك عدة طرق يمكن استخدامها لتجاوز القيود المفروضة على Path Traversal:
- استخدام المسار الكامل (absolute path) مثل
etc/passwd
. - استخدام المسارات المزدوجة (
//
) للتغلب على الحماية. - تطبيق الترميز (encoding) على المدخلات مثل URL encoding.
- إذا كانت المدخلات يجب أن تبدأ بمسار معين، يمكنك إضافة المسار المطلوب ثم اتباعه بمدخلات مسار التنقل.
- استخدام بايت null (
%00
) لإنهاء مسار الملف عند الحاجة. - محاولة فتح الملف باستخدام
file://etc/passwd
. - استكشاف هيكلية الملفات من خلال تعديل المعلمات ومعرفة ما إذا كانت تعرض ملفات.
كيفية منع Path Traversal
لمنع Path Traversal، يجب اتباع خطوات معينة:
- التحقق من المدخلات: يجب التحقق من جميع المدخلات قبل معالجتها، وتطبيق قوائم بيضاء (whitelists) للملفات المسموح بها.
- تجنب استخدام المدخلات مباشرة: من الأفضل عدم تمرير المدخلات المدخلة من قبل المستخدم إلى واجهات برمجة تطبيقات الملفات مباشرة. إذا كان ذلك ضروريًا، يجب استخدام APIs للتحقق من صحة المسارات المدخلة.
مثال على كود بلغة PHP
$file = BASE_DIRECTORY . '/' . $userInput;
if (strpos(realpath($file), realpath(BASE_DIRECTORY)) === 0) {
// process file
}