این مساله تا به اینجا یک مزیت مهم را به همراه دارد: اگر شخصی مثلا فایل shell.aspx را در این پوشه ارسال کند، از طریق مرورگر قابل اجرا و دسترسی نخواهد بود و کسی نخواهد توانست به این طریق به سایت و سرور دسترسی پیدا کند.
برای ارائه این نوع فایلها به کاربر، معمولا از روش خواندن محتوای آنها و سپس flush این محتوا در مرورگر کاربر استفاده میشود. برای نمونه اگر به لینکهای سایت دقت کرده باشید مثلا لینکهای تصاویر آن به این شکل است:
File هم در اینجا کنترلر فایل است که نام فایل را دریافت کرده و سپس به کمک FilePathResult و return File آنرا به کاربر ارائه خواهد داد.
تا اینجا همه چیز طبیعی به نظر میرسد. اما ... مورد ذیل چطور؟!
لاگ خطاهای فوق مرتبط است به سعی و خطای شب گذشته یکی از دوستان جهت دریافت فایل web.config برنامه!
متدهای Server.MapPath یا متد return File و امثال آن تمامی به کاراکتر ویژه ~ (اشارهگر به ریشه سایت) به خوبی پاسخ میدهند. به عبارتی اگر این بررسی امنیتی انجام نشده باشد که کاربر چه مسیری را درخواست میکند، محتوای کامل فایل web.config برنامه به سادگی قابل دریافت خواهد بود (به علاوه هر آنچه که در سرور موجود است).
چطور میشود با این نوع حملات مقابله کرد؟
دو کار الزامی ذیل حتما باید انجام شوند:
الف) با استفاده از متد Path.GetFileName نام فایل را از کاربر دریافت کنید. به این ترتیب تمام زواید وارد شده حذف گردیده و فقط نام فایل به متدهای مرتبط ارسال میشود.
ب) بررسی کنید مسیری که قرار است به کاربر ارائه شود به کجا ختم شده. آیا به c:\windows اشاره میکند یا مثلا به c:\myapp\app_data ؟
اگر به لاگ فوق دقت کرده باشید تا چند سطح بالاتر از ریشه سایت هم جستجو شده.
نتیجه گیری:
اگر در برنامههای وب خود (فرقی نمیکند مرتبط به چه فناوری است)، نام فایلی را از کاربر جهت ارائه محتوایی به او دریافت و از این نام فایل بدون هیچ نوع بررسی خاصی، مستقیما در برنامه استفاده میکنید، برنامه شما به مشکل امنیتی Directory Traversal مبتلا است.
پ.ن.
1- این باگ امنیتی در سایت وجود داشت که توسط یکی از دوستان در روزهای اول آن گزارش شد؛ ضمن تشکر!
2- از این نوع اسکنها در لاگهای خطاهای سایت جاری زیاد است. برای مثال به دنبال فایلهایی مانند DynamicStyle.aspx و css.ashx یا theme.ashx میگردند. حدس من این است که در یکی از پرتالهای معروف یا افزونههای این نوع پرتالها فایلهای یاد شده دارای باگ فوق هستند. فایلهای ashx عموما برای flush یک فایل یا محتوا به درون مرورگر کاربر در برنامههای ASP.NET Web forms مورد استفاده قرار میگیرند.