بررسی آسیب پذیری File Upload در PHP

آسیب پذیری File Upload / آپلود فایل یکی از آسیب پذیری بسیار مهمی هست که معمولا در آپلودر ها وجود دارد. این آسیب پذیری به نفوذگر کمک میکند که بتواند هر نوع کدی که مد نظر دارد را به عنوان یک برنامه نویس سمت سرور بر روی سرور اجرا کنید و جزو آسیب پذیری های بسیار خطرناک محسوب میشود.

بررسی آسیب پذیری 

این آسیب پذیری معمولا در داخل پنل های مدیریت و پنل های کاربران پیدا میشود ، معمولا برنامه نویس دقتی در فیلترینگ فرایند آپلودر ها ندارد و همین باعث ایجاد این آسیب پذیری میشود. بسته به نوع سرور ، نوع برنامه و سیستم عامل میتواند نحوه بهره برداری از این آسیب پذیری متفاوت باشد ، اما نتیجه همیشه نتیجه ای خطر ناک هست که امکان کنترل کل یک وب سایت را برای نفوذگر فراهم میکند.

 

کد زیر ، کد سمت سرور یک آپلودر معمولا در PHP میباشد :

درون متغیر target_path مسیر فایل های آپلود شده ذخیره شده است و از طریق متغیر Super Global ـه FILES نام فایل را تشخیص و سپس در ادامه مسیر آپلود برای استفاده در تابع move_uploaded_file قرار داده شده است.

سپس با شرطی تعیین شده است که اگر مشکلی در فرایند حرکت دادن فایل از حافظه موقت به پوشه مربوطه پیش آمد ، اروری مبنی بر آپلود نشدن تصویر به کاربر داده شود و در غیر این صورت هیچ مشکلی درون آپلود وجود نداشته باشد.

در کد بالا بدون هیچ محدودیتی میتوانیم هر کدی رو که داریم بر روی سرور آپلود کنیم . برنامه نویسان به منظور محدود سازی سرور برای جلوگیری از این آسیب پذیری میتوانند شرط هایی را بر روی پارامتر های مختلفی متغیر Super Global ـه FILES بگذارند. در زیر متغیر هایی که اطلاعاتی درباره فایل ارسالی میدهند را اوردیم :

 

رفع آسیب پذیری آپلود فایل

برای رفع این آسیب پذیری از چند طریق میتوان عمل کرد :

۱. ایجاد محدودیت در برنامه

۲. ایجاد محدودیت در سمت سرور

ایجاد محدودیت در برنامه

آسیب پذیری آپلود فایل جزو آن دسته از آسیب پذیری هایی هست از فیلترینگ به منظور رفع آن استفاده میشود. همانطور که در کد بالا که از سایت php.net گرفته شده است مشاهده کردید ما قبل از ذخیره فایل در پوشه مربوطه میتوانیم شرط هایی را بگذاریم. که برای مثال حجم آن کمتر از ۱۰۰ کیلوبایت باشد ( نمونه این موارد را در پروفایل های کاربری شبکه های اجتماعی و … میتوانید مشاهده کنید ) یا نوع آن میبایست تصویر باشد . به منظور متوجه شدن چگونگی ایجاد این محدودیت ها کد زیر را مشاهده کنید :

همانطور که کد بالا قابل مشاهده است ، قبل از آوردن فایل در پوشه مربوط به آپلود با استفاده از تابع move_uploaded_file فیلترینگ های اعمال شده است. این فیلترینگ ها تا حدودی میتواند جلوی آپلود فایل هایی غیر از فایل های تصویری را بگیرد . اما ایمن نیست . از آسیب پذیری آپلود فایل همانطور که قبلا اشاره کردیم باید با استفاده از فیلترینگ در سطح برنامه سمت سرور جلوگیری شود. پس در صورتی که فیلترینگ کامل نفوذگر میتواند به سادگی فیلترینگ را دور بزند. اما تا کنون شاید برای شما سوال پیش آمده باشد که چگونه کد بالا ایمن نیست و چگونه میتوان با وجود فیلترینگ نوع فایل اقدام به نفوذ کرد ؟!

سوالی که من باید از شما بپرسم اینه که سرور از کجا متوجه میشه که نوع فایل چی هست؟ آیا سورس فایل را میخواند؟ آیا از فرمت فایل متوجه میشود؟ یا اینکه خودمان این اطلاعات را به سرور میفرستیم !

برای اینکه متوجه بشیم که هنگام آپلود فایل چه اطلاعاتی به سرور فرستاده میشود ، میتوانیم از افزونه Tamper Data استفاده کنیم.

تصویر زیر را مشاهده کنید :

tamper_data_file_upload_vulnerability

 

همانطور که مشاهده میکنید در Header های ارسالی پارامتر هایی مثل filename و همچنین content-type وجود داره ( همان header هایی که در برنامه بررسی شده است ) پس با این افزونه نفوذگر میتواند هر ۲ رو به هر چه که بخواهد تغییر دهد ، در نتیجه فیلترینگ روبرو مناسب نیست . پس با چه فیلترینگ ای جلوی این  آسیب پذیری را بگیریم؟

کد زیر را مشاهده کنید :

همانطور که مشاهده میکنید در کد بالا فیلترینگ جدیدی تحت عنوان File Extension اضافه شده است . به خط زیر دقت کنید :

در کد بالا ، متغیر uploaded_name که در داخل آن نام فایل ذخیره شده است را با استفاده از تابع substr جدا کرده است و در داخل متغیر uploaded_ext ذخیره  شده است. نکته ای که در این فیلترینگ وجود دارد این هست که در صورتی که ما فایل با نام Pic.jpg را آپلود کنیم مفسر سرور آن را تحت jpg تفسیر خواهد کرد و در نهایت کد های ما اجرا نخواهد شد. در سطح برنامه سمت سرور ، فیلترینگ بالا یکی از مناسب ترین فیلترینگ ها است.

ایجاد محدودیت در سمت سرور

شما میتوانید با آپلود یک فایل htaccess جلوی اجرای فایل های .php را بگیرید در این صورت اگر فایل php ای هم آپلود شود در سمت سرور اون فایل اجرا نمیشود.

نمونه ای از این شکل کد را میتوانید مشاهده کنید :

ویدئو آموزشی : 

۲ نظر

  • Detector 4 سال قبل

    آیا خوندن مقالات درون سایت الزامی هست؟

    • سلام
      مقالات درون سایت بیشتر در کنار فیلم های آموزشی کاربرد دارند به شما پیشنهاد میشود ابتدا مقالات را مطالعه فرمایید تا آشنایی کلی با یک مبحث پیدا کنید و سپس فیلم آموزشی مربوط به آن را ببینید.
      موفق باشید

ارسال نظر

ایمیل شما منتشر نخواهد شد. پر کردن ورودی ها الزامی است. *

*

چهار × سه =