مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

[ Portswigger ] شرح ثغره الـ Path Traversal وحل كل الابات الخاصه بها على منصة portswigger😍✨

3b0-0d3b0-0d is verified member.

{ || مشرف قسم CTF || }
.:: طاقم المشرفين ::.

السمعة:

بسم الله الرحمن الرحيم

شرح مفهوم Path Traversal (اختراق المسارات) :


1737061465224.webp


الـ Path Traversal (أو اختراق المسارات) هو نوع من الثغرات الأمنية اللي بتسمح للمهاجم بقراءة أو حتى تعديل ملفات عشوائية على السيرفر اللي بشغل التطبيق

الثغرة هاي بتكون خطيرة لأنها ممكن تمكننا من الوصول لملفات حساسة زي أكواد التطبيق أو بيانات الاعتماد (Credentials) أو حتى ملفات نظام التشغيل نفسه ببعض الحالات بنكون قادرين نعدل على الملفات اللي ممكن يسمحنا بتغيير سلوك التطبيق أو حتى السيطرة الكاملة على السيرفر

كيف بحصل الهجوم؟

لنفترض إن فيه تطبيق تسوق بحمل صور المنتجات باستخدام رابط زي هاد:

HTML:
<img src="/loadImage?filename=218.png">


هون التطبيق بقرأ الصورة من المسار var/www/images/218.png/ لكن لو التطبيق ما كان مأمن كويس بنقدر نغير قيمة الـ filename ونطلب ملفات ثانية من السيرفر
مثلاً لو كتبنا :


هون التطبيق بقرأ الملف من المسار :
var/www/images/../../../etc/passwd

الرمز /.. بستخدم للصعود مستوى واحد في هيكل المجلدات فبعد ثلاث مرات التطبيق بوصل لملف etc/passwd/ اللي بكون موجود بنظام التشغيل وبحتوي على معلومات المستخدمين المسجلين على السيرفر نفس الطريقة بتكون شغالة على أنظمة ويندوز لكن باستخدام \.. بدل /..

وسبق وشرحت الموضوع​

تعقب المسار (Path Traversal)


الـ Path Traversal ، هاي عبارة عن ثغرة أمان في مواقع الويب، بتسمح لصاحب الهجوم إنه يقرأ ملفات النظام اللي على السيرفر اللي الويب التطبيق بيشتغل عليه.
الهاكر بيستغل الثغرة هاي عن طريق تعديل واستغلال الرابط (URL) في التطبيق ليعثر ويوصل لملفات أو مجلدات برة المجلد الرئيسي للتطبيق.

المشكلة بتحصل لما يتم تمرير إدخال المستخدم لدالة زي file_get_contents في PHP. وهون الاهمية مش بالدالة نفسها
الاهم بالتصفية أو فلترة الإدخال اللي بيتم تمريره من المستخدم للدالة.

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

الصوره هاي بتبين كيف التطبيق بخزن الملفات بمجلد var/www/app/ . 👇
[]
45d9c1baacda290c1f95858e27f740c9



الطريقة الصحيحة بتكون لو المستخدم طلب محتوى ملف userCV.pdf من المسار المحدد var/www/app/CVs/

تجاوز الدفاعات:

بعض التطبيقات بتكون بتستخدم دفاعات بسيطة ضد الهجمات هاي زي إزالة أو حظر الرموز زي /.. لكن بنقدر نتجاوز الدفاعات هاي باستخدام طرق ثانية زي:
استخدام مسار مطلق (مثل etc/passwd/) بدل المسار النسبي
إضافة بايت فارغ (Null Byte) بعد اسم الملف عشان يوقف التطبيق عن قراءة الجزء الزائد من المسار

سبق وشرحناهم​

كود:
https://sh3ll.cloud/xf2/threads/829

الوقاية من الثغرة:

التحقق من المدخلات (Input Validation): التأكد من أن المدخلات ما بتحتوي على رموز خطرة زي ../ أو ..\
تحديد المسارات المسموحة: التأكد من أن المسار ببدأ من المجلد الأساسي المتوقع (مثل /var/www/images/)
استخدام مكتبات آمنة: استخدام مكتبات متخصصة للتعامل مع الملفات بدل الاعتماد على مدخلات المستخدم مباشرة



File path traversal, simple case

1737052167144.webp


بنلقط طلب أي منتج وبنبعث الطلب على الـ Repeater



