مقدمه
در این مقاله قصد داریم یکی از Challenge های محیط آزمایشی Root-Me که مرتبط با حمله ی Unrestricted File Upload می باشد را بررسی کنیم.
در این حمله، مهاجم با سوء استفاده از قابلیت بارگذاری در Web application، می تواند به فایل های حساس و مهم دسترسی پیدا کند و حتی، با آپلود نمودن یک SHELL، به راحتی می تواند کنترل کامل سرور را به دست بگیرد. اما قبل از آن پیشنهاد می کنیم به صفحه باگ بانتی که بسیار مرتبط با این مقاله است بروید و برای فهم بیشتر این مطالب ابتدا آن مقاله را مطالعه کنید.
آسیب پذیری مذکور، ناشی از عدم محدودیت و عدم بررسی نوع فایل های آپلود شده می باشد.
سناریو
هدف از challenge مذکور، یافتن محتویات ذخیره شده در فایل .passwd می باشد. Challenge مذکور، مطابق تصویر زیر در قسمت Challenges → Web – Server قرار دارد.
سپس File upload - MIME type را انتخاب نمایید. همانطور که در تصویر زیر قابل مشاهده می باشد، challenge مذکور، مربوط به یک Photo gallery می باشد که با وارد شدن در صفحه ی Upload و کلیک بر روی گزینه ی “upload”، می توان یک تصویر را آپلود نمود. طبق متن نوشته شده داخل صفحه، فقط فرمت های GIF، JPEG و PNG قابل آپلود می باشد.
در ابتدا، به عنوان بررسی عملکرد این قسمت، می توان یک تصویر دلخواه را آپلود نمود. به طور مثال یک تصویر با نام Attacker-pic.jpg آپلود شده است که قسمتی از ترافیک درخواستی در تصویر زیر قابل مشاهده می باشد.
بعد از آپلود تصویر، اطلاعات مربوط به تصویر آپلود شده از سمت Web Application نمایش داده می شود.
حال برای آن که متوجه وجود و یا عدم وجود محدودیت نوع فایل بشویم، می توانیم یک فایل با فرمت PHP ارسال نماییم. همانطور که در تصویر زیر قابل نمایش می باشد، Application، فایل مذکور را قبول نمی کند.
در ادامه، برای بررسی بیشتر، فایل 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 تشخیص داده است.
حال مقدار Content-Type را مطابق تصویر زیر به image/png تغییر می دهیم و سپس درخواست را ارسال می کنیم.
بعد از ارسال درخواست فوق، مطابق تصویر زیر خواهیم دید که Application، فایل php را قبول کرده است.
حال به بخش uploads می رویم و مطابق تصویر زیر فایل های آپلود شده را مشاهده می کنیم.
در آخر، با کلیک بر روی فایل PHP، دستور موجود در PHP بر روی سرور اجرا شده است و محتویات فایل .passwd مطابق تصویر زیر نمایش داده شده است.
با وارد نمودن مقدار نمایش داده شده، در بخش validation، حل challenge مذکور تایید می شود.
منبع:
https://www.root-me.org/en/Challenges/Web-Server/File-upload-MIME-type