






السمعة:
- إنضم17 يونيو 2023
- المشاركات 515
- الحلول 10
- مستوى التفاعل 1,106
- النقاط 93
- الـ Local File Inclusion (LFI)
- الـ Remote File Inclusion (RFI)، وبتشمل كمان اشي اسمه directory traversal
راح يكون الحكي عن سبعه مواضيع :
1. مقدمة عن الـ File Inclusion
2. تعقب المسار (Path Traversal)
3. اختراق الملف المحلي - LFI (Local File Inclusion)
4. اختراق الملف المحلي #2 - LFI (Local File Inclusion)
5. اختراق الملف عن بعد - RFI (Remote File Inclusion)
6. إصلاح الثغرات - ( Remediation )
7. تحدي - Challenges
الاسئله من TryHackMe | File Inclusion
هذه الروم تتطلب اشتراك
هذه الروم تتطلب اشتراك

مقدمة عن الـ File Inclusion
الفكرة تاعت الـ File Inclusion إنها بتسمح للمهاجم إنه يستخدم ملفات من جهاز السيرفر تاع الموقع بطرق غير مخولة.
يعني لو حد طلب صفحة معينة من الموقع، الموقع بيستخدم ملفات من جهاز السيرفر لعرض الصفحة هاي. لكن لو البرمجة مكتوبة بطريقة غلط أو مش محمية بشكل صحيح، المهاجم قد يتمكن من استخدام هذه الثغرة للوصول إلى ملفات على السيرفر وحتى تنفيذ أوامر على السيرفر.
الثغرة بتحصل في البرامج والمواقع اللي مبرمجة بشكل سيء، وبتحصل لأنه ممكن يكون فيه مشكلة في تحقق البيانات اللي بيدخلها المستخدم. يعني لو المستخدم دخل بيانات مش صحيحة، الموقع ممكن يسمح بوصوله لملفات مختلفة بطرق غير مخولة.
الخطورة تاعت الثغرة هاي إنها بتسمح للمهاجم بسرقة معلومات هامة من الموقع مثل الكود البرمجي، وبيانات الدخول، وملفات مهمة تتعلق بالموقع أو نظام التشغيل. وإذا كان المهاجم بقدر يكتب ملفات على السيرفر بأي طريقة أخرى، ممكن يستخدم الـ File Inclusion معاها لتنفيذ أوامر عن بعد على السيرفر.
- امثلة
كيفية استخدام الـ ( Parameters ) في البحث على جوجل كمثال. في البحث على جوجل، لما تكتب شيء وتضغط بحث، الرابط الذي يتم استخدامه بيمرر معلومات المستخدم لمحرك البحث. على سبيل المثال، لما تبحث عن شيء على جوجل، الرابط بيكون فيه Parameters تسمى “q” والقيمة بتكون الكلمة اللي بحثت عنها.
زي مثلا TryHackMe=q
مثال 2
المثال عن موقف تخيلي لمستخدم بيحاول يوصل لملف على سيرفر ويب. المستخدم بيبعث طلب HTTP للسيرفر على الإنترنت والطلب هاد بيحمل معه Parameters تسمى file وقيمتها اسم الملف اللي المستخدم بدو يوصله ويعرضه.
مثلا إذا كان المستخدم بده يعرض سيرته الذاتية (CV) داخل تطبيق الويب ف الطلب ممكن يكون كالتالي
[B][COLOR=rgb(97, 189, 109)]http://webapp.thm/get.php?file=userCV.pdf[/COLOR][/B]
حيث أن الـ file هي الـ Parameters و userCV.pdf هو اسم الملف الذي يرغب المستخدم في الوصول إليه.
تعقب المسار (Path Traversal)
الـ Path Traversal ، هاي عبارة عن ثغرة أمان في مواقع الويب، بتسمح لصاحب الهجوم إنه يقرأ ملفات النظام اللي على السيرفر اللي الويب التطبيق بيشتغل عليه.
الهاكر بيستغل الثغرة هاي عن طريق تعديل واستغلال الرابط (URL) في التطبيق ليعثر ويوصل لملفات أو مجلدات برة المجلد الرئيسي للتطبيق.
المشكلة بتحصل لما يتم تمرير إدخال المستخدم لدالة زي file_get_contents في PHP. وهون الاهمية مش بالدالة نفسها
الاهم بالتصفية أو فلترة الإدخال اللي بيتم تمريره من المستخدم للدالة.
بـ PHP بتقدر تستخدم file_get_contents عشان تقرأ محتوى ملف. وبتقدر تلاقي معلومات أكتر عن الدالة هاي

https://www.php.net/manual/en/function.file-get-contents.php
الصوره هاي بتبين كيف التطبيق بخزن الملفات بمجلد /var/www/app .

الطريقة الصحيحة بتكون لو المستخدم طلب محتوى ملف userCV.pdf من المسار المحدد /var/www/app/CVs
URLs
بنقدر نجرب الإدخال عن طريق إضافة بيانات تجريبية للرابط لنشوف كيف التطبيق بيتصرف. هجمات Path Traversal ، اللي بتعرف أيضًا بالـ نقطتين وشرطة مائلة ، بتستغل إمكانية نقل المجلد لخطوة واحدة للأعلى باستخدام نقطتين مثل
../
لو الهاكر لقى نقطة البداية، اللي في حالتنا هاي get.php?file=بيقدر يبعت اشياء زي هاي مثلا
http://webapp.thm/get.php?file=../../../../etc/passwd
لو مافي تصفية للإدخال، هو بيقدر يوصل لملفات ثانية برة مجلدات التطبيق، مثل etc/passwd/ . كل نقطة بتحرك المجلد مرحلة واحدة للأعلى حتى يوصل للمجلد الجذري
/.
وبعدين يغير المجلد لـ etc/ ومنها هو بقدر يقرأ ملف passwd .
c:\boot.ini
، بيقدر يجرب هيك حسب إصدار نظام التشغيل المستهدف:[COLOR=rgb(26, 188, 156)]http://webapp.thm/get.php?file=../../../../boot.ini[/COLOR]
أو
[COLOR=rgb(26, 188, 156)]http://webapp.thm/get.php?file=../../../../windows/win.ini[/COLOR]
أحيانًا، المطورين بيضيفوا مرشحات لتقييد الوصول لملفات أو مجلدات معينة فقط. هناك بعض الملفات النظامية الشائعة يمكن استخدامها في الاختبار، وهاد جزء من قاعدة البيانات:
الموقع | الوصف |
---|---|
etc/issue/ | يحتوي على رسالة أو تعريف النظام التي سيتم طباعتها قبل شاشة تسجيل الدخول. |
etc/profile/ | يتحكم في المتغيرات الافتراضية على مستوى النظام، مثل متغيرات الصدارة (Export variables)، وقناع إنشاء الملفات (umask)، أنواع الأجهزة (Terminal types)، ورسائل البريد للإشارة إلى وجود رسائل بريد جديدة. |
proc/version/ | يحدد إصدار نواة نظام لينكس. |
etc/passwd/ | يحتوي على معلومات عن جميع المستخدمين المسجلين على النظام والذين لديهم حق الوصول إليه. |
etc/shadow/ | يحتوي على معلومات حول كلمات مرور المستخدمين في النظام. |
root/.bash_history/ | يحتوي على سجل لجميع الأوامر التي تم تنفيذها بواسطة المستخدم الجذر. |
var/log/dmessage/ | يحتوي على رسائل النظام العالمية، بما في ذلك الرسائل التي تم تسجيلها أثناء بدء تشغيل النظام. |
var/mail/root/ | يحتوي على كل رسائل البريد الإلكتروني الواردة للمستخدم الجذر. |
root/.ssh/id_rsa/ | يحتوي على مفاتيح SSH الخاصة للمستخدم الجذر أو أي مستخدم صالح معروف على الخادم. |
var/log/apache2/access.log/ | يحتوي على سجل الطلبات التي تم الوصول إليها لخادم الويب Apache. |
C:\boot.ini | يحتوي على خيارات الإقلاع لأجهزة الكمبيوتر التي تعمل بنظام BIOS. |
- ما هي الوظيفة التي تسبب ثغرات أمنية في اجتياز المسار في PHP؟
الجواب file_get_contents
اختراق الملف المحلي - LFI (Local File Inclusion)
لو بتشتغل على تطبيق ويب وبتستخدم لغة PHP، ممكن تواجهك مشكلة أمان اسمها LFI . هاي مشكلة بتحصل لما المبرمج ما بعطي الأمان حقو زي الإفراط في استخدام أوامر معينة في الكود.مثال
لو عندك تطبيق ويب بيقدم للمستخدمين اختيار لغة، واللغات محفوظة في ملفات، يعني في ملف إنجليزي وملف عربي. البرمجة السيئة هون بتكون لو المبرمج ما عملل فلتره او فحص للإدخالات اللي المستخدم بيدخلها، لو دخل etc/passwd/ في مكان اللغة على الرابط، الموقع ممكن يظهر له محتوى ملف etc/passwd/ اللي في الخادم.
المبرمج أيضًا ممكن يكون عمل محاولة لتحسين الأمان وحدد المسار اللي يحتوي على الملفات بناءً على إدخال المستخدم. لكن إذا ما عمل فحص جيد، الهاكر ممكن يستغل هاد الاشي بتغيير المسار في الرابط ليوصل لملفات حساسة زي etc/passwd/
حل لاب 1 
لقراءه الملف etc/passwd/ هكذا الرابط يكون
الجواب lab1.php?file=/etc/passwd
حل لاب 2 

