GLOS · واژه‌نامه سرنام بالا

LFI — گنجاندن فایل محلی

Local File Inclusion

گنجاندن فایل محلی نقصی است که در آن ورودی کاربر مسیر یک فایل روی سرور را تعیین می‌کند و مهاجم می‌تواند فایل‌های حساس را بخواند یا در شرایطی به اجرای کد برسد.

تیم فنی پی‌هانتر

LFI چیست و چگونه رخ می‌دهد؟

گنجاندن فایل محلی (Local File Inclusion) که به‌اختصار LFI خوانده می‌شود، زمانی رخ می‌دهد که برنامه ورودی کاربر را برای انتخاب یا گنجاندن یک فایل محلی به‌کار می‌برد بدون آنکه مسیر را محدود کند. نزدیک‌ترین مفهوم مرتبط، پیمایش مسیر (Path Traversal) است: مهاجم با دنباله‌های ../ از دایرکتوری مورد نظر خارج می‌شود و به فایل‌های دیگر سیستم می‌رسد.

هدف‌های متعارف خواندن: /etc/passwd، /proc/self/environ، فایل‌های پیکربندی مثل .env و web.config، کد منبع، کلیدهای SSH و فایل‌های اعتبارنامه‌ی ابری مثل ~/.aws/credentials. صرفِ خواندن این فایل‌ها می‌تواند به افشای اطلاعات جدی و سپس زنجیره‌ی حملات بعدی منجر شود.

از LFI تا RCE

LFI صرفاً خواندن فایل نیست؛ چند مسیر شناخته‌شده آن را به اجرای کد می‌رسانند:

  • Wrapperهای PHP: php://filter/convert.base64-encode/resource= برای استخراج کد منبع بدون اجرا؛ و php://input، data://، zip:// و phar:// (که خودِ phar ماشه‌ی Deserialization هم هست).
  • مسموم‌سازی لاگ (Log Poisoning): تزریق کد PHP به هدر User-Agent، سپس گنجاندن فایل لاگ دسترسی وب‌سرور که آن هدر را ثبت کرده است.
  • /proc/self/environ: در برخی پیکربندی‌ها می‌توان از راه متغیرهای محیطی به اجرا رسید.
  • فایل‌های نشست PHP (مثل /var/lib/php/sessions/sess_<id>) و گنجاندن فایل آپلودشده نیز مسیرهای متعارف هستند.

نکته‌ی مهم این است که برای رسیدن به RCE، مهاجم معمولاً به دو شرط نیاز دارد: کنترل روی محتوای یک فایل روی سرور (لاگ، نشست، فایل آپلودی) و توانایی گنجاندن آن فایل. به همین دلیل تفکیک فایل‌های نوشتنی از مسیرهای قابل‌گنجاندن، یکی از مؤثرترین لایه‌های دفاعی است. اگر برنامه به‌جای include فقط readfile اجرا کند، سطح خطر از اجرای کد به افشای اطلاعات تنزل می‌یابد — که همچنان جدی است اما شدت کمتری دارد.

چرا ترفند null-byte دیگر کار نمی‌کند

باور غلط رایج

«با درج بایت پوچ %00 می‌توان بررسی پسوند فایل در LFI را دور زد.» این تکنیک منسوخ است. رفتار مربوطه در PHP نسخه‌ی 5.3.4 (سال ۲۰۱۰) اصلاح شد و روی هیچ نصب مدرن PHP کار نمی‌کند. محتوای فارسی این ترفند را مکرراً به‌عنوان تکنیک روز تکرار می‌کند؛ در گزارش تست نفوذ سال ۲۰۲۶ نباید آن را روش جاری معرفی کرد.

در مقابل، بایپس‌های همچنان معتبر عبارت‌اند از الگوهایی مثل ....// (که پس از حذف یک ../ دوباره به ../ تبدیل می‌شود)، کدگذاری URL و دوگانه (%2e%2e%2f، %252e%252e%252f)، و مسیرهای مطلق. تمرکز درست، بستن ریشه‌ای پیمایش است، نه شناختن یک ترفند خاص.

سناریوی واقعی و کشف در تست نفوذ

سناریوی متعارف: یک صفحه که با پارامتری مثل ?page=about بخش‌های سایت را بارگذاری می‌کند و مقدار را مستقیماً به تابع گنجاندن فایل می‌دهد. مهاجم ?page=../../../../etc/passwd را امتحان می‌کند و محتوای فایل سیستم را می‌بیند؛ سپس با php://filter کد منبع پیکربندی را استخراج می‌کند تا اعتبارنامه‌ی پایگاه‌داده را بیابد.

روش کشف در تست نفوذ وب:

  • شناسایی هر پارامتری که نامی از فایل، صفحه، قالب یا زبان می‌گیرد.
  • آزمون پیمایش مسیر و wrapperها با ابزار فازینگ مانند ffuf و فهرست مسیرهای حساس.
  • استفاده از فهرست‌های مسیر حساس (مانند مجموعه‌های SecLists) برای پوشش سیستم‌عامل‌ها و فریم‌ورک‌های مختلف.
  • مکمل با بازبینی کد منبع برای یافتن فراخوانی‌های include/require/fopen با ورودی کاربر.

یک نکته‌ی روش‌شناختی: چون بسیاری از برنامه‌ها پسوند ثابتی (مثل .php) به ورودی می‌چسبانند، تستر باید هم مسیرهای بدون پسوند و هم تکنیک‌های خنثی‌سازی پسوند را بیازماید — البته با علم به اینکه ترفند بایت پوچ دیگر معتبر نیست. توجه کنید که نسخه‌ی «از راه دور» این خانواده، یعنی RFI، امروزه عمدتاً تاریخی است؛ تکنیک زنده همین LFI است، و برای درک زمینه‌ی واکشی منابع بیرونی، SSRF را نیز ببینید.

این بررسی بخشی از تست نفوذ وب پی‌هانتر است.

نمونه‌ی فنی و ارتباط با OWASP

شکل چند پروب تشخیصی غیرمخرب:

# پیمایش مسیر
?file=../../../../etc/passwd

# استخراج کد منبع بدون اجرا (wrapper)
?file=php://filter/convert.base64-encode/resource=config

پیمایش مسیر شناسه‌ی CWE-22 را دارد و در فهرست ۲۵‌گانه‌ی CWE سال ۲۰۲۵ رتبه‌ی ششم است. در OWASP Top 10:2025، خواندن فایل و گنجاندن آن به‌عنوان یک ضعف کنترل دسترسی/تزریق دیده می‌شود و در راهنمای تست OWASP زیر آزمون‌های Code Injection (شامل LFI و RFI) قرار دارد. مرور دسته‌بندی در صفحه‌ی OWASP.

پرسش‌های متداول

تفاوت LFI و پیمایش مسیر چیست؟

این دو نزدیک‌اند: پیمایش مسیر توانایی خارج شدن از دایرکتوری با ../ برای خواندن فایل‌های دلخواه است، و LFI حالتی است که برنامه فایل انتخاب‌شده را می‌گنجاند یا اجرا می‌کند. LFI اغلب از پیمایش مسیر برای رسیدن به فایل هدف استفاده می‌کند.

آیا ترفند null-byte برای دور زدن بررسی پسوند هنوز کار می‌کند؟

خیر. این رفتار در PHP نسخه‌ی 5.3.4 (سال ۲۰۱۰) اصلاح شد و روی نصب‌های مدرن PHP کار نمی‌کند. معرفی آن به‌عنوان تکنیک جاری نادرست است.

آیا LFI فقط خواندن فایل است یا به اجرای کد هم می‌رسد؟

می‌تواند به اجرای کد برسد. مسیرهای متعارف شامل مسموم‌سازی لاگ، wrapperهای PHP مثل php://filter و phar://، فایل‌های نشست و گنجاندن فایل آپلودشده است.

پیشگیری / رفع

راهکارها به ترتیب اثربخشی:

  1. مسیر فایل را از ورودی کاربر نسازید. به‌جای پذیرش نام فایل، از یک نگاشت فهرست سفید (شناسه‌ی امن ← مسیر ثابت) استفاده کنید.
  2. اگر ناچارید، ورودی را به یک دایرکتوری مشخص محدود کنید و مسیر نهایی را پس از canonicalize کردن اعتبارسنجی کنید تا خارج از ریشه نرود.
  3. wrapperهای خطرناک (php://، data://، phar://) را در صورت عدم نیاز غیرفعال کنید.
  4. سرویس را با حداقل‌ترین امتیاز اجرا کنید و دسترسی خواندن فایل‌های حساس را محدود کنید.
  5. لاگ‌ها و فایل‌های آپلود را خارج از مسیرهای قابل‌گنجاندن نگه دارید تا مسیر LFI به RCE بسته شود.
→ بازگشت به دانشنامه
PUT IT TO THE TEST

امنیت سامانه‌ی شما را
به مهاجمان واگذار نکنید

تیم پی‌هانتر با دیدِ یک مهاجم واقعی، این آسیب‌پذیری‌ها و ده‌ها مورد دیگر را روی دارایی‌های شما می‌سنجد.