eshpilen
چهارشنبه 14 تیر 1391, 18:21 عصر
قبلا در تاپیک دیگری (http://forum.iranphp.org/Thread-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D9%86%D8%A7%D9%85%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7%DB%8C-%D8%B9%DA%A9%D8%B3-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%DB%8C%D8%AA) درمورد اینکه آیا باید نسبت به محتویات فایلهای آپلودی، و نه تنها پسوند اونها، حساس بود بحث کرده بودیم و کسی نمونه و دلیلی براش ارائه نداده بود.
این چند روزه مطالبی رو مطالعه کردم که به این موضوع ربط دارن.
قضیه از این قرار است که بازهم IE، این مرورگر معروف به دردسرسازی و ناامنی در طول تاریخ، یک ویژگی خاصی داره که باعث ایجاد حفرهء امنیتی میشه.
البته این مشکل در نسخه های قدیمی مثل IE6 وجود داشته و کشف شده، اما با توجه به تستهای بنده، ظاهرا هنوز حتی روی IE7 و IE8 هم ولو به شکل محدودتر این مشکل وجود داره.
بنده چون IE8 داشتم فقط تونستم روی نسخهء 8 تست کنم. یکسری حالات ممکنه روی نسخهء 8 امن باشن ولی روی نسخهء 6 یا 7 امن نباشن. هرکس داره میتونه تست کنه و نتیجه رو بگه.
مثال - یک فایل php یا txt در www ایجاد کنید و این کد رو توش بذارید:
<?php header('Content-Type: text/plain'); ?>
<html>
<body>
<script>alert('XSS');</script>
</body>
</html>
بعد اون رو در IE باز کنید.
مشاهده میکنید که کد جاوااسکریپت ما اجرا میشه.
چون IE محتویات فایل رو بعنوان HTML شناسایی و اجرا میکنه، حتی با وجود اینکه ما با هدر Content-Type: text/plain بهش گفتیم که باید محتویات پاسخ رو بعنوان متن ساده درنظر بگیره.
چرا IE این کار رو میکنه؟
چیزهایی در منابع گفته شده بود که ظاهرا این قضیه به آپاچی هم ارتباط داره و تاریخچه ای هست. ظاهرا آپاچی بصورت پیشفرض کانفیگ درستی نداشته و بنابراین زیاد پیش میامده که نوع فایل با هدرهای ارسال شده تطابق نداشته. بعد IE اومده خواسته هوشمندبازی دربیاره و بجای اینکه خطا بده یا محتویات رو خراب نمایش بده، خودش نوع دیتا رو از روی محتویاتش تشخیص بده و اونها رو بر اساس تشخیص/حدس خودش تفسیر و اجرا کنه؛ احتمالا بخاطر اینکه یوزرفرندلی تر باشه.
البته خوشبختانه این جریان فعلا فقط روی فایلهای txt اینطور خطرناک عمل میکنه. چون بنده هدر کد مثال بالا رو image/jpg گذاشتم یا از پسوند jpg استفاده کردم، که در هر دو حالت کد جاوااسکریپت اجرا نشد. ولی شاید مثلا روی IE6 یا IE7 اجرا بشه (هرکس IE6 یا 7 داره میتونه تست کنه و نتیجه رو بگه).
البته فکر میکنم در بیشتر سیستمهای آپلود پسوند txt جزو پسوندهای مجاز نیست. بنابراین شاید مشکل جدی ای وجود نداشته باشه و اصلا نیازی به چک کردن محتویات فایل نباشه. ولی بازم مطمئن نیستم و برای اطمینان احتمالا باید بیشتر فکر و تحقیق و تست کنیم. IE6 هم که الان دیگه رسما منسوخ شده تلقی میشه، ولی از طرف دیگه هنوز عده ای از کاربران ازش استفاده میکنن (بخصوص با توجه به اینکه با ویندوز XP نصب میشه).
حالا من الان خسته هستم و همین تست و مطالب رو هم به زور تونستم تموم کنم که الان بفرستم. بعدا میتونیم بیشتر روش بررسی کنیم.
ضمنا این یک حمله به کلاینت بود با استفاده از باگ مرورگر. فکر میکنم در بحثهای قبلی بیشتر متوجه خطر این فایلها در سمت سرور بودیم تا کلاینت.
این چند روزه مطالبی رو مطالعه کردم که به این موضوع ربط دارن.
قضیه از این قرار است که بازهم IE، این مرورگر معروف به دردسرسازی و ناامنی در طول تاریخ، یک ویژگی خاصی داره که باعث ایجاد حفرهء امنیتی میشه.
البته این مشکل در نسخه های قدیمی مثل IE6 وجود داشته و کشف شده، اما با توجه به تستهای بنده، ظاهرا هنوز حتی روی IE7 و IE8 هم ولو به شکل محدودتر این مشکل وجود داره.
بنده چون IE8 داشتم فقط تونستم روی نسخهء 8 تست کنم. یکسری حالات ممکنه روی نسخهء 8 امن باشن ولی روی نسخهء 6 یا 7 امن نباشن. هرکس داره میتونه تست کنه و نتیجه رو بگه.
مثال - یک فایل php یا txt در www ایجاد کنید و این کد رو توش بذارید:
<?php header('Content-Type: text/plain'); ?>
<html>
<body>
<script>alert('XSS');</script>
</body>
</html>
بعد اون رو در IE باز کنید.
مشاهده میکنید که کد جاوااسکریپت ما اجرا میشه.
چون IE محتویات فایل رو بعنوان HTML شناسایی و اجرا میکنه، حتی با وجود اینکه ما با هدر Content-Type: text/plain بهش گفتیم که باید محتویات پاسخ رو بعنوان متن ساده درنظر بگیره.
چرا IE این کار رو میکنه؟
چیزهایی در منابع گفته شده بود که ظاهرا این قضیه به آپاچی هم ارتباط داره و تاریخچه ای هست. ظاهرا آپاچی بصورت پیشفرض کانفیگ درستی نداشته و بنابراین زیاد پیش میامده که نوع فایل با هدرهای ارسال شده تطابق نداشته. بعد IE اومده خواسته هوشمندبازی دربیاره و بجای اینکه خطا بده یا محتویات رو خراب نمایش بده، خودش نوع دیتا رو از روی محتویاتش تشخیص بده و اونها رو بر اساس تشخیص/حدس خودش تفسیر و اجرا کنه؛ احتمالا بخاطر اینکه یوزرفرندلی تر باشه.
البته خوشبختانه این جریان فعلا فقط روی فایلهای txt اینطور خطرناک عمل میکنه. چون بنده هدر کد مثال بالا رو image/jpg گذاشتم یا از پسوند jpg استفاده کردم، که در هر دو حالت کد جاوااسکریپت اجرا نشد. ولی شاید مثلا روی IE6 یا IE7 اجرا بشه (هرکس IE6 یا 7 داره میتونه تست کنه و نتیجه رو بگه).
البته فکر میکنم در بیشتر سیستمهای آپلود پسوند txt جزو پسوندهای مجاز نیست. بنابراین شاید مشکل جدی ای وجود نداشته باشه و اصلا نیازی به چک کردن محتویات فایل نباشه. ولی بازم مطمئن نیستم و برای اطمینان احتمالا باید بیشتر فکر و تحقیق و تست کنیم. IE6 هم که الان دیگه رسما منسوخ شده تلقی میشه، ولی از طرف دیگه هنوز عده ای از کاربران ازش استفاده میکنن (بخصوص با توجه به اینکه با ویندوز XP نصب میشه).
حالا من الان خسته هستم و همین تست و مطالب رو هم به زور تونستم تموم کنم که الان بفرستم. بعدا میتونیم بیشتر روش بررسی کنیم.
ضمنا این یک حمله به کلاینت بود با استفاده از باگ مرورگر. فکر میکنم در بحثهای قبلی بیشتر متوجه خطر این فایلها در سمت سرور بودیم تا کلاینت.