PDA

View Full Version : بررسی روش تولید مجدد تصویر با استفاده از توابع gd برای امن کردن تصاویر آپلودی



A B C D
یک شنبه 13 شهریور 1390, 21:55 عصر
آقای MMSHFE (http://barnamenevis.org/member.php?55504-MMSHFE) اخیراً روشی رو برای برقراری امنیت فایلهایی آپلودی مطرح کرده بودن (http://barnamenevis.org/showthread.php?302784-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%D9%8A%D9%84-%D8%A7%D9%85%D9%86%D9%8A%D8%AA&p=1329237&viewfull=1#post1329237) که با چیزهای دیگری (http://barnamenevis.org/showthread.php?302784-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%D9%8A%D9%84-%D8%A7%D9%85%D9%86%D9%8A%D8%AA&p=1329914&viewfull=1#post1329914) که در ادامه گفتن بنظر میرسه از نظر ایشون این روش امنه و طوری این مسئله رو تعمیم دادن که میتونه بعنوان یک روش کلی قابل اطمینان در مورد تصاویر آپلودی (طبیعتا با فرمتهای مختلف مثل jpg, png و غیره) یا حتی انواع دیگر فایلها مثل فایلهای PDF بکار بره (البته مسلما از gd نمیشه برای فایلهای PDF استفاده کرد و باید بجاش از اکستنشن و توابع مخصوص PDF در PHP استفاده کنیم).
تاجاییکه فهمیدم بنظر ایشون اگر کتابخانه و توابع مربوطه، یک فایل رو بخونن و یک فایل خروجی مجددا توسط اون کتابخانه و توابع ایجاد بشه، کدهای نامربوط یا خطرناکی اگر در فایل اولیه وجود داشته، در فایل خروجی فیلتر میشه (یا به این صورت که فایل خروجی از نظر محتوی خالی/خنثی خواهد بود).

البته مسلما این روش واقعا جالب و هوشمندانه است، اما بنظر بنده امنیت اون مورد تردید است و اطمینان یافتن از اینکه بقدر کافی امن است کار دشواری است و بدون تحقیق و تحلیل و تست های دقیق کاملا تخصصی و سطح پایین نمیشه بقدر کافی از امنیتش مطمئن بود؛ و علت این رو در همون تاپیک هم توضیح دادم (http://barnamenevis.org/showthread.php?302784-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%D9%8A%D9%84-%D8%A7%D9%85%D9%86%D9%8A%D8%AA&p=1329447&viewfull=1#post1329447). بنظر بنده نمیشه (http://barnamenevis.org/showthread.php?302784-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%D9%8A%D9%84-%D8%A7%D9%85%D9%86%D9%8A%D8%AA&p=1329947&viewfull=1#post1329947) به این راحتی مطمئن شد که این روش در هیچ موردی امن است. اما از طرف دیگه در آوردن ته و توی این قضیه هم اونقدری کار تخصصی در فیلدهای متعدد گسترده و دشواری هست که شاید بنده هم توان یا وقت انجامش رو نداشته باشم؛ اما بهرحال یه مقدار اگر بیشتر تحلیل و تحقیق کنیم و تست های ساده و محدودی رو انجام بدیم، احتمال داره به نکات و نتایجی برسیم که ارزشمند باشن، هرچند به یک نتیجهء قاطع و کلی نرسیم.

متاسفانه اکثر بحثها و مطالبی که در فرومها یا منابع دیگر از جانب افراد مستقل مطرح میشن به شکل اصولی و تخصصی و علمی نیستن، و در این مورد هم هنوز بصورت صریح بیان نشده که اصلا هدف از این کارها جلوگیری از چه چیز یا چیزهایی بوده!! جلوگیری از چه نوع حمله هایی؟ در این ارتباط از آقای MMSHFE هم توضیح بیشتر و مشخص کردن صریح رو خواستم (همچنین نمونه کدها و دیتای مورد تست ایشون رو)، اما متاسفانه ظاهرا ایشون مایل به پیگیری بیشتر این قضیه نبودن.
و البته واقعا این رفتار درست نیست، چون ایشون خودشون چیزی رو بصورت عمومی بعنوان یک راهکار امنیتی که از نظر ایشون اونقدری مطمئن هست که خودشون یا دیگران استفاده کنن مطرح کردن و بنده هم جز اینکه نظر و تحلیل خودم رو بگم کاری نکردم و چون این روش علاوه بر جالب بودن بعنوان یه مسئلهء امنیتی که همه ممکنه فکر کنن امنه و ازش استفاده کنن مطرح شده، خواستم روش تحقیق بیشتری درصورت امکان صورت بدم تا شاید تکلیف اطمینان و کلیت موجود در این روش بیشتر روشن شد. مسلما آدم در مسائل امنیتی نمیتونه همینطوری بصورت کاملا سطحی و کلی یک روشی رو تحلیل و استفاده کنی؛ چون خیلی موارد مشابه در تاریخ این علم بودن که براحتی و سرعت شکست خوردن و منجر به خسارت شدن؛ و البته شکست بعضی روشها هم سخت تره و زمان بیشتری میبره، اما بهرحال افرادی خواهند بود که این روشها رو شکست بدن و بعدش دیگه راه سوء استفاده و نفوذ برای همه باز میشه.

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

یه نمونهء کد برای این روش:

<?php

$img=imagecreatefromjpeg('test.jpg');
imagejpeg($img, 'safe.jpg');

?>
خب میبینید که اساس روش خیلی ساده و مختصر هست.
ما فایل آپلود شده رو که ممکنه حاوی کدهای PHP باشه با استفاده از توابع gd خونده و دوباره در یک فایل دیگه ذخیره میکنیم به این امید که اگر کدهای خطرناکی در تصویر آپلودی بوده، این کدها در فایل جدید که توسط توابع gd ایجاد شده حذف شده باشن.

اینکه چطور ممکنه دستورات PHP در یک فایل تصویر درج و اجرا بشن و یک نمونه از تست عملی این قضیه رو قبلا بررسی کرده بودیم که میتونید در تاپیک مربوطه (http://barnamenevis.org/showthread.php?301242-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%85%D8%AC%D8%AF%D8%AF%D8%8C-%DA%86%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D9%87%D8%AF%D8%B1-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%28%D8%A7%DA%AF%D8%B1-%D8%A2%D9%82%D8%A7%DB%8C-%DA%A9%D8%B1%D8%A7%D9%85%D8%AA%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%D9%84%D8%B7%D9%81%D8%A7-%D8%AC%D9%88%D8%A7%D8%A8-%D8%A8%D8%AF%D9%86%29&highlight=) مطالعه کنید تا بفهمید قضیه از چه قراره.
البته درج و اجرای دستورات PHP فقط به فایلهای تصویری منحصر نیست و این یه مسئلهء کلی درمورد هر نوع فایلی میتونه باشه و بنابراین خطر عمده و اصلی در ارتباط با سیستمهای آپلود مطرح هست که ممکنه انواع فایلهای مختلفی رو بنا به کاربرد خودشون بپذیرن.

idocsidocs
دوشنبه 14 شهریور 1390, 02:07 صبح
تا اونجاییکه من می دونم، سرور فایلها رو بر اساس پسوندشون اجرا می کنه. یعنی اگه پسوند تصویر باشه، به شکل تصویر و ...

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

برای این کار هم یا باید به تنظیمات آپاچی دسترسی داشت یا اینکه بتونیم فایل HTACCESS رو به سرور آپلود کنیم. یا اینکه فایل آپلود شده چند پسوند داشته باشه. تنها در این صورت هست که می شه کدهای مخرب رو توی فایل تصویر قرار داد.

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

این سرور هست که باید اجازه اجرای چنین فایلهایی رو بده.

توی خیلی از آموزشها دیدم که روی فایلهای تصویری تکیه می شه، آیا واقعا فایلهای تصویری بدون نیاز به تنظیمات سمت سرور هم می تونن به عنوان یه اسکریپت اجرا بشن؟ سایر فرمتهای فایل چطور؟ بنظرم پاسخ این سوال می تونه راه حل این تاپک باشه.

MMSHFE
دوشنبه 14 شهریور 1390, 13:39 عصر
با سلام، روشي كه من استفاده كردم تقريباً به همين شكل هست (منتها با يكسري افزودني هاي كنترلي) و البته توي بحث قبلي هم كه اشاره كردين، نوشتم كه الآن شهرستان هستم و به كدي كه نوشتم دسترسي ندارم ولي به محض برگشتن، براتون كد رو ميگذارم. موفق باشيد.

mahan19
دوشنبه 14 شهریور 1390, 20:19 عصر
ما وقتي فايل رو از كاربر ميگيريم پسوند فايل رو چك ميكنيم. سرور هم با توجه به پسوند فايل با اون فايل برخورد ميكنه،حالا ميشه مثلا فايلي با پسوند عكس اسكريپت اجرا كنه؟

A B C D
دوشنبه 14 شهریور 1390, 21:11 عصر
ما وقتي فايل رو از كاربر ميگيريم پسوند فايل رو چك ميكنيم. سرور هم با توجه به پسوند فايل با اون فايل برخورد ميكنه،حالا ميشه مثلا فايلي با پسوند عكس اسكريپت اجرا كنه؟
مگه تاپیکی رو که معرفی کردم (http://barnamenevis.org/showthread.php?301242-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%85%D8%AC%D8%AF%D8%AF%D8%8C-%DA%86%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D9%87%D8%AF%D8%B1-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%28%D8%A7%DA%AF%D8%B1-%D8%A2%D9%82%D8%A7%DB%8C-%DA%A9%D8%B1%D8%A7%D9%85%D8%AA%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%D9%84%D8%B7%D9%81%D8%A7-%D8%AC%D9%88%D8%A7%D8%A8-%D8%A8%D8%AF%D9%86%29&highlight=) ندیدید؟
در اونجا عملا تست و اثبات شده که اگر فایلی بیش از یک پسوند داشته باشه و در بین پسوندهاش پسوند php هم باشه بعنوان یه فایل PHP اجرا میشه، گرچه آخرین پسوندش مثلا jpg باشه؛ البته این به پیکربندی آپاچی در ارتباط با PHP هم بستگی داره که میتونه به دو شکل باشه، که این مسئله در یکی از اون شکلها رخ میده.

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

روشی که آقای MMSHFE مطرح کردن هم ظاهرا یه راه دیگه هست برای جلوگیری از همین مسئله منتها به شکل دیگری که فیلتر کردن یا شناسایی محتویات خطرناک در فایلهاست. و البته منتظر کد و مشخص کردن صریح هدف اون روش از ایشون میمونیم. چون هنوز ایشون بطور صریح مشخص نکردن اون روش برای جلوگیری از همین قضیه بوده یا خیر.

A B C D
دوشنبه 14 شهریور 1390, 22:03 عصر
درثانی فقط توابع GD نمی تونن توی این روش جلوی هکر رو بگیرن. چون هکر می تونه نت پد رو باز کنه، کدهاش رو بنویسه و بعد فایل رو با پسوند دلخواه خودش ذخیره کنه و بعد آپلود کنه.

خب البته منم فکر میکنم توابع GD نمیتونن برای این منظور مطمئن باشن. ولی اینطور هم که شما فکر میکنی ساده نیست. معلومه عملا تست نکردی! اگر همینطوری کدی رو با یک ادیتور یا هگزادیتور در فایل وارد کنی، خواهی دید که نمیتونه از توابع GD جان سالم بدر ببره (برای من خطای فرمت میده). ولی خب این مسئله ثابت نمیکنه که این یک روش واقعا امن هست، بلکه فقط نشون میده که شما نتونستی با یک روش بدوی و ساده و کورکورانه این کار رو بکنی. شاید یه کسی که متخصص کرک، مهندسی معکوس، و فرمت فایلها در سطح پایین هست بتونه کد PHP خودش رو طوری در تصویر درج کنه و بقیهء مشخصه های تصویر رو با اون مطابقت بده که از توابع GD و حتی بقیهء چکهای امنیتی جان سالم بدر ببره. حرف منم همینه که نمیشه به این سادگی امنیت این روش رو پذیرفت.

ضمنا جناب MMSHFE این روش رو تقریبا کلی کردن چون گفتن اگر تابع و کتابخانه های مربوطه، فایلی رو بخونن و باهاش مشکلی نداشته باشن به معنی این هست که اون فایل امن است. یعنی مثلا برای چک کردن امنیت یک فایل آپلودی میتونیم این روش رو علاوه بر فرمتهای مختلف تصویر با استفاده از کتابخانهء gd، درمورد فایلهای PDF با استفاده از کتابخانه و توابع PDF که PHP داره بکار ببریم.

اما این گزارهء کلی رو میشه به روش برهان خلف رد کرد.
و حتما همه میدونن برهان خلف چیه. برهان خلف در ریاضیات یعنی اگر حتی یک مورد برخلاف یک گزاره پیدا کنیم، اون گزاره رد میشه. گزارهء ما هم الان اینه که به این روش که فایل رو به کتابخانه و توابع هر فرمت خاصی بدیم و دوباره خروجی رو در فایل نهایی ذخیره کنیم، فایل نهایی امن خواهد بود (یا اگر مشکل داشته باشه در این مراحل بهرصورت با خطا مواجه میشه یا مثلا فایل خروجی خالی خواهد بود - خلاصه اینکه کد خطرناکی نمیتونه از این روش عبور کنه). البته میتونیم این گزاره رو محدودتر کنیم و بگیم این روش فقط روی فایلهای تصویر و PDF عمل میکنه. بهرصورت فرقی نمیکنه، اگر در محدودهء مورد نظر برای کاربرد این روش، حتی یک مورد خلافش رو پیدا بکنیم متوجه میشیم که استنباط و دلیل ما برای امنیت این روش چندان هم عمیق و دقیق و درست نبوده.

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

حرف منم همین بود که اگر ما کدی رو در یک تصویر درج کنیم، لزوما اینطور نیست که اون کد در فرمت و مشخصه های تصویر اختلالی بوجود بیاره که به این شکل این اشکال توسط توابع فرمت مربوطه قابل تشخیص یا غیرقابل دیکد باشه.
بطور معمول دیتای یه تصویر یه دیتای باینری هست و هر بایت اون محدودهء کامل کدهای باینری رو در بر میگیره که کدهای ASCII هم جزو اونا هستن. یعنی یک بایت که مثلا میزان رنگ قرمز یک پیکسل خاص رو مشخص میکنه، میتونه هرچیزی باشه، که شامل کد تمام کاراکترهای اسکی هم میشه. یعنی مثلا hello world میتونه بعنوان یک توالی از بایتها با مقادیر کاملا استاندارد برای پیکسل های یک تصویر درج بشه (البته مسلما چنین تصویری وقتی نمایش داده بشه شکل معناداری ازش درنمیاد).
اما اینکه ما بتونیم این کار رو درمورد هر فرمتی بکنیم یا نه، و اینکه چقدر سخته و نیاز به چقدر دانش تخصصی داره، مسئله ای هست که از پیش مشخص نیست. چون باید ما این کار رو طوری انجام بدیم که با فرمت الگوریتم های دیگری مثل الگوریتم های فشرده سازی که در فرمتهای تصویری پیشرفته بکار میرن هم سازگار باشه.
بهرحال بنده تونستم این کار رو درمورد یکی از فرمتهای خیلی ساده انجام بدم؛ خیلی راحت در یک زمان کوتاه و فقط با مطالعهء یک مقالهء ویکیپدیا درمورد اون فرمت. بنابراین چه بسا فردی که دانش و مهارت خوبی در کرک و مهندسی معکوس و فرمتها و الگوریتم های مورد استفاده داره بتونه برای فرمتهای پیچیده تر هم این کار رو بکنه.

البته من نمیگم لزوما این کار برای تمام فرمتها ممکنه، اما هیچکس نمیتونه همینطوری بگه ناممکنه، چون این مسئله جز با دانش و تحلیل و تست های کاملا تخصصی و سطح پایین، بصورت مطمئنی مشخص نمیشه. بنظر بنده برای هر فرمت خاص این یه امکان 50% هست که بشه این کار رو کرد یا نه. شاید بشه و شاید هم نشه. هیچ چیز دیگری نمیشه گفت. برای فهمیدنش نیاز به وقت و انرژی و دانش و مهارت لازم هست که شاید من و شما نداشته باشیم، اما حتما افراد دیگری دارن.



توی خیلی از آموزشها دیدم که روی فایلهای تصویری تکیه می شه، آیا واقعا فایلهای تصویری بدون نیاز به تنظیمات سمت سرور هم می تونن به عنوان یه اسکریپت اجرا بشن؟در سمت سرور تا جایی که میدونم خیر (سمت کلاینت و باگهای مرورگرها هم که مسئلهء دیگری هست که فکر نمیکنم منظور اون منابع یا شما این بوده باشه).
البته امنیت مسئله های عجیب زیاد داره. ولی اون منابعی که اطلاعات و توضیحات و مستندات اونها اینقدر ناقصه که نمیشه ازشون چیزی فهمید یا حتی پیگیری بیشتری کرد، اصولا منابعی غیراصولی هستن و چه بسا حتی کسی که اون مطلب رو داده خودش دانش و مهارت کافی در اون مسئله نداشته و همه چیز رو از پایه به خوبی درک نکرده (یا اینکه فردی بخیل بوده که بهرصورت بیشتر قصد خودنمایی داشته و از دادن دانش کامل/پایه به دیگران اجتناب کرده).
ضمنا خودت هم دقیقا مشخص نکردی منظورت از اینکه روی فایلهای تصویری تکیه میشه دقیقا چیه.

mahan19
دوشنبه 14 شهریور 1390, 22:29 عصر
مگه تاپیکی رو که معرفی کردم (http://barnamenevis.org/showthread.php?301242-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%85%D8%AC%D8%AF%D8%AF%D8%8C-%DA%86%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D9%87%D8%AF%D8%B1-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%28%D8%A7%DA%AF%D8%B1-%D8%A2%D9%82%D8%A7%DB%8C-%DA%A9%D8%B1%D8%A7%D9%85%D8%AA%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%D9%84%D8%B7%D9%81%D8%A7-%D8%AC%D9%88%D8%A7%D8%A8-%D8%A8%D8%AF%D9%86%29&highlight=) ندیدید؟
در اونجا عملا تست و اثبات شده که اگر فایلی بیش از یک پسوند داشته باشه و در بین پسوندهاش پسوند php هم باشه بعنوان یه فایل PHP اجرا میشه، گرچه آخرین پسوندش مثلا jpg باشه؛ البته این به پیکربندی آپاچی در ارتباط با PHP هم بستگی داره که میتونه به دو شکل باشه، که این مسئله در یکی از اون شکلها رخ میده.

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

روشی که آقای MMSHFE مطرح کردن هم ظاهرا یه راه دیگه هست برای جلوگیری از همین مسئله منتها به شکل دیگری که فیلتر کردن یا شناسایی محتویات خطرناک در فایلهاست. و البته منتظر کد و مشخص کردن صریح هدف اون روش از ایشون میمونیم. چون هنوز ایشون بطور صریح مشخص نکردن اون روش برای جلوگیری از همین قضیه بوده یا خیر.

حرفتون درسته،آخه من اون لينك رو توي يه صفحه ديگه باز كردم بعد از اينكه پاسخ دادم خوندمش، خيلي جالب بود.

idocsidocs
سه شنبه 15 شهریور 1390, 02:49 صبح
اون منابعی که اطلاعات و توضیحات و مستندات اونها اینقدر ناقصه که نمیشه ازشون چیزی فهمید یا حتی پیگیری بیشتری کرد
یکی از منابعی که دیدم می تونه همین تاپک باشه. البته اگه بتونیم این تاپک رو به عنوان منبع مد نظر بگیریم.

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

بحثی که از اینها مهم تره اینه که، اگه به کمک نت پد یه فایل با یک پسوند (پسوندی مثل txt jpg mp3) بسازیم، و کدهای مخرب خودمون رو توش درج کنیم و فایل رو آپلود کنیم (مطمئنن فایل اجازه آپلود می گیره، چون پسوندش جز لیست سفید هست)، آیا همچین فایلی که پسوندش php یا js نیست ولی شامل کدهای پی اچ پی یا جاوا اسکریپت هست، می تونه شبیه یه اسکریپت اجرا بشه؟ سوال اصلی من اینه.

A B C D
سه شنبه 15 شهریور 1390, 09:20 صبح
یکی از منابعی که دیدم می تونه همین تاپک باشه. البته اگه بتونیم این تاپک رو به عنوان منبع مد نظر بگیریم.
این تاپیک خودش داره در این ارتباط تحقیق میکنه و در مراحل ابتدایی هم هست. حکم و راه حل کلی و نهایی صادر نکرده. و اتفاقا دنبال جواب همین ابهام و سوالات شما هم هست (بعلاوهء چیزهای احتمالی دیگری).

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

ایشون گفتن:

البته برای اندازه تصاویر هم از imagesx و imagesy استفاده میکنم چون برخلاف getimagesize، اطلاعات رو از Header نمیخونن و از قسمت Data فایل، طول و عرض رو محاسبه میکنند. درنتیجه نمیشه با تغییر Header، اونها رو دور زد و باید واقعاً تصویری وجود داشته باشه تا اندازه واقعی اون بدست بیاد. نهایتاً اگه یکسری اطلاعات توی تصویر قرار گرفته باشه، اگه در قسمت Data باشه باعث میشه تصویر بهم بریزه و نفوذگر لو بره، درنتیجه طبیعتاً درقسمت Header فایل هست که اون هم با این روش نادیده گرفته میشه.
و بنده از اول هم گفتم این یه نتیجه گیری سطحی و بی پایه هست که فکر کنیم تزریق کد در یک فایل تصویر لزوما باعث بهم ریختن تصویر میشه (البته منظور درواقع بهم ریختن تصویر از نظر پردازش کتابخانه ها و توابع مربوطه هست، نه تصویری که کاربر واقعا میبینه).
مثالش رو هم بنده درست کردم! هرچند فایلی که بنده درست کردم یک مثال برای یک فرمت تصویری بسیار ساده است، اما میتونه به ما بینش بیشتری در این ارتباط بده و ثابت میکنه این استدلال اونقدرها هم مطمئن نیست و در یک حداقل، این نظریه کلیت نداره (ضمن اینکه برای موارد دیگه هم باید ثابت بشه، نه اینکه صرفا حدس بزنیم کسی نمیتونه این کار رو بکنه).
همون موقع هم به این مسئله اشاره کردم که دشوار بودن تزریق کد در فرمتهایی مثل JPG به شکلی که بتونه از توابع gd جان سالم ببره، گذشته از پیچیده تر بودن ساختار این فرمتها، بیشتر بخاطر استفادهء اونا از فشرده سازی است، که بنابراین برای وارد شدن به این وادی اساسا با مسائلی شبیه کرک و مهندسی معکوس کار داریم و باید دانش و مهارت و کار سطح پایین روی فرمتها داشته باشیم.


توی آموزشهایی که دیدم، می گن برای حفظ امنیت سیستم آپلود، باید تصاویر رو با توابع gd چک کرد. البته بعضی جاها مثل الان که مثال زدید، دیدم که فایلهای پی دی اف رو هم به کمک توابع مربوطه چک می کنن. ولی ندیدم کسی بیاد و بگه باید یه mp3 رو هم چک کنیم !
کدوم آموزش کجا؟
چک کردن هم داریم تا چک کردن. چطوری چک بکنی، چی رو چک بکنه.
درکل هم بله این روشها میتونن امنیت رو بالا ببرن، چون هر چک و روشی که بکار ببرید بالاخره جلوی یکسری افراد و حمله ها رو میگیره. مثلا دیگه یکی که سوادش رو نداره نمیتونه بیاد کد PHP رو طوری توی تصویر بذاره که از این روشها عبور کنه، اما اونی که سوادش رو داره ممکنه بتونه.
ولی حرف ما این نبود، و هدف من این نیست که بگم این روشها در هیچ موردی به هیچ دردی نمیخورن، فقط میخوام بگم لزوما روشهای شکست ناپذیری نیستن و نباید اینقدر نسبت به امنیت و کلی بودن اونها اطمینان داشت. و در ضمن وقتی روش مطمئن تری وجود داره باید از اون روش (هم) استفاده کرده. هرچی روش ساده تر باشه روشنتره و راحتتر میشه اثبات کرد که امنه.


آیا همچین فایلی که پسوندش php یا js نیست ولی شامل کدهای پی اچ پی یا جاوا اسکریپت هست، می تونه شبیه یه اسکریپت اجرا بشه؟
گفتم که تاجاییکه بنده میدونم خیر. در سمت سرور نمیتونه اجرا بشه. در سمت کلاینت هم اگر توش کد PHP یا جاوااسکریپت باشه خیر در مرورگر این کدها اجرا نمیشن.
اما بعضی مرورگرها، منجمله IE، بعضی باگهایی داشتن که میشه بوسیلهء درج کدهای خاصی در تصاویر از اونا سوء استفاده کرد؛ اما طبیعی بنظر میرسه که این کدها نباید در سمت سرور خطری داشته باشن.

ضمنا از کی تاحالا جاوااسکریپت در سمت سرور اجرا شده که میگی js؟

idocsidocs
سه شنبه 15 شهریور 1390, 12:48 عصر
کدوم آموزش کجا؟
چک کردن هم داریم تا چک کردن. چطوری چک بکنی، چی رو چک بکنه. یکی از آموزشها همین تاپک هست. لینک بقیه اموزشها رو هم ندارم که بدم.

من همیشه دیدم که که این روش (همین روشی که داریم روش بحث می کنیم) رو فقط برای فایلهای تصویری استفاده می کنن. چرا برای سایر فرمتهای فایل همچین روشی استفاده نمی شه یا حداقل من آموزشی ندیدم؟

ضمنا از کی تاحالا جاوااسکریپت در سمت سرور اجرا شده که میگی js؟
کد مخرب منظورم هست، جا وا اسکریپت هم می تونه کد مخرب باشه. البته روی سرور اجرا نمی شه.

A B C D
سه شنبه 15 شهریور 1390, 15:28 عصر
یکی از آموزشها همین تاپک هست. لینک بقیه اموزشها رو هم ندارم که بدم.اینجا آموزش خاصی ندادیم.
اینجا فقط داریم یه روش رو که کس دیگه مطرح کرده بررسی میکنیم و تازه بنده گفتم غیرمطمئن و غیرکلی است.
اینم که روی تصویر مثال میزنیم بخاطر ساده تر و عمومی تر بودنش هست و ضمنا اینکه کسی که این روش رو مطرح کرده اون رو اول و در اصل برای فرمتهای تصویر ذکر کرده.


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

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

idocsidocs
سه شنبه 15 شهریور 1390, 17:27 عصر
اینجا آموزش خاصی ندادیم.
اینجا فقط داریم یه روش رو که کس دیگه مطرح کرده بررسی میکنیم و تازه بنده گفتم غیرمطمئن و غیرکلی است.
اینم که روی تصویر مثال میزنیم بخاطر ساده تر و عمومی تر بودنش هست و ضمنا اینکه کسی که این روش رو مطرح کرده اون رو اول و در اصل برای فرمتهای تصویر ذکر کرده.

بنظرم این روش کلی هست و فقط به فرمتهای تصویری محدود نمیشه. اینکه درمورد فرمت تصویری بحث میشه و نمونه کد میبینید، احتمالا بخاطر ساده شدن مطلب و کار کردن روی متداول ترین فرمتهای ملموس و کم حجم هست.
وگرنه حرف شما در کل درسته و این قضیه محدود به نوع فایل خاصی نمیشه.

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

فرمتهای مختلفی هستن. آیا پی اچ پی برای انواع فایلها توابع آماده ارائه داده؟

A B C D
سه شنبه 15 شهریور 1390, 19:30 عصر
من حداقل به 50 پسوند اجازه آپلود شدن می دم.نه بابا!
کدوم پسوندها؟
فکر نمیکنم نیازی باشه ها.
اکثر سایتهای آپلود فقط تعداد محدودی فرمت خیلی متداول رو اجازه میدن و بقیه رو هم کاربرها میتونن بذارن توی فایل zip.

بنظر من این کار ریسک امنیتی رو زیاد بالا میبره در عین اینکه بنظر نمیرسه این کار هیچ ضرورتی داشته باشه.
پسوندها هم اینطور نیستن که هرکدام فقط برای یک فرمت و کاربرد مشخص بکار برن و استانداردی داشته باشن.
مثلا ممکنه یه سروری یا برنامهء سمت سروری امروز یا فردا باشه که معنای خاصی برای یکی از اون پسوندها قائل باشه.


فرمتهای مختلفی هستن. آیا پی اچ پی برای انواع فایلها توابع آماده ارائه داده؟ فکر نمیکنم.

A B C D
شنبه 26 شهریور 1390, 09:41 صبح
الآن شهرستان هستم و به كدي كه نوشتم دسترسي ندارم ولي به محض برگشتن، براتون كد رو ميگذارم. موفق باشيد.
هنوز برنگشتید؟

هادی2020
دوشنبه 17 بهمن 1390, 13:32 عصر
نمیشه گفت صد در صد اما فکر کنم از راه حل های گفته شده بهتره


$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['control_name_from_client']['tmp_name']);
finfo_close($finfo);

idocsidocs
دوشنبه 17 بهمن 1390, 15:19 عصر
نمیشه گفت صد در صد اما فکر کنم از راه حل های گفته شده بهتره
شما می تونید از آرایه فایل هم استفاده کنید و دیگه نیازی به این کد ندارید.

eshpilen
سه شنبه 23 خرداد 1391, 07:55 صبح
با سلام، روشي كه من استفاده كردم تقريباً به همين شكل هست (منتها با يكسري افزودني هاي كنترلي) و البته توي بحث قبلي هم كه اشاره كردين، نوشتم كه الآن شهرستان هستم و به كدي كه نوشتم دسترسي ندارم ولي به محض برگشتن، براتون كد رو ميگذارم. موفق باشيد.
مثل اینکه یادتون رفت.
اخیرا دوباره این بحث در جای دیگری پیش آمد و یاد این مورد افتادم.