هر وب سایتی که به کاربران اجازه می دهد فایل های خود را آپلود کنند ممکن است مورد حمله هکرها قرار گیرد. خوشبختانه، کارهایی وجود دارد که می توانید برای ایمن سازی سایت خود انجام دهید.
ماژول های آپلود فایل یکی از ضعیف ترین لینک ها در برنامه های تحت وب هستند. هر گونه اشتباهی، حتی اشتباهاتی که شما آنها را کوچک می دانید، می تواند منجر به افتادن مستقیم کنترل سرور به دست مهاجمان سایبری شود. به همین دلیل، توسعه دهندگان نرم افزار باید رایج ترین اشتباهات و برخی روش های حمله ای را که ممکن است رخ دهد، بدانند.
بنابراین دستکاری سمت مشتری چیست؟ چگونه می توانید با این امر مبارزه کنید تا سایت های خود و کاربران خود را ایمن نگه دارید؟
دستکاری سمت مشتری چیست؟
دستکاری سمت مشتری مفهوم اصلی حملات برنامه های وب به عنوان یک کل است. به عبارت ساده، به این معنی است که دیگر نمی توانید به هیچ یک از داده هایی که برای کاربر ارسال می کنید اعتماد کنید. علاوه بر این، دستکاری سمت مشتری یکی از پایه های توسعه برنامه های کاربردی امن است. اگر ماژول آپلود فایلی که با آن سروکار دارید را بررسی کنید و دستکاری سمت مشتری را در نظر بگیرید، داده هایی که نمی توانید به آنها اعتماد کنید شامل موارد زیر است:
- نام فایل آپلود شده
- نوع محتوا فایل آپلود شده
این دو مورد جایی است که شما این فرصت را دارید که به عنوان یک توسعه دهنده نرم افزار در لیست سفید قرار بگیرید. داده های نام فایل آپلود شده می تواند حاوی هر چیزی با دستکاری سمت مشتری باشد. با داده های Content-Type فایل آپلود شده، حتی اگر مهاجم در حال آپلود یک فایل exe. باشد، این فایل ممکن است به صورت یک تصویر/jpeg در سیستم ظاهر شود.
پسوند فایل و لیست سفید
در حین توسعه ماژول های آپلود فایل، اولین کاری که باید انجام دهید فرآیند لیست سفید برای پسوند فایل است. به عنوان مثال، کاربر می خواهد فایلی به نام “muo.jpeg” را آپلود کند. باید مطمئن شوید که پسوند فایلی که کاربر می خواهد آپلود کند .jpeg باشد. برای این کار، سیستم باید فایل آپلود شده را بررسی کند و ببیند آیا یکی از پسوندهای مجاز فایل است یا خیر. برای درک اینکه چگونه می توانید این کار را انجام دهید، کد PHP ساده زیر را بررسی کنید:
$file_parts = pathinfo($filename);
switch($file_parts['extension'])
{
case "jpg":
break;
case "bat": // Or exe, dll, so, etc.
break;
case "":
case NULL: // No file extension
break;
}
شما می توانید این کار را با یک بلوک کد مشابه با بلوک بالا انجام دهید، یا می توانید از کلاس ها و توابع ارائه شده توسط فریمورک مورد استفاده خود استفاده کنید.
مراقب باشید که با تجزیه نام فایل بر اساس کاراکتر نقطه (.) داده های پسوند فایل ایجاد نکنید، زیرا مهاجم می تواند این مرحله بررسی را با نام فایلی مانند “muo.jpeg.php” دور بزند.
اطلاعات نوع محتوا چیست؟
اطلاعات نوع محتوا بخشی از اطلاعات است که در درخواست HTTP برای هر بارگذاری فایل ارسال می شود. مرورگر اینترنت این اطلاعات را شناسایی کرده و به درخواست ارسال شده اضافه می کند. مهاجم می تواند سعی کند اطلاعات را با دستکاری سمت کلاینت تغییر دهد و اعتبارسنجی سمت سرور را دور بزند. در این مرحله، توسعهدهندگان به یک مکانیسم کنترلی برای اعتبارسنجی اطلاعات Content-Type نیاز دارند. این به تنهایی کافی نخواهد بود. هنوز، این یک موضوع مهم برای توسعه دهندگان است که باید به آن توجه کنند.
فرض کنید مکانیزمی را برای بررسی صحیح پسوند فایل کدگذاری می کنید و فقط فایل هایی با پسوند jpeg. می پذیرید. علاوه بر این مکانیسم احتیاطی، میتوانید اطلاعات نوع محتوا را در هر صورت بررسی کنید و فقط فایلهایی را با اطلاعات تصویر/jpeg بپذیرید، سطح حفاظتی اضافی در برابر حملات سایبری.
فایل های فلش SWF و مراحل حمله
پسوند فایل و دادههای Content-Type برای مرورگرهای اینترنتی که از افزونههایی مانند Adobe Flash Player پشتیبانی میکنند، معنی ندارد. اگرچه پشتیبانی از آن پخشکننده دیگر در دسترس نیست، اما همچنان میتوان آن فایلهای مرتبط را در بسیاری از سیستمها نصب کرد، حتی اگر Flash همچنان یک خطر امنیتی است. در سیستمی که اقدامات احتیاطی مربوطه را انجام نداده است، می توان یک فایل فلش را با تگ
به منظور اقدام، توسعه دهندگان باید مسیرهایی را که مجرمان سایبری می توانند طی کنند، بدانند. در اینجا نحوه وقوع آن آمده است:
- مهاجم مخرب یک SWF (فرمت فایل Adobe Flash) به نام “image.jpeg” را در وب سایت مورد نظر آپلود می کند. در طی فرآیند آپلود، در تأیید لیست سفید تأیید می شود که فایل آپلود شده توسط مهاجم دارای پسوند jpeg. است. تأیید نوع محتوا با دستکاری سمت مشتری دور میشود. تصور کنید این فایل که توسط عامل تهدید آپلود شده است به «www(dot)target-site(dot)com/images/images.jpeg» می رود.
- فرض کنید مهاجم یک وب سایت به نام مهاجم (نقطه) کام دارد. مهاجم با استفاده از تگ
- یک کاربر بی گناه وارد هکر(نقطه) کام می شود. آن سایت فایل SWF را در www(dot)target-site(dot)com/images/image.jpeg فراخوانی می کند و دستورات داده شده به SWF را اجرا می کند.
- از این طریق، مهاجم سایبری می تواند اقدامات درخواست HTTP را برای آدرس سایت (dot)com هدف بدون توجه کاربران عادی ایجاد کند. با این درخواستها، مهاجم از جلسه کاربر بیگناه استفاده میکند و چک CSRF را دور میزند.
برای درک واضح تر این سناریوی حمله، کد زیر را در محتوای HTML
style="height:1px;width:1px;" data="www.target-site.com/images/image.jpeg" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="c=read&u=somethings"
یکی از بهترین راه حل ها دسترسی به فایل های آپلود شده با آپلود فایل از طریق یک زیر دامنه متفاوت است. در سناریوی فوق، می توانید به فایل های استاتیک نه از یک دامنه، بلکه از یک زیر دامنه متفاوت به صورت زیر دسترسی داشته باشید: “http(colon)//file.target-site(dot)com/images/image.jpeg”.
راه حل دیگر اضافه کردن Content-Disposition: اطلاعات پیوست به پاسخ HTTP زمانی است که درخواست دسترسی به فایل هایی را که می خواهید آپلود کنید دریافت می کنید.
اقدامات احتیاطی را برای آسیب پذیری های آپلود فایل انجام دهید
هر گونه آپلود فایلی که کاربران می توانند در یک وب سایت ایجاد کنند خطرناک است، بنابراین این یکی از مسائلی است که توسعه دهندگان باید بیشترین توجه را به آن داشته باشند. اگر مهاجمان چنین آسیب پذیری را کشف کنند، می توانند پوسته ای را در سایت باز کنند و به راحتی از اطلاعات روی سرور سوء استفاده کنند. کنترل همه فایلهای آپلود شده توسط کاربران، اعمال روشهای لیست سفید و پنهان کردن مکان دایرکتوری آپلود شده در صورت امکان بسیار مهم است.
و البته، اقدامات اضافی دیگری نیز وجود دارد که باید برای محافظت از سایت خود انجام دهید، حتی اگر تمام اقدامات احتیاطی توصیه شده را برای آپلود ماژول های فایل انجام دهید. استفاده از هدرهای امنیتی HTTP یکی از این اقدامات است که می توانید بردارید.