لحل السؤال الثاني ومعرفه الدليل المحدد الذي يحتوي على الـ function نذهب للاب 2 ثم ندخل اي ادخال لتظهر رساله الخطأ
اختراق الملف المحلي #2 - LFI (Local File Inclusion)
بهاي الحالة بنعمل اختبار الـ Black box
Black boxالفكرة هون إنه بنجرب البرنامج أو التطبيق بطريقة عادية زي أي شخص عادي بدون معرفة اشي عن كيفية عمله.
يعني المختبر يتصرف زي مستخدم عادي وبيجرب البرنامج أو التطبيق على حسب وظيفته وكيفية تفاعله. الاختبار هاد ممكن يتضمن تجربة الواجهة، يعني الأزرار مثلا، ويشوف إذا كان النتيجة اللي متوقعة ترجع أم لا. ومهمش لو عندك خبرة في البرمجة أو فهم لبرمجة البرنامج.
الفكرة برضه إنه الاختبار هاد بيزيد كتير في الوقت لجمع المعلومات وفهم مساحة الهجوم على الهدف.
حل لاب 3

حيث لا نملك شيفرة المصدر. في هذه الحالة، الأخطاء مهمة جدا لفهم كيفية تمرير ومعالجة البيانات داخل التطبيق.
بالبدايه هذه هو الرابط التحدي
[B][COLOR=rgb(255, 0, 0)]http://webapp.thm/index.php?lang=EN[/COLOR][/B]
إذا أدخلنا إدخالًا غير صحيح مثل THM، نحصل على خطأ يظهر كالتالي:
هيك بنعرف وظيفة الـ include بتضيف php. في نهاية الإدخال عند تضمين الملفات من دليل اللغات. لذلك يكون الإدخال الصحيح مثل هذا: index.php?lang=EN ، حيث يقع الملف EN داخل دليل اللغات المعطى ويسمى EN.php .
وكمان كشفت رسالة الخطأ معلومات ثانيه مهمه عن مسار دليل التطبيق على الويب الكامل وهو
[B][COLOR=rgb(251, 160, 38)]/var/www/html/THM-4/[/COLOR][/B]
.للاستفادة من هذا، نحتاج إلى استخدام خدعة
/..
كما وصفتها في الاعلى لنجرب ما يلي:[B][COLOR=rgb(97, 189, 109)]http://webapp.thm/index.php?lang=../../../../etc/passwd[/COLOR][/B]
/..
لأننا نعلم أن المسار يحتوي على أربعة مستويات [B][COLOR=rgb(247, 218, 100)]var/www/html/THM-4/[/COLOR][/B]
. ولكن مع ذلك، لا نزال نتلقى الخطأ التالي:[B][COLOR=rgb(255, 0, 0)]etc/passwd/[/COLOR][/B]
، سيجعل النظام ذلك يبدو وكأننا نحاول قراءة ملف etc/passwd.php/ ، الذي لا يوجد به البيانات التي نحتاجها.لكن هناك خدعة تسمى 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 وما فوق.وهذا مكافئ لـ
include(“languages/…/…/…/…/…/etc/passwd”);
الجواب /lab3.php?file=…/…/…/…/etc/passwd%00
حل لاب 4

في الاب هذا يقوم الموقع بفلتره الكلمات الرئيسية لتجنب الكشف عن معلومات حساسة ! يتم فلتره ملف etc/passwd/ . يعني بتسألو هسا كيف طيب شو نعمل تابع
هناك طريقتين ممكنتين لتجاوز الفلتره . باستخدام NullByte %00 أو الخدعة التي تضيف المجلد الحالي بنهاية الكلمة المصفاة
/..
ويمكن استخدامها كالتالي: http://webapp.thm/index.php?lang=/etc/passwd/
أو يمكننا استخدام http://webapp.thm/index.php?lang=/etc/passwd%00
.لتوضيح الفكرة، إذا جربنا هذا في نظام الملفات باستخدام
.. cd
، سنعود خطوة واحدة إلى الخلف. ومع ذلك، إذا استخدمنا cd .، سنظل في الدليل الحالي. بالمثل، إذا جربنا /etc/passwd/..
سننتقل إلى /etc/ وهذا لأننا انتقلنا إلى الجذر. وإذا جربنا /etc/passwd/.، سيكون النتيجة etc/passwd/ لأن النقطة تشير إلى الدليل الحالي.حل لاب 5

في السيناريو التالي، بدأ المطور في استخدام التحقق من الإدخال عبر تصفية بعض الكلمات الرئيسية. دعونا نجرب ونتحقق من رسائل الخطأ!
زرنا الرابط التالي:
http://webapp.thm/index.php?lang=../../../../etc/passwd
حصلنا على الخطأ التالي:
/..
بسلسلة فارغة. هناك طرق عدة يمكننا استخدامها لتجاوز ذلك.أولاً، يمكننا إرسال البيانات التالية للتجاوز:
etc/passwd//....//....//....//....//....
شرح

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

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

حل لاب 6 
الجواب THM-profile
بعدها عن طريق الامر
THM-profile/../../../../etc/os-release
لقراءه
etc/os-release/
كما هو مطلوباختراق الملف عن بعد - RFI (Remote File Inclusion)
الـ Remote File Inclusion هو اختراق يسمح للمهاجم بتضمين ملفات من مصادر خارجية داخل تطبيق ضعيف الأمان. زي الـ Local File Inclusion
الـ RFI يحدث عندما يتم تلقيم إدخال المستخدم بشكل غير صحيح، مما يسمح للمهاجم بحقن عنوان URL خارجي داخل وظيفة التضمين. شرط واحد لحدوث هجوم RFI هو تفعيل خيار allow_url_fopen .
- كشف معلومات حساسة.
- Cross-site Scripting (XSS) - تنفيذ سكربتات خبيثة على الموقع.
- حجب الخدمة (DoS) - تعطيل خدمة الموقع.
إصلاح الثغرات - ( Remediation )
كأنك مطور برامج، يعني مهم جدا إنك تكون عارف كيف تشوف ثغرات في البرامج اللي بتشتغل عليها على الويب، وكمان تعرف كيف تمنعها. عشان تمنع ثغرات في البرامج اللي بتخليك تضيف ملفات مش مفروض تدخلها،
بعض الحلول اللي بتقدر تعملها:
- احرص على تحديث النظام والخدمات اللي بتستخدمها، بما في ذلك إطارات البرمجة للتطبيقات على الويب.
- قفل الأخطاء اللي بتيجي من PHP عشان ما تبينش للهاكرز مسار التطبيق ومعلومات ثانية ممكن تساعدهم.
- استخدم Firewall خاص بالتطبيقات على الويب (Web Application Firewall) عشان تقلل احتمالية هجمات البرامج الضارة على التطبيق.
- اطفي بعض مميزات PHP إذا ما احتجتها في تطبيقك، زي ميزة allow_url_fopen و allow_url_include اللي بتسبب مشاكل في إدراج الملفات.
- فحص التطبيق على الويب بعناية وخليه يقبل بروتوكولات وطرق برمجة PHP اللي بتحتاجها بس.
- متوثقش بمدخلات المستخدم وتأكد إنك عامل فحص سليم للمداخل قبل ما تدرج ملفات.
- ضع قائمة بيضاء (Whitelist) لأسماء الملفات والمواقع المسموح بها، وكمان قائمة سوداء (Blacklist).
تحدي - Challenges
حل التحدي الاول
بعد فتح burp suite نذهب الى خيار proxy ثم نفتح الـ browser وندخل الموقع وندخل الادخال التالي كما يتطلب السؤال
../../../../etc/flag1

change request method
نجد على المتصفح النتيجه

حل التحدي الثاني
عند القياب بنفس الخطوات ب البرب سويت نجد

ثم نضغط على Forward
../../../../etc/flag2
php.
%00
كما شرح سابقاًحل التحدي الثالث
عند تجربه استبدال Guest ب
etc/flag3/../../../..
بعد استبدال ال GET بال POSTيظهر كاللآتي
%00
كما شرح سابقاً ثم نعد الخطوى السابقه
حل التحدي الرابع
احصل على RCE في Lab #Playground /playground.php باستخدام RFI لتنفيذ أمر اسم المضيف. ما هو الناتج؟
نفتح سيرفر
ثم اجعل الرابط هكذا
المرفقات
التعديل الأخير: