در این قسمت از سریال قصد داریم تا شما را با تکنیک های ترکیبی و خلاقانه ای آشنا کنیم که احتمالا شما را شگفت زده خواهد کرد! 😉 در قسمتهای قبلی با استفاده از تکنیک های مختلفی توانستیم که آسیب پذیری LFI را به اجرای کد تبدیل کنیم. در این قسمت نیز از دو تکنیک ترکیبی رونمایی خواهیم کرد که به آسانی با استفاده از آنها میتوان به مرحله ی اجرای کد روی سرور رسید!
روش ترکیبی استفاده از آپلودر موجود در سایت
در این روش اگر آپلودری در داخل سایت باشد که بتوان از طریق آن فایلهایی با فرمت PDF,TXT,GIF,... آپلود کرد میتوان هدر فایل ها را درست قرار داد ولی در بدنه آن کد php قرار داد البته به شرطی که محتوای فایل چک و بررسی نشود.(این مورد بستگی به کد نوشته شده دارد.)
پس از آپلود موفق فایل، در صورت داشتن دسترسی به آدرس فایل و کپی کردن و قرار دادن این آدرس در پارامتر آسیب پذیر به LFI، میتوانیم کد داخل فایل را اجرا کنیم. در ادامه به دو نمونه محتوای فایل اشاره شده است که در صورت اجرای موفق این سناریو باید صفحه مشخصات PHP (اصطلاحاً phpinfo) را به شما نمایش دهد. برای تست کردن این که محتوای فایل هنگام آپلود دچار تغییرات نشده باشد میتوانید قبل از آدرس URL فایل عبارت view-source: را قرار دهید و محتوای آن را در مرورگر ببینید و مطمئن شوید. راه حل آسانتر برای این کار دانلود کردن و بررسی محتوای فایل با یک ویرایشگر متن است. 😊
نمونهای از محتوای یک فایل PDF برای تست آسیب پذیر بودن:
%PDF-1.4
<?php phpinfo();
نمونهای از محتوای یک فایل GIF برای تست آسیب پذیر بودن:
GIF89a
<?php phpinfo();
روش ایجاد tempfile با استفاده از آپلودر
هنگامی که فایلهای حجیم را آپلود میکنیم یا فایلهایی که در پارت های متعدد آپلود میشوند، به طور پیشفرص داده ارسال شده، در حال ذخیره شدن در آدرس temp تعیین شده در تنظیمات php است. به طور مثال در ویندوز، هنگام استفاده از wamp این آدرس عبارت است از:
C:\wamp64\tmp
برای پیدا کردن آدرس دقیق ذخیره فایلهای temp، به phpinfo مراجعه کنید(البته برای wamp بعضی از اطلاعات قید شده در صفحه phpinfo درست نیست).
حال فرض کنید که در یکی از صفحات وبسایت آسیب پذیری LFI داشته باشیم. در این صورت اگر نتوانیم با استفاده از روش های قبلی، دسترسی برای اجرای دستور داشته باشیم میتوانیم با استفاده از طولانی کردن زمان آپلود با تغییر سایز content-length و پیلود character blocks درburpsuite ، همزمان بروت فورس کردن نام فایل temp ایجاد شده برای فایل در حال آپلود را انجام دهیم و در صورت پیدا کردن نام فایل temp، با استفاده از LFI این فایل را include کرده و دستور را اجرا کنیم.
در ابتدا برای این که فایل temp ساخته شود همانگونه که گفته شد باید در Burpsuite در قسمت Intruder در تب Positions درخواستی مانند تصویر زیر برای آپلودر موجود روی سایت ایجاد کنیم.
همانگونه که در تصویر بالا مشاهده میکنید باید content-length را یک عدد بزرگ بگذاریم و چون قرار است در داخل فایل temp کد php اجرا کنیم ابتدا یک تکه کد php ثابت در قسمت بدنه درخواست قرار میدهیم. همانگونه که در تصویر مشخص شده، چون قرار است از character block استفاده کنیم و تعداد زیادی کاراکتر اضافی به فایل افزوده شود، برای جلوگیری از خطاهای php باید قبل از قسمت مشخص شده برای پیلود، از */ برای کامنت کردن ادامه کاراکترها استفاده کنیم. (برای جلوگیری از ایجاد مشکل در اجرای کد، توصیه میشود از تگ بسته php با علامت ?> در انتهای این گونه از فایل ها که قرار است include شوند استفاده نکنید)
در گام بعدی مانند تصویر زیر باید به تب Payloads بروید و تعداد payload را روی 1 و نوع آن را روی Character Block قرار دهیم و مشابه تصویر، یک کاراکتر مانند A را به تعداد زیاد مثلا در بازه 100000 تا 1000000 با Step(گام) 10 تایی تکرار کنیم.
همانگونه که در تصویر زیر مشخص است باید در تب Options تیک گزینههای update content-length header و Set connection close را برداریم تا عدد ثابتی که برای content-length در قسمت اول گذاشتیم خراب نشود. تعداد نخ ها(Thread) را روی 500 میگذاریم تا حمله با سرعت بیشتری اجرا شود.
حال اگر این حمله را اجرا کنیم خواهیم دید که مانند تصویر زیر فایلهای temp در دایرکتوری C:\wamp64\tmp ساخته میشوند.
مطابق تصویر، فایلهای temp ساخته شده یک الگوی اسمی ثابت دارند که بخش ابتدایی آن با عبارت php اغاز شده و بخش وسط آن شامل 4 رقم است که هر کدام از این ارقام در مبنای 16 از 0 تا F هستند و بخش انتهایی آن شامل عبارت tmp. است. عبارت منظم کلی آن به صورت زیر میشود:
php[0-F][0-F][0-F][0-F].tmp
بنابراین برای اجرای حمله Bruteforce در Burpsuite به بخش Intruder و سپس به تب Positions میرویم و مانند شکل زیر position را تنظیم میکنیم.
حال به تب Payloads میرویم و مانند تصویر زیر یک payload از نوع Brute Forcer ایجاد میکنیم و Character Set آن را مطابق تصویر زیر از 0 تا F قرار میدهیم و طول مینیمم و ماکزیمم آن را روی 4 قرار میدهیم تا عبارت هایی با طول ثابت 4 ایجاد کند. در تب Options نیز تعداد تردها را روی 500 قرار داده و Start Attack را میزنیم.
حال پس از پیدا کردن یک فایل temp با استفاده از Bruteforce میتوانیم با استفاده از آسیب پذیری LFI آن فایل را include کرده و مانند تصویر زیر قطعه کد php خود را اجرا کنیم.
این روش خلاقیت بچه های سکان آکادمی بوده است و ما نمونهای از آن را در جای دیگر مشاهده نکردهایم! اگر این روش یا مشابهش را در جای دیگری مشاهده کردهاید در بخش نظرات ما را هم در جریان بگذارید! 😉 اگر خلاقیتی مثل این مورد را در ذهن خود داشتید و موفق به پیاده سازی آن شدید به ما خبر بدهید تا با کمال خوشحالی، تجربه شما را به این پست اضافه کنیم! 😊
در این قسمت در کنار هم یاد گرفتیم که با استفاده از ماژول های دیگری در سایت مانند آپلودر میتوانیم تکنیک هایی ترکیبی پیاده کنیم و حرفهایتر از همیشه آسیب پذیری LFI را به اجرای کد برسانیم.😊 در قسمت بعدی که آخرین قسمت این دوره است تکنیک های دور زدن محدودیت را با هم بررسی خواهیم کرد. تا قسمت بعدی شما را به خداوند بزرگ می سپاریم!