الموضوع بسيط بس بنجرب ندخل على مسارات النظام
وبنجرب البايلود

../../../etc/passwd
وبزبط

File path traversal, traversal sequences blocked with absolute path bypass


الدفاعات ضد Path Traversal :

كثير من التطبيقات بتستخدم دفاعات عشان تمنع هجمات الـ Path Traversal زي إزالة أو حظر الرموز زي /.. أو \..

تجاوز الدفاعات :

لو التطبيق بحاول يمنع استخدام رموز زي /.. في عننا طرق ثانية عشان نتجاوز الدفاعات
أهم طريقة نستخدم Absolute Path زي :

filename=/etc/passwd
هون بنستخدم المسار الكامل للملف بدون ما نحط رموز /..





File path traversal, traversal sequences stripped non-recursively


لو التطبيق بحاول يمنع استخدام رموز /.. عشان يوقف هجمات الـ Path Traversal ممكن نستخدم Nested Traversal Sequences زي //.... أو \/.... الفكرة هون إنه لما التطبيق يحاول يزيل أو يحظر الرموز هاي
الـ Nested Traversal Sequences بترجع لشكلها الأصلي /.. بعد ما يتم إزالة الجزء الداخلي منها من التطبيق

مثال:
لو كتب المهاجم //.... التطبيق بكون بزيل // وبترك /..
نفس الشيء مع \/.... التطبيق بيكون يزيل \/ وبترك /..

هاي الطريقة بتكون فعالة بتجاوز الدفاعات البسيطة اللي بتحاول تمنع استخدام /..


حل لاب 5 👇
في السيناريو التالي، بدأ المطور في استخدام التحقق من الإدخال عبر تصفية بعض الكلمات الرئيسية. دعونا نجرب ونتحقق من رسائل الخطأ!

زرنا الرابط التالي: http://webapp.thm/index.php?lang=../../../../etc/passwd

حصلنا على الخطأ التالي:
image
إذا تحققنا من رسالة الخطأ في قسم include(languages/etc/passwd) ، نعلم أن تطبيق الويب يقوم بتبديل /.. بسلسلة فارغة. هناك طرق عدة يمكننا استخدامها لتجاوز ذلك.

أولاً، يمكننا إرسال البيانات التالية للتجاوز: etc/passwd//....//....//....//....//....

شرح 👇

يعمل ذلك لأن مرشح PHP يطابق ويستبدل فقط أول سلسلة فرعية /.. التي يجدها ولا يقوم بمرور آخر، مما يترك ما يظهر أدناه.

توضيح 👇

إذا قمنا بإرسال البيانات etc/passwd//....//....//....//....//....
، سيتم مطابقة الجزء //.... في البداية واستبداله بسلسلة فارغة، ثم يتوقف PHP عن البحث ويقرأ الملف الفعلي etc/passwd/ دون أي تعديل.

الصوره التاليه توضح الذي تم تحويلله الى سلسله فارغه من قبل الفلتره وماذا يقرأ بعد الفلتره 👇

30d3bf0341ba99485c5f683a416a056d

image





File path traversal, traversal sequences stripped with superfluous URL-decode



تجاوز حماية التطبيق:

بعض السيرفرات بتكون بتزيل رموز اختراق المسارات (مثل /..) قبل ما توصل المدخلات للتطبيق اصلا
عشان نتجاوز هاي الحماية ممكن نستخدم URL Encoding للرموز هاي
مثلا /.. بتكون 2f%2e%2e%
أو حتى تشفير مزدوج Double URL Encoding :
%252e%252e%252f


تشفيرات غير قياسية:
ممكن نجرب تشفيرات تانية زي %c0%af أو %ef%bc%8f لأنها أحياناً بتكون شغالة كمان

عن طريق Burp Suite Professional:
لو عننا Burp Suite Professional بنقدر نستخدم قائمة Fuzzing - path traversal من Burp Intruder
القائمة هاي بكون فيها تشفيرات جاهزة لرموز اختراق المسارات وبنقدر نجربها بسهولة






File path traversal, validation of start of path



بعض التطبيقات بتطلب إنه اسم الملف اللي بدخله المستخدم يبدأ بمجلد معين (مثل /var/www/images/) بهاي الحالة ممكن نتجاوز الدفاعات عن طريق إضافة المجلد المطلوب وبعدين بنستخدم رموز اختراق المسارات ( مثل /.. )

مثال:

filename=/var/www/images/../../../etc/passwd

هون التطبيق بقرأ الملف من المسار الـ etc/passwd/ لأن رموز /.. رح تصعد للمجلدات الأعلى وتوصل للملف المطلوب

النقطة المهمة: حتى لو التطبيق بطلب ان اسم الملف يبدأ بمجلد معين بكون فيه طرق عشان نتجاوز الدفاعات هاي




File path traversal, validation of file extension with null byte bypass


بعض التطبيقات بتطلب إنه اسم الملف اللي بدخله المستخدم ينتهي بامتداد معين زي png.
بهاي الحالة بنقدر نستخدم بايت فارغ (Null Byte) عشان نوقف قراءة المسار قبل الامتداد المطلوب

زي هيك
filename=../../../etc/passwd%00.png

هون البايت الفارغ %00 بوقف التطبيق عن قراءة الجزء اللي بعده فـ التطبيق بعتبر إنه اسم الملف هو etc/passwd/../../.. بدون الامتداد png.
هذه الطريقة بتكون فعالة عشان يتجاوز المهاجم الدفاعات اللي بتكون بتتحقق من امتدادات الملفات

خدعة تسمى NULL BYTE ونمثلها بـ %00 .

الـ %00 يخبر النظام أن يتوقف عن إضافة php. في نهاية الملف وأن يقرأ الملف الفعلي الذي نريد.

مثلاً، إذا قمنا بإضافة %00 في نهاية الإدخال الخاص بنا مثل index.php?lang=../../../../etc/passwd%00 ، بفهم النظام أننا نريد قراءة الملف الحقيقي etc/passwd/ بدون أي إضافات.

استخدام %00 يساعدنا بالوصول إلى الملفات التي بدنا اياها بدون مشاكل وبدون إضافة php. في نهايتها.

استخدام البايت الفارغ (Null Byte) هو تقنية حيث يتم تمثيل البيانات المستخدمة بترميز URL مثل %00 أو 0x00 في النص لإنهاء السلسلة. يمكنك التفكير فيها كمحاولة لخداع التطبيق على الويب لتجاهل أي شيء يأتي بعد البايت الفارغ.

بواسطة إضافة البايت الفارغ في نهاية البيانات، نقول لوظيفة التضمين أن تتجاهل أي شيء بعد البايت الفارغ، ويمكن أن يبدو هكذا:


[]include(“languages/…/…/…/…/…/etc/passwd%00”).“.php”);

وهذا مكافئ لـ
include(“languages/…/…/…/…/…/etc/passwd”);
[/]ملحوظة: هذه الخدعة %00 لا تعمل مع PHP 5.3.4 وما فوق.




أفضل طريقة لمنع الثغرة



تجنب استخدام مدخلات المستخدم User Input بواجهات برمجة نظام الملفات Filesystem APIs :
لو التطبيق ما بستخدم مدخلات المستخدم مباشرة بالتعامل مع الملفات بكون احتمال وجود الثغرة قليل جداً
بكون أحسن لو نعيد كتابة الوظائف اللي بتتعامل مع الملفات عشان نوصل لنفس النتيجة لكن بطريقة آمنة

ممكن نتجنب استخدام مدخلات المستخدم:

هون لازم نستخدم طبقتين من الدفاع عشان نمنع هاي الهجمات:
نتحقق من المدخلات Input Validation :
نقارن المدخلات مع قائمة قيم مسموحة Whitelist

ممكن نستخدم Whitelist نأكد إن المدخلات بتحتوي فقط على المحتوى مسموح (مثل أحرف وأرقام فقط)


تأكيد المسار Canonicalization :
بعد ما نتحقق من المدخلات بنضيفها للمسار الأساسي Base Directory وبنستخدم واجهة برمجة نظام الملفات عشان نعمل Canonicalization للمسار (يعني نضمن إن المسار صحيح)
نأكد إن المسار النهائي يكون يبدأ بالمسار الأساسي المتوقع

مثال بسيط بلغة Java :


Java:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}

هون الكود بأكد إن المسار النهائي ببدأ من المسار الأساسي BASE_DIRECTORY ولو ما بدا من المسار الاساسي ما بعمل أي عملية على الملف
 

المرفقات

  • 1737061325021.webp
    1737061325021.webp
    29.4 KB · المشاهدات: 51
التعديل الأخير بواسطة المشرف:
ماشاء الله تبارك الله، عمل رائع يا عبود
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى