آسیب پذیری XSS چیست؟ راه های مقابله با باگ XSS

باگ XSS یا Cross Site Scripting از رایج ترین آسیب پذیری های سطح وب است که در این حملات هکر و نفوذگر، کاربران یک وبسایت را با تزریق کد های جاوااسکریپ مورد هدف قرار میدهند.این آسیب پذیری در صورتی به وجود می آید که برنامه نویس یک وبسایت، ورودی هایی که از کاربرانخودش میگیرد را کنترل نکند و این اجازه را به کاربران بدهد تا هر کارکتر و هر ورودی که بخواهند واردکنند، برای مثال برای فیلد ورود نام و نام خانوادگی فیلتری در نظر نمیگیرند و هکر از این ضعف امنیتی استفاده میکند تا حملات XSS را روی آن وبسایت پیاده سازی کند.هکر میتواند از این آسیب پذیری استفاده های زیادی کند، برای مثال یک تروجان روی وبسایت ایجاد کند و یا سشن ها و کوکی های کاربران دیگر را به سرقت ببرد! و این کار هم به سادگی انجام میگیرد، چون کاربران به یک وبسایت اعتماد دارند، ولی نمیداند در پشت پرده یک سری کد هایی تزریق شده که در حال سرقت کوکی آنها هست.که همینطور که مشخص شد این حمله از خطرناک ترین حمله ها هم هست و برای شرکت های بزرگ که اعتبار زیادی دارند یک نوع تهدید بزرگ به شمار میاد.با توجه به ورودی های زیادی که بیشتر وبسایت ها از کاربران خودشون دریافت میکنن، میتونیم به این نتیجه برسیم که XSS تقریبا همه جا هست! فقط باید با توجه به آشنایی که با این آسیب پذیری داریم سعی کنیم در فیلد های ورودی وبسایت ها تست نفوذ انجام دهیم و اون هارو پیدا کنیم.Cross site Scriptingحملات XSS چگونه انجام میشوند؟فرض کنید وبسایت از شما نامتان را دریافت میکند و بعد به صورت یک پیام در صفحه به شما (اسم شما) خوش آمد میگوید. و متوجه میشویم که هرچه به صورت ورودی داده ایم را در خروجی چاپ کرده است و کنترلی روش نداشته است و همینطور کدی که برای بک اند نوشته به این صورت است:کد PHP که در بک اند وبسایت برای نمایش اسم در صفحه نوشته شده استو متغیر inputName اسمی که وارد کردیم از فیلد ورودی نام را در خودش دارد و خروجی را در صفحه به این شکل نشان میدهد:خروجی کد بالا که در صفحه به کاربر نمایش داده میشوددر نتیجه این کد که HTML است به مرورگر کاربر داده میشود و در صفحه نتیجه را نشان میدهد.این کد خروجی کد PHP هست که به صورت HTML در صفحه نمایش میدهدو حالا هکر با بررسی هایی که انجام داده میخواهد تست انجام بدهد که آیا این فیلد ورودی و این صفحه آسیب پذیری XSS دارد یا نه؟!برای این کار یک قطعه کد جاوااسکریپی را در آن فیلد وردی وارد میکند تا مطمئن شود که این صفحه آسیب پذیر است و معمولا هکر ها برای این کار از این قطعه کد استفاده میکنند:این کد یک هشدار در صفحه را نمایش میدهد این کد برای دادن هشدار هست و مقداری که در داخلش نوشته باشد را به عنوان پیامی در بالای صفحه به کاربر نشان میدهد، و وقتی این مقدار را در فیلد ورودی بنویسیم کد PHP به این تغییر میکند:کد جاوااسکریپت ما که با کد پی اچ پی ترکیب شده استو این کد در HTML و مرورگر کاربر به این شکل نشان داده میشود:خروجی کد PHP که در صفحه نمایش داده میشودو در نهایت وقتی که پیامی که در بالا مشخص کردیم را در غالب یک مسیج باکس دیدیم، متوجه میشویم که تونستیم کد های جاوااسکریپتی را اجرا کنیم و کد های ما به درستی اجرا شده اند، مثل این تصویر:خروجی کد جاوا اسکریپت که از طریق ورودی نام وارد کردیم و در صفحه به درستی اجرا شده استاین فقط یک مثال ساده از این آسیب پذیری بود، در ادامه با استفاده از محیط آزمایشگاهی این آسیب پذیری را شبیه سازی میکنم تا این آسیب پذیری را در دنیای واقعی بیشتر درک کنید.Reflected XssXSS Reflectedاین مثال XSS از نوع Reflected را با این سناریو پیش میریم که فرض کنید یک وبسایت در قسمت سرچ محصولات و یا هر چیزی، هر فیلدی که سرچ میشود را در URL نشان میدهد :https:// website.com/search?term=giftو همینطور مواردی که از نتیجه سرچ بدست آمده را در صفحه با این عنوان نمایش میدهد:<p>You searched for: gift</p>و حالا ما متوجه شدیم که فیلتری برای ورودی هایی که در قسمت سرچ میگیرد ندارد و هرچیزی که بنویسیم را در کد ها چاپ میکند و باید کد های جاوااسکریپت را وارد کنیم و تست کنیم:https:// website.com/search?term=alert(1)و کد جاوا اسکریپتی ما اگر اجرا شود متوجه میشویم که صفحه آسیب پذیری را دارد.حالا همین سناریو را در یک محیط آزمایشگاهی شبیه سازی و پیاده سازی میکنیم.وبسایت زیر یک بخش سرچ دارد که در مطالبی که در این بلاگ منتشر شده است کلید واژه ای که وارد کنیم را سرچ میکند.صفحه اصلی یک وبلاگ که در بالای صفحه قسمت سرچ وجود داردوقتی که من کلمه hi را سرچ کردم، هم در URL و هم در صفحه این عبارت را نشاند میدهد:خروجی به دست آمده از کلمه hiو همینطور در سورس کد هم عبارتی که سرچ کردم قابل مشاهده است:در سورس صفحه هم کلمه ای که سرچ کردیم را نمایش میدهدالان باید با دستورات جاوااسکریپتی سعی کنم که مطمئن بشم اسکریپت های من اجرا میشوند، من دستور زیر را در فیلد سرچ وارد میکنم:alert(&quotHacked By MHN&quot)عبارتی که سرچ کردم شامل کد های جاوااسکریپتی بود و در URL اینطور نمایش درآمد:آدرس اینترنتی زمانی که ما کد و یا چیزی را سرچ کردیمو همینطور کد اسکریپتی من در سورس کد این صفحه اضافه شد و به صورت یک قطعه کد جاوااسکریپتی ران شد و درصفحه یک مسیج باک با عنوانی که وارد کردم به نمایش درآمد:کد ما اجرا شده و در صفحه یک مسیج باکس را میتونیم ببینیمکد ما در سورس سایت به صورت کد های جاوا اسکریپ اجرا شده استXSS Storedدر این سناریو که قراره نوع دوم این آسیب پذیری یعنی XSSاز نوع Storedرو پیاده سازی کنیم، رویهمان بلاگ ولی این بار در قسمت کامنت های یک پست از این وبسایت.XSS Stored زمانی اتفاق میوفتد که یک فیلد وقتی ورودی را دریافت میکند آن را در صفحه نمایش میدهد و اگر این ورودی هارا نتواند کنترل کند و ما بتوانیم کد های جاوااسکریپتی خودمان را وارد کنیم، کد ما در آن بخش ذخیره خواهد شد وهمیشه ماندگار میماند برای مثال بخش کامنت یک وبسایت که وقتی ما کدی آنجا تزریق کنیم در آن بخش میماند و هرکسی که وارد آن صفحه شود کد ما روی مرورگر آن اجرا میشود و میتواند خیلی خطرناک باشد.وارد یک پست از این بلاگ میشوم و با اسکرول کردن قسمت کامنت گذاری در این صفحه را پیدا:بخش کامنت در وبسایتو باید کد های جاوااسکریپتی خودم را برای تست وارد کنم تا متوجه وجود این آسیب پذیری شوم:مقادیر دلخواه را وارد میکنم تا تست کنم که آیا آسیب پذیر هستبا این پیغام از طرف وبسایت متوجه این میشویم که دستوری که وارد کردیم بدون هیچ مشکلی انجام شده و بدون ارور کامنت ما در پست قرار گرفت.وقتی وارد صفحه ای شویم که کامنت گذاشتیم، این پیام را میبینیموقتی وارد صفحه ای که کامنت گذاشتم میشوم:و به این معناست که کد ما در سورس کد وارد شده است و هر بار که وارد این صفحه بشویم کد های جاوااسکریپی ما اجرا میشود و نه تنها ما بلکه هر یوزری وارد این صفحه شود کد های ما در سیستم آن هم اجرا خواهد شد.کد جاوااسکریپ ما در سورس به همین صورت اضافه شده اندتا اینجا با انواع حملات XSS آشنا شدیم و با دو سناریو ساده کمی درک کنیم این آسیب پذیری را .از XSS برای چه چیز هایی میتوانیم استفاده کنیم؟اطلاعات ورودی کاربران را مثل Cookie و Session ضبط کنیم.قابلیت های تروجان و بد افزار ها را در وبسایت پیاده کنیم، مانند استفاده Key Logger در صفحه.Home page کاربر و وبسایت را تغییر بدهیم و دیفیس کنیم.جعل هویت کنیم و به عنوان کاربران وبسایت لاگین کنیم.Prevent XSS Attackچگونه از حملات XSSجلوگیری کنیم؟این آسیب پذیری تقریبا از سال 2017 وارد لیست Owasp Top 10 شده که اهمیت وخطرناک بودن این باگ رو به خوبی نشون میدهد.و باید با یک سری راهکار سعی کنیم جلوی این حملات را بگیریم و البته صرفا رعایتکردن این نکات امنیت را صد درصد تکمیل نمیکند ولی تا حد خوبی وبسایت را ایمنمیکند.فیلتر کردن ورودی هایی که از کاربران دریافت میکنید قبل از گذاشتن در المنت های HTMLقبل از نشان دادن مقادیری که کاربر وارد کرده است میتوانیم آن مقادیر را به صورت Scapeدربیاوریم، با اینکار باعث میشویم که مرورگر دستورات HTML را به عنوان دستورات HTMLنشناسد و به صورت یک متن ساده نمایش دهد و اجرا نشود.با استفاده از توابع htmlspecialchars خروجی خود را فیلتر میکنیم.آدرس های اینترنتی(URL) مشکوک را فیلتر کنید.ایمن کردن کوکی هاهمونطور که گفتم که هکر از این آسیب پذیری میتواند برای سرقت نشست ها و کوکی های کاربراناستفاده کند، و بهترین راه برای مقابله با این موضوع، باید از کوکی های HttpOnlyاستفاده کرد کهفقط توسط مرورگر ارسال و دریافت شود و کسی با جاوااسکریپت نتواند آن را تغییر دهد.در نهایت XSSفقط نشان دادن یک هشدار در صفحه نیست، و ممکن است عواقب خیلی زیادی در پی داشته باشد و با اینکه ارتباط مستقیم با دیتابیس ندارد و خیلی از مدیر های وبسایت ها ممکن است نادیده بگیرند این باگ رو، اما این آسیب پذیری چند سالی هست که جزو ده آسیب پذیری سال از طرف مجموعه OWASP معرفی شده است و همچنین خطرات خیلی زیادی برای یک وبسایت و همچنین شهرت وبسایت دارد و به طور مستقیم کاربر های یک وبسایت رو مورد حمله قرار میدهد.راهکار های زیادی برای مقابله با این آسیب پذیری وجود دارد که بسته به دانش توسعه دهنده و برنامه نویس یک وبسایت ممکن است متفاوت باشد و اصلی ترین کار این هست که ورودی هارا با دقت فیلتر کنیم تا عباراتی که کاربران وارد میکنند کنترل شود و جلوی حملات را گرفت .البته که بیشتر راهکار ها با وجود بالا بودن سطح امنیتی، امنیت وبسایت را 0 تامین نمیکنند و طی زمان های مشخص و با استفاده از روش های متنوعی مثل استفاده از اسکنر های امنیتی مثل Acunetix و Netsparker و BurpSuite وبسایت را از لحاظ امنیتی بسنجیم و سعی کنیم مواردی که گزارش شده اند را به صورت خیلی جدی پچ کنیم.این مطلب به صورت مداوم آپدیت خواهد شد و اگر نظری داشتید خوشحال میشم با من در قسمت کامنت ها در میون بذارید.پیج اینستاگرام من رو هم از اینجا میتونید دنبال کنید.