امنیت سایت در php – بخش سوم باگ LFI و RFI
باگ LFI و RFI :
این دو باگ تا حد زیادی به هم شبیه هستند . LFI مخفف Local File inclusion و RFI مخفف Remote File Inclusion می باشد .
این دو باگ زمانی رخ میدهد که برنامه نویس فایلی را اینکلود کند که آدرس را از کاربر دریافت میکند .
نکته : دستورات نباید صرفا اینکلود باشد و استفاده کنترل نشده از هر کدام از فایل های زیر میتواند موجب این باگ باشد .
include , include_once , require , require_once
سناریو هک با باگ و یک نمونه کد آسیپ پذیر باگ باگ LFI و RFI :
همانطور که گفته شد این دو تا باگ زمانی به وجود می آید که برنامه نویس فایلی را اینکلود کند که آدرس آن را از کاربر دریافت کند برای مثال به کد زیر توجه کنید :
<?php include ($_GET['file']); ?>
حال اگر هکر در ایندکس فایل متد گت آدرس یک فایل تکست که محتویات آن کد های یک شل است و این را بر روی سرور خود ریخته است وارد کند شل اجرا میشود و چون آدرس اینکلود شده خارجی است این باگ RFI خواهد بود .
اما اگر هکر در ایندکس فایل متد گت آدرس یک فایل داخلی را وارد کند فایل نمایان خواهد شد و چون این آدرس داخلی بوده است این باگ را LFI مینامند .
راه حل چیست ؟
فایل وارد شده توسط کاربر را از یک لیست چک کنیم و اگر فایل در لیست بود اینکلود شود . مثال :
<?php $files=array('test.gif'); if(in_array($_GET['file'], $files)){ include ($_GET['file']); } ?>
اگر ادمین سرور هستیم از فایل allow_url_fopen را خاموش کنیم.
یا با دستور ini_set این کار را انجام دهیم . فقط برای (RFI)
<?php ini_set('allow_url_fopen ', 'Off'); ?>
میتوانیم با استفاده از دستور strpos چک کنیم که اگر در آدرس وارد شده ://http بود فایل اینکلود نشود (فقط میتواند جلوی RFI را بگیرد )
<?php $strpos = strpos($_GET['url'],'http://'); if(!$strpos){ include($_GET['url']); } ?>
با استفاده از str_replace میتوانیم آدرس داده شده را از دو کارکتر “/” , “.” پاکسازی کنیم .
<?php $url=$_GET['url']; $url = str_replace("/", "", $url); $url = str_replace(".", "", $url); include($url); ?>
شما تقریبا با باگ های مهمی آشنا شدید که میتواند امنیت سایتتون رو تامین کند.
امیدوارم از این سری آموزش لذت برده باشید .