PDA

View Full Version : سوال: ارسال مجدد، چک کردن هدر تصویر در سیستم آپلود فایل (اگر آقای کرامتی هستن لطفا جواب بدن)



idocsidocs
شنبه 29 مرداد 1390, 22:40 عصر
دوستان من مطلب زیر رو توی مقاله آقای کرامتی خوندم و دقیقا متوجه نشدم که منظور چی هست، لطفا بگید که منظور از این مطلب چیه و چطور می شه جلوش رو گرفت؟ یعنی می شه کاری کرد که کدهای داخل یه فایل تصویر اجرا بشن؟ ------- زماني كه فقط به تصاوير اجازه آپلود داده شود، توسعه دهندگان معمولا هدر تصوير را توسط تابع PHP (getimagesize) اعتبارسنجي مي كنند. با فراخواني اين تابع، اندازه تصوير برگردانده مي شود. اگر اعتبارسنجي تصوير، نامعتبر باشد به اين معني است: هدر نامعتبر است و تابع false برمي گرداند. بنابراين، توسعه دهنده مي تواند true يا false بودن را چك نموده و اعتبارسنجي فايل آپلود شده را با استفاده از اين اطلاعات انجام دهد. بنابراين، اگر كاربر مهاجم سعي كند يك فايل ساده php shell كه در يك فايل jpg تعبيه شده را آپلود نمايد، تابع false برگردانده و اجازه آپلود داده نمي شود ولي حتي از اين روش هم مي توان عبور كرد. با باز نمودن تصوير در يك اديتور تصوير مانند Gimp، بخش comment آن قابل ويرايش بوده، مي توان كد PHP در آن قرار داد. لذا تصوير داراي هدر معتبر بوده و مي تواند از چك تابع getimagesize عبور كند. وقتي درخواست گرفتن تصوير از مروگر وب داده شود، كد PHP اجرا مي شود.

eshpilen
شنبه 29 مرداد 1390, 22:55 عصر
یعنی می شه کاری کرد که کدهای داخل یه فایل تصویر اجرا بشن؟خب اگر فرض کنیم که تصویر آپلود شده با استفاده از ترفند پسوندهای چندگانه بعنوان فایل PHP اجرا میشه، بنابراین احتمالا انجین PHP دیتای تصویر رو بصورت دیتای خامی که باید به مرورگر ارسال بشه درنظر گرفته (دقیقا مثل حالتی که شما کدهای HTML رو خارج از بخش PHP مینویسید - یعنی خارج از <?php) و مثل هر دیتایی به مرورگر ارسال میکنه، بعد موقعی که به دیتای مربوط به بخش کامنت میرسه و تگ پردازشی PHP یعنی <?php رو میبینه شروع به تفسیر و اجرا دیتا تا جاییکه به تگ انتها یعنی ?> برسه میکنه. بنابراین دیتای بخش کامنت که یک بلاک کامل PHP بوده با موفقیت اجرا میشه.
البته این از نظر تئوریک بود تاجاییکه بنظر بنده میرسید. ممکنه در عمل مشکلاتی جلوی این رو بگیرن. و ضمنا باید شرایط دیگه برای این کار مهیا باشه؛ یعنی آپاچی طوری پیکربندی شده باشه که پسوندهای چندگانه رو در ارتباط با PHP درنظر بگیره و سیستم آپلود شما هم این ضعف رو داشته باشه؛ ضمنا فایلهای آپلودی باید در یک دایرکتوری در www واقع باشن و طرف بتونه لینک مستقیم به اونها رو پیدا کنه یا بصورت مستقیم درجایی مثل آواتار نمایش داده بشن.

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

binyaft
شنبه 29 مرداد 1390, 22:56 عصر
مفسر PHP فایلهایی رو پردازش میکنه که براش تعیین شده !
انتظار نداری که .jpg تو لیست فایلهای قابل پردازش باشه ؟

eshpilen
شنبه 29 مرداد 1390, 23:19 عصر
نه شما متوجه نشدی. این مربوط به مطلبی (http://keramatifar.ir/ShowTopic.php?id=45) میشه دربارهء امنیت فایلهای آپلودی که آقای کرامتی در سایتشون قرار دادن.
اول اون مطالب رو بخون، متوجه میشی.
البته بنده ممکنه در یه بخشی از توضیحات/فرضها اشتباه کرده باشم یا بصورت مبهم و ناقص توضیح داده باشم، ولی کلیت مطلب همینه.

http://keramatifar.ir/ShowTopic.php?id=45

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

این بنظرم بخش مربوط در مطالب ایشون هست:


اگر چه، در بعضي مواقع، اين روش آن طور كه انتظار مي رود عمل نمي كند. آپاچي براي اجراي كدهاي PHP به دو صورت پيكربندي مي شود: 1. استفاده از دستورالعمل AddHandler 2. استفاده از دستورالعمل Addtype. اگر دستورالعمل AddHandler استفاده شود، همه ي نام فايل هايي كه شامل پسوند .php (مانند .php، .php.jpg) هستند، به عنوان اسكريپت PHP اجرا خواهند شد. بنابراين اگر فايل پيكربندي آپاچي شامل خط زير باشد، آسيب پذير خواهد بود.
AddHandler php5-script .php
مهاجم مي تواند فايلي با نام filename.php.jpg آپلود نموده و با عبور از محافظت در نظر گرفته شده، قادر خواهد بود كد را اجرا نمايد.
6. چك كردن هدر تصوير
زماني كه فقط به تصاوير اجازه آپلود داده شود، توسعه دهندگان معمولا هدر تصوير را توسط تابع PHP (getimagesize) اعتبارسنجي مي كنند. با فراخواني اين تابع، اندازه تصوير برگردانده مي شود. اگر اعتبارسنجي تصوير، نامعتبر باشد به اين معني است: هدر نامعتبر است و تابع false برمي گرداند. بنابراين، توسعه دهنده مي تواند true يا false بودن را چك نموده و اعتبارسنجي فايل آپلود شده را با استفاده از اين اطلاعات انجام دهد. بنابراين، اگر كاربر مهاجم سعي كند يك فايل ساده php shell كه در يك فايل jpg تعبيه شده را آپلود نمايد، تابع false برگردانده و اجازه آپلود داده نمي شود ولي حتي از اين روش هم مي توان عبور كرد. با باز نمودن تصوير در يك اديتور تصوير مانند Gimp، بخش comment آن قابل ويرايش بوده، مي توان كد PHP در آن قرار داد. لذا تصوير داراي هدر معتبر بوده و مي تواند از چك تابع getimagesize عبور كند. وقتي درخواست گرفتن تصوير از مروگر وب داده شود، كد PHP اجرا مي شود.بنابراین شما فرض کن نفوذگر فایلی با نام test.php.jpg رو آپلود بکنه. فرض کن پیکربندی آپاچی اونطور بوده باشه که گفته شده و این فایل رو بخاطر وجود پسوند php درش بعنوان فایل PHP اجرا بکنه. ضمنا سیستم آپلود ما ضعیف بوده و وجود پسوندهای چندگانه رو چک نکرده و فقط آخرین پسوند رو چک کرده.
این مطلب داره میگه حتی اگر ما هدرها/محتویات فایل رو چک کنیم که واقعا از نوع تصویر باشه، بازم امکان حمله توسط رشته های موجود در بخش کامنت که متادیتای تصویر هست وجود داره.
البته شاید در جزییات نقص و کم دقتی وجود داشته باشه، اما کلیت مطلب شدنی بنظر میاد و بنده قبلا هم در رفرنس آپاچی چیزهایی دربارهء کاربرد پسوندهای چندگانه خونده بودم بنظرم!

ضمنا نمیدونم شاید فایلی با نام test.jpg.php.jpg هم به همین صورت در آپاچی کار بکنه. بنابراین به این روش میشه با احتمال بیشتری سیستم آپلود رو وادار به پذیرش فایل کرد، چون اگر برنامهء آپلود اولین پسوند رو هم درنظر بگیره اون رو یک فایل jpg فرض میکنه.
یه وقت هم ممکنه طرف اصلا پسوند رو چک نکنه و فقط از طریق هدرها و محتویات، نوع فایل رو تشخیص بده. ولی این سناریو خیلی کمتر محتمل هست. معمولا پسوند رو هم چک میکنن، اما کمتر کسی اطلاع از روش پسوندهای چندگانه داره و اغلب الگوریتم ها در این زمینه که برنامه نویسان عادی از خودشون طراحی میکنن بقدر کافی کامل و هوشمند نیستن و بنظرم بشه براحتی اینطور نامها رو ازشون عبور داد.

eshpilen
شنبه 29 مرداد 1390, 23:46 عصر
بنده همین الان این قضیه رو چک کردم. باید بگم ظاهرا مطلب آقای کرامتی کاملا درسته. یه فایل با نام test.jpg.php.jpg بعنوان PHP خیلی قشنگ اجرا شد!
این فایل محتوی یک تصویر بود که در مرورگر هم فقط تصویر نمایش داده میشه (درصورتیکه از طریق src یک تگ img اجرا بشه) ولی در پشت صحنه دستورات PHP ای که بنده صرفا با استفاده از Notepad++ به انتهای فایل اضافه کرده بودم اجرا شدن.
فایلش رو ضمیمهء این پست کردم.
البته اگر از تابع دقیقی برای چک کردن نوع فایل استفاده کنید و از وجود دیتای نامربوط در انتهای فایل ایراد بگیره، میتونید دیتای PHP رو در بخش کامنت درج کنید.

ضمنا دستور PHP ای که بنده برای تست استفاده کردم باعث ایجاد یک فایل با نام ttt میشه که روی ویندوز و لوکال راحت کار میکنه، اما اگر روی هاست تست میکنید باید پرمیشن ایجاد فایل در دایرکتوری محل ذخیرهء فایل وجود داشته باشه.

برای تنظیم آپاچی هم بنده این خط رو:

AddType application/x-httpd-php .phtml .pwml .php5 .php4 .php3 .php2 .php .inc
در فایل پیکربندی آپاچی (httpd.conf) غیرفعال کردم (comment out) و این دستور رو بجاش اضافه کردم:

AddHandler php5-script .php
بعد کافیه آپاچی رو ریستارت کنید و این آدرس رو وارد کنید:
http://localhost/test.jpg.php.jpg
البته اگر بخواید میتونید این آدرس رو در src یک تگ img قرار بدید تا مرورگر تصویر رو هم نمایش بده، وگرنه دل و رودهء دیتای تصویر همینطوری میریزه بیرون!
بعد چک کنید میبینید که فایلی با نام ttt در www شما ایجاد شد. یعنی دستورات PHP با موفقیت اجرا شدن.
به همین سادگی - به همین خوشمزگی :لبخند:

eshpilen
یک شنبه 30 مرداد 1390, 00:05 صبح
حالا راهکار جلوگیری چیه؟

بنظرم میتونیم بجز نقطهء آخر، بقیهء نقطه ها رو در نام فایل آپلودی با کاراکتر دیگری جایگزین کنیم یا کلا حذف کنیم.
فرضا test.jpg.php.jpg رو بکنیم test_jpg_php.jpg
بنظرتون خوبه؟

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

اگر راه بهتری بنظرتون میرسه بگید.

amin1softco
یک شنبه 30 مرداد 1390, 00:34 صبح
منم تستیدم :متعجب: جدی کار میده ولی چرا به صورت معمولی هیچ اتفاقی رخ نمی ده؟!
این هکرا هم با live http شل خودشون رو اجرا می کنند اولش محتویات سرایند فایل عکس رو می نویسند و ....................؟!؟!

idocsidocs
یک شنبه 30 مرداد 1390, 01:27 صبح
دوستان چرا بحث رو قاطی می کنید؟ برای پسوندهای چندگانه کافیه چک کنید که ببینید چند نقطه توی فایل آپلود شده هست و اگر بیش از یک نقطه وجود داشت اجازه آپلود ندید.

اینکه دیگه این همه بحث نداره !

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

می خوام بدونم این موضوع درسته یا نه و چطور می شه جلوش رو گرفت؟

eshpilen
یک شنبه 30 مرداد 1390, 08:43 صبح
منم تستیدم :متعجب: جدی کار میده ولی چرا به صورت معمولی هیچ اتفاقی رخ نمی ده؟!

به صورت معمولی یعنی چی دقیقا؟
و چه اتفاقی باید رخ بده؟


این هکرا هم با live http شل خودشون رو اجرا می کنند اولش محتویات سرایند فایل عکس رو می نویسند و ....................؟!؟!

بله؟!

eshpilen
یک شنبه 30 مرداد 1390, 08:46 صبح
بحث اصلی من این بود: فرض کنید یه فایل با اسم script.jpg داریم (همونطور که می بینید این فایل فقط یک پسوند داره). طبق گفته آقای کرامتی هکر می تونه با استفاده از ادیتور های تصاویر قسمت کامنت این تصاویر رو ویرایش کرد و کد مخرب توش بنویسه و به سرور آپلود کنه. بعد از آپلود هنگام اجرای این تصویر کدهای پی اچ پی هم اجرا می شن.
می خوام بدونم این موضوع درسته یا نه و چطور می شه جلوش رو گرفت؟

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

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

eshpilen
یک شنبه 30 مرداد 1390, 09:25 صبح
راستی تاپیک قبلیت چرا حذف شده؟

idocsidocs
یک شنبه 30 مرداد 1390, 10:31 صبح
راستی تاپیک قبلیت چرا حذف شده؟
توی اون بحث روی چند پسوندی بحث می شد.


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

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

حالا هکر یه فایل اسم script.jpgکه توش کدهای مخرب قرار گرفته رو آپلود کنه.

ایا در این صورت امکان هک شدن سرور به کمک کدهای تزریقی وجود داره؟

eshpilen
یک شنبه 30 مرداد 1390, 10:37 صبح
فرض کنید که سیستم آپلود خوب طراحی نشده و هکر یه فایل htaccess آپلود کرده به سرور. اگر توی فایل htaccess اجازه اجرای تصاویر به شکل اسکریپتهای پی اچ پی داده شده.

حالا هکر یه فایل اسم script.jpgکه توش کدهای مخرب قرار گرفته رو آپلود کنه.

ایا در این صورت امکان هک شدن سرور به کمک کدهای تزریقی وجود داره؟

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

idocsidocs
یک شنبه 30 مرداد 1390, 12:27 عصر
[QUOTE=eshpilen;1321888]چیزایی میگیا. اگر بشه در htaccess هم بشه این تنظیمات رو تعیین کرد میشه دیگه. چه فرقی میکنه؟ چه با استفاده از چند پسوندی و چه با استفاده از این روش، بهرحال فایل تحویل انجین PHP و در نتیجه اجرا میشه و هر بلاک PHP توش باشه اجرا میشه.[QUOTE] /> پس توی این روش یا باید فایل چند پسونده باشه یا دستور اجرای تصاویر رو از توی htaccess بدیم. من فکر می کردم که بدون این دو نکته می شه از این روش استفاده کرد.

رضا قربانی
سه شنبه 01 شهریور 1390, 12:23 عصر
راستی تاپیک قبلیت چرا حذف شده؟
برای اینکه این دوستمون وقتی جوابشون رو می گیرن سریع تاپیک رو پاک می کنن و نمی ذارم بچه های دیگه ازش استفاده کنن و یاد بگیرن و به خاطر همینه که سوال هایی که می پرسه جواب کمی می گیره.
موفق باشی دوست من

idocsidocs
سه شنبه 01 شهریور 1390, 20:10 عصر
برای اینکه این دوستمون وقتی جوابشون رو می گیرن سریع تاپیک رو پاک می کنن و نمی ذارم بچه های دیگه ازش استفاده کنن و یاد بگیرن و به خاطر همینه که سوال هایی که می پرسه جواب کمی می گیره.
موفق باشی دوست من
عجب گیری افتادم با شما !

دوست عزیز اون بحث پاک شد ولی این بحث رو مجددا ایجاد کردم.

دلیلش هم این بود که دوستان به اشتباه دارن روی فایلهای چند پسونده بحث می کنن در صورتیکه بحث من چیز دیگه ای بود.
این لینک رو ببینید (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&p=1321720&viewfull=1#post1321720) متوجه می شید که منظور من از ایجاد این تاپک فایلهای چند پسونده نبود چون با یه preg_match ساده می شه این نوع خطر رو دفع کرد.