حمله Unrestricted File Upload در محیط آزمایشی

تاریخ انتشار : 1399/10/24 | نویسنده : kernel-panic

حمله Unrestricted File Upload در محیط آزمایشی

مقدمه

در این مقاله قصد داریم یکی از Challenge های محیط آزمایشی Root-Me که مرتبط با حمله ی Unrestricted File Upload می باشد را بررسی کنیم.

در این حمله، مهاجم با سوء استفاده از قابلیت بارگذاری در Web application، می تواند به فایل های حساس و مهم دسترسی پیدا کند و حتی، با آپلود نمودن یک SHELL، به راحتی می تواند کنترل کامل سرور را به دست بگیرد. اما قبل از آن پیشنهاد می کنیم به صفحه باگ بانتی که بسیار مرتبط  با این مقاله است بروید و برای فهم بیشتر این مطالب ابتدا آن مقاله را مطالعه کنید.

آسیب پذیری مذکور، ناشی از عدم محدودیت و عدم بررسی نوع فایل های آپلود شده می باشد.

سناریو

هدف از challenge مذکور، یافتن محتویات ذخیره شده در فایل .passwd می باشد. Challenge مذکور، مطابق تصویر زیر در قسمت Challenges → Web – Server قرار دارد.

rnpg-file-upload-unrestricted

 

سپس File upload - MIME type را انتخاب نمایید. همانطور که در تصویر زیر قابل مشاهده می باشد، challenge مذکور، مربوط به یک Photo gallery می باشد که با وارد شدن در صفحه ی Upload و کلیک بر روی گزینه ی “upload”، می توان یک تصویر را آپلود نمود. طبق متن نوشته شده داخل صفحه، فقط فرمت های GIF، JPEG و PNG قابل آپلود می باشد.

rnpg-file-upload-unrestricted

 

در ابتدا، به عنوان بررسی عملکرد این قسمت، می توان یک تصویر دلخواه را آپلود نمود. به طور مثال یک تصویر با نام Attacker-pic.jpg آپلود شده است که قسمتی از ترافیک درخواستی در تصویر زیر قابل مشاهده می باشد.

rnpg-file-upload-unrestricted

 

بعد از آپلود تصویر، اطلاعات مربوط به تصویر آپلود شده از سمت Web Application نمایش داده می شود.

rnpg-file-upload-unrestricted

 

حال برای آن که متوجه وجود و یا عدم وجود محدودیت نوع فایل بشویم، می توانیم یک فایل با فرمت PHP ارسال نماییم. همانطور که در تصویر زیر قابل نمایش می باشد، Application، فایل مذکور را قبول نمی کند.

RNPG-FILE-UPLOAD-UNRESTRICTED

 

در ادامه، برای بررسی بیشتر، فایل PHP را مطابق دستورات زیر ایجاد می نماییم.

<?php

                    $output = shell_exec('cat ../../../.passwd');

                    echo "<pre>$output</pre>";

          ?>

 

فایل مذکور، با استفاده از تابع shell_exec دستور cat را اجرا می کند که منجر به خوانده شدن فایل .passwd در root folder سرور می شود. حال، فایل php مذکور را مجددا آپلود می کنیم، با این تفاوت که درخواست آپلود را با کمک ابزار Burp Suite، Intercept می کنیم. همانطور که در تصویر زیر قابل مشاهده می باشد، Application، فایل مذکور را application/octet-stream تشخیص داده است.

rnpg-file-upload-unrestricted

 

حال مقدار Content-Type را مطابق تصویر زیر به image/png تغییر می دهیم  و سپس درخواست را ارسال می کنیم.

rnpg-file-upload-unrestricted

 

بعد از ارسال درخواست فوق، مطابق تصویر زیر خواهیم دید که Application، فایل php را قبول کرده است.

rnpg-file-upload-unrestricted

 

حال به بخش uploads می رویم و مطابق تصویر زیر فایل های آپلود شده را مشاهده می کنیم.

rnpg-file-upload-unrestricted

 

در آخر، با کلیک بر روی فایل PHP، دستور موجود در PHP بر روی سرور اجرا شده است و محتویات فایل .passwd مطابق تصویر زیر نمایش داده شده است.

rnpg-file-upload-unrestricted

با وارد نمودن مقدار نمایش داده شده، در بخش validation، حل challenge مذکور تایید می شود.

Rnpg-root-me

 

منبع:

https://www.root-me.org/en/Challenges/Web-Server/File-upload-MIME-type