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