PDA

View Full Version : سوال: کد آپلودم از لحاظ مسائل امنیتی خوبه یا نه ؟



ABZiko
چهارشنبه 12 شهریور 1393, 10:33 صبح
سلام و خسته نباشید، بنده کدی برای آپلود فایل نوشتم به صورت زیر، می خواستم بدونم از لحاظ امنیتی مشکلی داره یا نه. تشکر :


<?php

$name=$_FILES['userFile']['name'];
$tmp=$_FILES['userFile']['tmp_name'];
$size=$_FILES['userFile']['size'];;
$type=$_FILES['userFile']['type'];
$error=$_FILES['userFile']['error'];

$arr=array('image/png','image/jpg');

if($error==UPLOAD_ERR_OK){

if(in_array($type,$arr)){

if($size<5000){

if(is_uploaded_file($tmp)){

if(move_uploaded_file($tmp,'Uploads/'.$name)){

echo "Your file has uploaded !";

}

else{

echo "Your file didn't uploaded !";

}

}

else{

echo "There is error with your code !";

}

}

else{

echo "Your file is too big !!!";

}

}

else{

echo "your format isn't supported !";

}

}

else{

echo "Your file isn't good !";

}

?>

hamedarian2009
چهارشنبه 12 شهریور 1393, 11:22 صبح
سلام مثلا اگه همچین فایلی shell.php.jpg بخاد آپلود بشه چه راهکاری براش در نظر گرفتین؟

DR.HTML
چهارشنبه 12 شهریور 1393, 13:04 عصر
بری حملات bypass ؟ باید از توابع explode و end استفاده کنید

ABZiko
چهارشنبه 12 شهریور 1393, 13:11 عصر
تشکر از نظراتتون، برای اون فایل هایی که گفتین چطوری باید پسوند رو در نظر بگیرم؟
می شه بیشتر درباره bypass توضیح بدین؟

DR.HTML
چهارشنبه 12 شهریور 1393, 13:35 عصر
ببینید مثل همین مثال که دوستمون معرفی کرد shell.php.jpg اگر طرف اینو اپلود کرد یعنی بععد از php شل یه jpg اضافه کرد بعد از اپلود شدن تونست
shell.php رو ران کنه ؟ اون وقع فایل php اجرا ممیشه ! باید تمامی . رو به یه کارکاتر دیگه مثل - تغیر بدید بعد اخرین - رو به . دوباره تغیر بدید بعد مثلا فایل میشه shell-php.jpg

حتی با bypass هم اجرا نمیشه

ABZiko
چهارشنبه 12 شهریور 1393, 19:55 عصر
تشکر ، خب الان با explode و end چطور می شه اولین نقطه رو تبدیل به dash کرد؟

arash691
چهارشنبه 12 شهریور 1393, 22:16 عصر
filename.php.jpg دات دوم رو به یک کاراکتر دیگه تبدیل بکن ( مثلا" 0 ) دیگه اجرا نمیشه ... یک روش دیگه اینکه سرور رو تنظیم کنی اصلا" این فایل رو اجرا نکنه ....

ABZiko
پنج شنبه 13 شهریور 1393, 21:03 عصر
filename.php.jpg دات دوم رو به یک کاراکتر دیگه تبدیل بکن ( مثلا" 0 ) دیگه اجرا نمیشه ... یک روش دیگه اینکه سرور رو تنظیم کنی اصلا" این فایل رو اجرا نکنه ....

ممنون، چطوری می تونم توی کد های خودم این کار رو بکنم؟ با explode می شه ، درسته؟ اما چطوری بگم اگر دو پسونده بود، نقطه دومی رو تبدیل به یک حرف کنه؟

DR.HTML
پنج شنبه 13 شهریور 1393, 21:52 عصر
اول با Explode رشترو به ارایه تبدیل میکنیم بعد با end اخرین رشترو که میگیریم میزاریم توی یه متغیر دیگه بعد با Strreplace . رو به - تبدیل میکنیم دوباره اون متغیره که جدا کردیم با str ریپلیش مزاریم جای خالیش

خداییش نفهمین چی گفتم حق دارین :لبخند:

ABZiko
پنج شنبه 13 شهریور 1393, 22:02 عصر
می شه روی همون کد ها خودم انجامش بدین؟:متعجب:

DR.HTML
پنج شنبه 13 شهریور 1393, 22:07 عصر
البته این یه مثاله میشه مانورهای دیگم روش داد مثلا من خودم تبدیل به md5 میکنم رشته قبلشو که نه سیخ بسوزه نه کباب :لبخند:

<?php
$str='shell.php.jpg';
$my=explode('.',$str);
$last=end($my);
$str=str_replace('.','-',$str);
$str=str_replace('-' . $last,'.' . $last,$str);
echo $str;
?>

ABZiko
پنج شنبه 13 شهریور 1393, 22:10 عصر
ممنون، بعد از مجا بفهمیم که فایل کاربر از این نوع هست؟ یعنی چند فرمته هست؟

DR.HTML
پنج شنبه 13 شهریور 1393, 22:12 عصر
نیازی نیست بفهمین اصلا چرا باید بفهمین هر فایلی اومد شما این بلاهارو سرش بیارین حالا اگر شل بود که خنثی شده اگرم نبود چیزی نشده همونه باز

hamedarian2009
پنج شنبه 13 شهریور 1393, 22:14 عصر
اینجوری باید انجام بدی


$fileName = 'shell.php.jpg';

$ext = end(explode('.', $fileName));

$fileName = str_replace('.', '-', $fileName);
$fileName = str_replace('-'.$ext, '.'.$ext, $fileName);
echo $fileName;

ABZiko
پنج شنبه 13 شهریور 1393, 22:20 عصر
ممنون، فقط باید به جای اون رشته امتحانی که با explode به آرایه تبدیل کردین، باید از نام اون فایل استفاده کنیم، درسته؟

DR.HTML
پنج شنبه 13 شهریور 1393, 22:22 عصر
بله درسته باید اسم فایل اپلودی باشه

ABZiko
پنج شنبه 13 شهریور 1393, 22:25 عصر
اینو نوشتم و اروری نداد، درسته؟


$sep=explode('.',$name);
$last=end($sep);
$str=str_replace('.','-',$sep);
$str=str_replace('-'.$last,'.'.$last,$str);

ABZiko
پنج شنبه 13 شهریور 1393, 22:29 عصر
تغییرش دادم :


$sep=explode('.',$name);
$last=end($sep);
$str=str_replace('.','-',$name);
$str=str_replace('-'.$last,'.'.$last,$name);