انجمن OWASP، انجمن آنلاینی که مقالات، روشها، اسناد، ابزارها و فناوریهای آزاد زیادی در زمینهی امنیت وب منتشر میکند، هرساله لیستی از ده آسیبپذیری مهم وبسایتها که میتواند مورد استفادهی هکرها قرار بگیرد را منتشر میکند.
به گزارش گروه ترجمه گرداب، این لیست غالبا بر اساس بررسی نوعِ حملات هکری سال گذشته انجام میگیرد. این انجمن تقریبا معتبرترین انجمن در این زمینه است و معمولا یکی از مراجع اصلی برای کسب اطلاعات در زمینهی امنیت برنامههای تحت وب است.
یکی از آسیبپذیریهایی که از سال ۲۰۱۰ هر ساله در این لیست به چشم میخورد، Cross-site scripting یا XSS است. اگرچه مخفف Cross Site Scripting، CSS میباشد، اما با توجه به اینکه CSS به عنوان مخفف Cascading Style Sheets به کار برده میشود، از XSS برای مخفف Cross Site Scripting استفاده می شود.
البته این آسیبپذیری در سال ۲۰۲۱ جزئی از آسیبپذیری Injection یا تزریق که ردهی سوم آسیبپذیریها را در اختیار دارد، قرار گرفتهاست. در نوشتهی حاضر به این آسیبپذیری و نحوهی سوءاستفاده از آن توسط هکران میپردازیم.
عکس- مقایسهی آسیبپذیریهای سال ۲۰۱۷ و ۲۰۲۱
XSS یا Cross-site scripting در واقع یک حفرهی امنیتی در فضای وب است که مهاجم را قادر میسازد فعالیتهای کاربرانی را که از برنامههای تحت وب با امنیت پایین استفاده میکنند را به خطر بیاندازد، به این نحو که مهاجم با استفاده از این حفره میتواند سیاستها و قوانین اجرا شده برای تفکیک وبسایتها را دور بزند. مهاجم یا همان هکر با استفاده از این نقطه ضعف و حفره امنیتی، خود را به عنوان کاربر، کاربری که قربانی حمله شده است جا میزند و هر کاری که کاربر قادر به انجام آن است را تکرار میکند و به تمام اطلاعات کاربر دسترسی مییابد.
حال اگر کاربر قربانی شده به برنامهای دسترسیهای خاص و ویژهای داده باشد، ممکن است مهاجم با استفاده از دسترسیهای برنامه، کنترل تمام بخشهای کاربردی برنامه و دادهها را به دست بگیرد.
امنیت بر روی وب به مکانیزمهای مختلفی بستگی دارد که در همگی آنها به یک مفهوم کلیدی بنام "same origin policy" بر میخوریم. در علم کامپیوتر، same origin policy مفهوم مهمی در مدل امنیتی web application است. این سیاست به اسکریپتها این اجازه را میدهد تا در صورتی بتوانند اجرا شوند که منشاء آنها همان سایتی باشد که صفحه وب از آن لود شده است.
منظور از منشاء، ترکیبی از Schema، پورت و Host name است. تنها در این صورت است که اسکریپتها اجازه دسترسی به DOMهای دیگردر همان سایت بدون هیچگونه محدودیتی را خواهند داشت. گفتنی است که DOM، یک رابط برنامه نویسی برای سندهای XML و Html است. اکنون به بحث اصلیمان برگردیم. XSS از آسیبپذیریهای شناخته شده اپلیکیشنهای تحت وب، سرورهایشان و هرگونه سیستم مرتبطی که به آنها وصل است، سوء استفاده می کند.
با استفاده از یکی از موارد گفته شده، مهاجم میتواند محتوایی را که از طرف آن سایت بدست کاربر میرسد، با مقادیر آلوده پر کند. وقتی که چنین محتوای آلودهای به مرورگر سیستم کلاینت وارد شود، با فرض ان که از طرف سایتی مورد اعتماد دریافت شده است، در سایه دسترسی که سیستم به آن می دهد، به هدف خود نائل خواهد شد.
مهاجم از طریق پیدا کردن راهی برای تزریق اسکریپتهای آلوده به صفحات وب، میتواند نهایتا با دسترسی بالایی به اطلاعات حساس، کوکیهای موجود و اطلاعات مختلف دیگر که از طرف مرورگرکلاینت به نیابت از کاربر نگهداری میشود، دسترسی پیدا نماید. حمله Cross-Site Scripting در نتیجه حالت خاصی از Code injection (تزریق کد) صورت میپذیرد.
معمولا مهاجمانی که از Cross-Site Scripting استفاده میکنند، قادر به انجام رفتارهای زیر با قربانیان خود هستند:
• جعل هویت کاربر قربانی شده.
• انجام هر عملی که کاربر قادر به انجام آن است.
• مشاهده تمام اطلاعاتی که کاربر به آنها دسترسی دارد.
• ثبت اطلاعات احراز هویت و ورود کاربر.
• خدشه دار کردن اعتبار وبسایت.
• تزریق ویروس Trojan به وبسایت.
تاثیر اصلی XSS عموماً به ماهیت ساختاری برنامه، کاربرد برنامه، اطلاعات و وضعیت کاربر در معرض خطر بستگی دارد. برای مثال:
• در یک برنامه تبلیغاتی، که در آن همه کاربران ناشناس هستند و تمام اطلاعات عمومی هستند، تأثیر اغلب کم خواهد بود.
• در برنامههایی که اطلاعات حساس و مهمی مانند تراکنشهای بانکی، ایمیلها و سوابق بیمه را نگهداری میکنند، آسیب عموما بسیار جدی خواهد بود.
• اگر کاربر هدف از امتیازات دسترسی بالایی در برنامه برخوردار باشد، تأثیر آن عموماً مهم خواهد بود و به مهاجم اجازه میدهد کنترل کامل برنامه آسیب پذیر را بهدست گرفته و تمام کاربران و دادههای آنها را به خطر بیندازد.
روشهای مختلف حملات XSS:
به طور کلـی حمـلات XSS در سـه طبقـه اصلی دسته بندی شده اند: مداوم Persistent، غیر مداوم Non-persistent و حملات DOM- XSS Based. حملات مداوم و غیرمداوم جزو آسیبپذیریهای سمت سرور و حملات DOM مربوط به سمت کلاینت هستند.
حملهی Persistent XSS
این نوع از حملهی XSS به عنوان حملهی XSS ذخیرهشده شناخته شده است که معمولا میتوان آن را در آن دسته از برنامههای وبی که کاربران مجاز به انتقال اطلاعات از طریق ورودی HTML/Javascript هستند (مثلا در کادر متن جستجو)، یافت. این نوع حمله بر روی برنامه وب قربانی ذخیره میشود. در زیر سناریوی سوءاستفاده از آسیبپذیری در حملهی Persistent XSS توضیح داده شده است:
• مهاجم از فرمهای برنامه وب برای تزریق یک رشته جاوا اسکریپت مخرب در مخزن وبسایت استفاده میکند.
• مرورگر قربانی از وبسایتِ آسیب پذیر، یک صفحه وب را درخواست می کند.
• برنامه وب، رشته جاوا اسکریپت مخرب را به همراه پاسخ HTTP وب به مرورگر قربانی انتقال میدهد.
• مرورگر وب، کد جاوا اسکریپت مخرب را در پیام پاسخ HTTP اجرا میکند، و سرانجام اطلاعات کاربری قربانی را به وب سرور مهـاجم انتقال مییابد.
حمله Non-Persistent XSS
این نوع حمله XSS به عنوان حملهی Reflected XSS نیز شناخته میشود و اینگونه است که اسکریپت اضافهشده به صورت یک پیغام خطا از طریق نرمافزار وب قربانی بازگردانده میشود؛ بنابراین در این نوع حمله نیازی به ذخیره کد مخرب روی نرمافزار قربانی نیست. سناریوی این نوع حمله به صورت زیر است:
• در ابتدا مهاجم یک آدرس URL شامل کد مخرب جاوا اسکریپت میسازد و آن را به مرورگر انتقال میدهد.
• قربانی توسط درخواستی با آدرسی از برنامه وب آسیبپذیر فریب میخورد.
• برنامه وب آسیبپذیر کد مخرب جاوا اسکریپت را با آدرس در Response HTTP ترکیب میکند.
• مرورگر قربانی کد مخرب را با پیغام داخل Response HTTP اجرا میکند و به همراه پیام، اطلاعات قربانی شامل رمـز عبـور و ... به سرور مهاجم ارسال می کند.
حمله XSS مبتنی بر DOM
این روش جایگزینی برای دو روش قبلی میباشد. در این حالت کد مخرب تا زمانیکه کد خوشخیم برنامه وب آسیبپذیر اجرا شده باشد، اجرا نمیشود. مراحل اجرای این حمله به صورت زیر است:
• مهاجم آدرسی درست میکند و به همراه کد مخرب به مرورگر قربانی انتقال میدهد.
• قربانی توسط آدرسی که توسط مهاجم داخل درخواست قرارداده شده و از طرف برنامه وب آسیبپذیر ارسال شده فریب میخورد.
• برنامه وب آسیبپذیر درخواست را قبول میکند، هرچند که احتمال دارد در پاسخ کد مخرب وجود نداشته باشد.
• مرورگر وب، کد خوشخیم داخل پاسخ را اجرا میکند، در نتیجه کد جاوا اسکریپت مخرب داخل صفحه وب تزریق میشود. سپس مرورگـر قربـانی کد مخرب را اجرا میکند و باعث انتقال اطلاعات قربانی شامل رمز عبور و ... به سرور مهاجم میشود.
نحوه پیشگیری از حمله XXS
جلوگیری از Cross-Site Scripting در برخی موارد آسان است، اما بسته به پیچیدگی برنامه و روشهای مدیریت دادههای قابل کنترل توسط کاربر، ممکن است بسیار دشوارتر باشد. به طور کلی، جلوگیری موثر از آسیب پذیری XSS شامل ترکیبی از اقدامات زیر است:
• فیلتر کردن ورودیها در هنگام ورود، فیلتر کردن میبایست در محلی که ورودیهای کاربر دریافت میشوند و بر اساس دادههایی که انتظارشان را دارد و یا اعتبار سنجی منبع ورودیها، تا حد ممکن دقیق انجام شود.
• رمزگذاری دادهها در خروجی، در نقطهای که دادههای قابل کنترل توسط کاربر در پاسخهای HTTP خارج میشوند، خروجی را رمزگذاری کنید. این امر ممکن است بسته به محتوای خروجی نیاز به رمزگذاری ترکیبی از HTML، URL، JavaScript و CSS را داشته باشد.
• از هدرهای (Headers) مناسب برای پاسخ استفاده کنید، برای جلوگیری از حملات XSS در پاسخهای HTTP که قرار نیست حاوی HTML و JavaScript باشند میتوانید جهت اطمینان از تفسیر پاسخهای HTTP توسط مرورگرها به روش مورد نظر شما از سرصفحههای Content-Type و X-Content-Type-Options استفاده کنید.
• سیاست امنیتی محتوا (CSP)، بهعنوان خط آخر دفائی شما میتوانید از Content Security Policy با هدف کاهش خطر حملاتی که همچنان وجود دارند، استفاده کنید.
___________________________________
منبع:
https://owasp.org/Top۱۰/
https://owasp.org/Top۱۰/assets/mapping.png
https://tosinso.com/b۵۷
https://www.wpexplorer.com/wp-content/uploads/wordpress-cross-site-scripting-guide-prevention.png
https://blog.detectify.com/۲۰۱۵/۱۲/۱۶/what-is-cross-site-scripting-and-how-can-you-fix-it/