در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به ادامه مبحث آشنایی با File Inclusion می پردازیم.
Remote File Inclusion
بعد از اینکه شما فایلهای محلی را با استفاده از آسیبپذیری Local File Inclusion استخراج نمودید، میتوانید از این آسیبپذیری به منظور اجرای کد استفاده کنید.
در صورتی که مهاجم قادر به اجرای کد بر روی سرور باشد، امکان دسترسی Shell به وب سرور وجود داشته و حتی در صورت وجود شرایط لازم، ارتقاء دسترسی نیز متصور خواهد بود. تمام این موارد از یک آسیب پذیری کوچک File Inclusion بدست می آید! این چیزی است که باعث میشود آسیب پذیری File Inclusion بسیار خطرناک باشد.
توانایی دستیابی به اجرای کد به دو موضوع بستگی دارد. ابتدا، تابع مربوط به Inclusion باید اجرای کد را پشتیبانی کند. دوم، مهاجم باید بتواند محتوای فایل Include شده را کنترل کند.
یکی از روشهایی که منجر به اجرای کد در اهداف میشود، به ویژگی برخی توابع Include در زبانهای برنامه نویسی مانند PHP بستگی دارد که میتواند فایلهای میزبانی شده بر روی یک سرور از راه دور را Include کند. در این سناریو، مهاجم به جای قرار دادن یک مسیر فایل، از یک URL به استفاده میکند.
برای مثال، اگر مهاجم سرور وب واقع در http: //attcker را تحت کنترل داشته باشد، میتواند فایلی به نام php.txt را که شامل کد اجرایی PHP است، در آن قرار دهد.
این کد PHP میتواند شامل هر چیزی مانند یک Backdoor Shell یا یک صفحه ساده phpinfo () باشد. سپس مهاجم میتواند به سرور وب بگوید که فایل از راه دور را بوسیله یک URL، Include نماید:
از آنجا که ما میخواهیم که سرور وب هدف، به جای سرور وب مهاجم، کد را اجرا کند، ما به از پسوند .txt برای این فایل استفاده میکنیم. به این ترتیب، محتویات فایل بر روی سرور مهاجم اجرا نشده و پس از اینکه فایل متنی توسط سرور وب هدف دریافت گردید، Include شده و سپس اجرا میشود.
در این مثال با توجه به اینکه ما از phpinfo () در کد، استفاده نموده ایم، صفحه phpinfo به ما نشان داده میشود و اثبات میکند که ما به اجرای کد دست یافتهایم.
Firewall? No Problem
اگرچه مثال ارائهشده در صفحه قبل ممکن است با شکست مواجه شود، اما این میتواند False Negative باشد. برای کاهش این گونه موارد، پیشنهاد میشود تمام آزمایشها برای شناسایی آسیب پذیری RFI از طریق یک URL محلی یا 127.0.0.1 انجام شود.
اگر یک URL راه دور کار نمیکند اما بوسیله استفاده از یک آدرس محلی، Inclusion انجام میشود، ممکن است یک فایروال وجود داشته باشد که اتصال HTTP خروجی را مسدود نموده است.
ما میتوانیم این موضوه را با چند جایگزین، مانند data:// و php://input درPHP و همچنین Include نمودن فایلها روی SMB/CIFS در PHP، ASP و هر زبان برنامه کاربردی وب دیگری که قادر به Include نمودن مسیرهایUNC، مانند \server\share\file باشد، bypass نمود.
یک تکنیک دیگر برای عبور از دیوار آتش خروجی، استفاده از یک پورت غیر استاندارد برایInclude نمودن URL از راه دور است. به عنوان مثال پورت ۵۳ برای DNS به طور خاص برای ارتباطات خروجی مجاز است.
PHP Stream Wrappers
دو روش برای Remote File Inclusion بوسیله بهره مندی از PHP stream wrapper وجود دارد که در ادامه به آن اشاره می کنیم. مشابه php://filter ، دو روش دیگر وجود دارد که میتوانند به عنوان جایگزینی برای یک URL راه دور عمل کنند.
این stream wrapperمیتوانند در هر جایی که یک مسیر به یک فایل مورد استفاده قرار میگیرد، استفاده شوند، مانند زمانی که Include یک فایل از طریق توابع include() یا require() انجام شده باشد.
اولین نوع stream wrapper، استفاده از data:// می باشد. این مورد، کدگذاری محتویات یک فایل در URL را ممکن میسازد و در واقع یک mime-type را فراهم میکند که نشان میدهد دادهها چگونه کدگذاری میشوند، مانند text/plain;base64. برای دستیابی به تزریق دستور، مانند اجرای دستور سیستمی ls، یک مهاجم میتواند عبارت زیر را با استفاده از Baase64 کدگذاری نماید و آن را به صورت زیر به صفحه آسیبپذیر منتقل نماید:
روش دومی که میتواند برای دستیابی به RFI مورد استفاده قرار گیرد،php: //input است. این stream wrapper، زمانی که به عنوان یک مسیر فایل استفاده میشود، دادههای POST ارسالشده به صفحه PHP را به عنوان یک فایل در نظر میگیرد. مثال این کار را با استفاده از یک قالب HTML ساده نشان میدهد.
Action این فرم بر روی صفحه آسیبپذیر تنظیم شدهاست، با استفاده از آسیبپذیری برای Include نمودن “php: //input.” فرمی که این درخواست را از طریق POST ارسال میکند از یک کدگذاری “text/plain” برای جلوگیری از رمزگذاری کد PHP استفاده میکند که به عنوان یک متغیر به نام اکسپلویت حاوی کد ارسال میشود. از این رو باز کردن این فرم در فایرفاکس و ارسال آن منجر به اجرای کد زیر را بر روی سرور می گردد.
Bypass RFI Restrictions
اگرچه انجام Remote File Inclusion با استفاده از یک URL یا stream wrapper ساده است، اما به طور پیشفرض در نصبهای مدرن PHP از کار انداخته میشود. البته ممکن است این قابلیتها توسط توسعه دهندگانی که به آنها نیاز دارند فعال شود. ولی در صورت غیرفعال بودن چه باید کرد؟
یک روش جایگزین، در درجه اول در ویندوز، SMB/CIFS است. از آنجا که ویندوز می تواند به جای URL های راه دور، مسیرهایUNC (\server\file) را به عنوان فایلهای محلی در نظر بگیرد، شما میتوانید بدون در نظر گرفتن محدودیتهای امنیتی قرار دادهشده بر روی URL ها، File Inclusion را از راه دور بر روی SMB قرار استفاده نمایید.
فرض کنید یک مهاجم صاحب یک سرور SMB مخرب (\attacker) با یک پوشه به اشتراک گذاری شده ناشناس و قابلدسترس (\attacker\mal) است و فایلی به نام malicious.txt که حاوی کد PHP، ASP یا JSP میباشد را در آن قرار داده است. سپس مهاجم میتواند مسیر \attcker\mal\malicious.txt را در Include نموده و اگر سرور وب بتواند به سرور SMB متصل شود، Remote File Inclusion به دست میآید.