محمد حسین نوری
محمد حسین نوری
خواندن ۸ دقیقه·۳ سال پیش

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



باگ XSS یا Cross Site Scripting از رایج ترین آسیب پذیری های سطح وب است که در این حملات هکر و نفوذگر، کاربران یک وبسایت را با تزریق کد های جاوااسکریپ مورد هدف قرار میدهند.

این آسیب پذیری در صورتی به وجود می آید که برنامه نویس یک وبسایت، ورودی هایی که از کاربران
خودش میگیرد را کنترل نکند و این اجازه را به کاربران بدهد تا هر کارکتر و هر ورودی که بخواهند وارد
کنند، برای مثال برای فیلد ورود نام و نام خانوادگی فیلتری در نظر نمیگیرند و هکر از این ضعف امنیتی استفاده میکند تا حملات XSS را روی آن وبسایت پیاده سازی کند.

هکر میتواند از این آسیب پذیری استفاده های زیادی کند، برای مثال یک تروجان روی وبسایت ایجاد کند و یا سشن ها و کوکی های کاربران دیگر را به سرقت ببرد! و این کار هم به سادگی انجام میگیرد، چون کاربران به یک وبسایت اعتماد دارند، ولی نمیداند در پشت پرده یک سری کد هایی تزریق شده که در حال سرقت کوکی آنها هست.


که همینطور که مشخص شد این حمله از خطرناک ترین حمله ها هم هست و برای شرکت های بزرگ که اعتبار زیادی دارند یک نوع تهدید بزرگ به شمار میاد.
با توجه به ورودی های زیادی که بیشتر وبسایت ها از کاربران خودشون دریافت میکنن، میتونیم به این نتیجه برسیم که XSS تقریبا همه جا هست!

فقط باید با توجه به آشنایی که با این آسیب پذیری داریم سعی کنیم در فیلد های ورودی وبسایت ها تست نفوذ انجام دهیم و اون هارو پیدا کنیم.



Cross site Scripting
Cross site Scripting


حملات XSS چگونه انجام میشوند؟

فرض کنید وبسایت از شما نامتان را دریافت میکند و بعد به صورت یک پیام در صفحه به شما (اسم شما) خوش آمد میگوید. و متوجه میشویم که هرچه به صورت ورودی داده ایم را در خروجی چاپ کرده است و کنترلی روش نداشته است و همینطور کدی که برای بک اند نوشته به این صورت است:

کد PHP که در بک اند وبسایت برای نمایش اسم در صفحه نوشته شده است
کد PHP که در بک اند وبسایت برای نمایش اسم در صفحه نوشته شده است

و متغیر inputName اسمی که وارد کردیم از فیلد ورودی نام را در خودش دارد و خروجی را در صفحه به این شکل نشان میدهد:

خروجی کد بالا که در صفحه به کاربر نمایش داده میشود
خروجی کد بالا که در صفحه به کاربر نمایش داده میشود


در نتیجه این کد که HTML است به مرورگر کاربر داده میشود و در صفحه نتیجه را نشان میدهد.

این کد خروجی کد PHP هست که به صورت HTML در صفحه نمایش میدهد
این کد خروجی کد PHP هست که به صورت HTML در صفحه نمایش میدهد


و حالا هکر با بررسی هایی که انجام داده میخواهد تست انجام بدهد که آیا این فیلد ورودی و این صفحه آسیب پذیری XSS دارد یا نه؟!


برای این کار یک قطعه کد جاوااسکریپی را در آن فیلد وردی وارد میکند تا مطمئن شود که این صفحه آسیب پذیر است و معمولا هکر ها برای این کار از این قطعه کد استفاده میکنند:

این کد یک هشدار در صفحه را نمایش میدهد
این کد یک هشدار در صفحه را نمایش میدهد

این کد برای دادن هشدار هست و مقداری که در داخلش نوشته باشد را به عنوان پیامی در بالای صفحه به کاربر نشان میدهد، و وقتی این مقدار را در فیلد ورودی بنویسیم کد PHP به این تغییر میکند:

کد جاوااسکریپت ما که با کد پی اچ پی ترکیب شده است
کد جاوااسکریپت ما که با کد پی اچ پی ترکیب شده است

و این کد در HTML و مرورگر کاربر به این شکل نشان داده میشود:

خروجی کد PHP که در صفحه نمایش داده میشود
خروجی کد PHP که در صفحه نمایش داده میشود

و در نهایت وقتی که پیامی که در بالا مشخص کردیم را در غالب یک مسیج باکس دیدیم، متوجه میشویم که تونستیم کد های جاوااسکریپتی را اجرا کنیم و کد های ما به درستی اجرا شده اند، مثل این تصویر:

خروجی کد جاوا اسکریپت که از طریق ورودی نام وارد کردیم و در صفحه به درستی اجرا شده است
خروجی کد جاوا اسکریپت که از طریق ورودی نام وارد کردیم و در صفحه به درستی اجرا شده است


این فقط یک مثال ساده از این آسیب پذیری بود، در ادامه با استفاده از محیط آزمایشگاهی این آسیب پذیری را شبیه سازی میکنم تا این آسیب پذیری را در دنیای واقعی بیشتر درک کنید.




Reflected Xss
Reflected Xss


XSS 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
خروجی به دست آمده از کلمه hi


و همینطور در سورس کد هم عبارتی که سرچ کردم قابل مشاهده است:

در سورس صفحه هم کلمه ای که سرچ کردیم را نمایش میدهد
در سورس صفحه هم کلمه ای که سرچ کردیم را نمایش میدهد


الان باید با دستورات جاوااسکریپتی سعی کنم که مطمئن بشم اسکریپت های من اجرا میشوند، من دستور زیر را در فیلد سرچ وارد میکنم:

alert(&quotHacked By MHN&quot)

عبارتی که سرچ کردم شامل کد های جاوااسکریپتی بود و در URL اینطور نمایش درآمد:

آدرس اینترنتی زمانی که ما کد و یا چیزی را سرچ کردیم
آدرس اینترنتی زمانی که ما کد و یا چیزی را سرچ کردیم


و همینطور کد اسکریپتی من در سورس کد این صفحه اضافه شد و به صورت یک قطعه کد جاوااسکریپتی ران شد و درصفحه یک مسیج باک با عنوانی که وارد کردم به نمایش درآمد:

کد ما اجرا شده و در صفحه یک مسیج باکس را میتونیم ببینیم
کد ما اجرا شده و در صفحه یک مسیج باکس را میتونیم ببینیم


کد ما در سورس سایت به صورت کد های جاوا اسکریپ اجرا شده است
کد ما در سورس سایت به صورت کد های جاوا اسکریپ اجرا شده است




XSS Stored

در این سناریو که قراره نوع دوم این آسیب پذیری یعنی XSSاز نوع Storedرو پیاده سازی کنیم، روی
همان بلاگ ولی این بار در قسمت کامنت های یک پست از این وبسایت.
XSS Stored زمانی اتفاق میوفتد که یک فیلد وقتی ورودی را دریافت میکند آن را در صفحه نمایش میدهد و اگر این ورودی هارا نتواند کنترل کند و ما بتوانیم کد های جاوااسکریپتی خودمان را وارد کنیم، کد ما در آن بخش ذخیره خواهد شد وهمیشه ماندگار میماند برای مثال بخش کامنت یک وبسایت که وقتی ما کدی آنجا تزریق کنیم در آن بخش میماند و هرکسی که وارد آن صفحه شود کد ما روی مرورگر آن اجرا میشود و میتواند خیلی خطرناک باشد.

وارد یک پست از این بلاگ میشوم و با اسکرول کردن قسمت کامنت گذاری در این صفحه را پیدا:

بخش کامنت در وبسایت
بخش کامنت در وبسایت


و باید کد های جاوااسکریپتی خودم را برای تست وارد کنم تا متوجه وجود این آسیب پذیری شوم:

مقادیر دلخواه را وارد میکنم تا تست کنم که آیا آسیب پذیر هست
مقادیر دلخواه را وارد میکنم تا تست کنم که آیا آسیب پذیر هست


با این پیغام از طرف وبسایت متوجه این میشویم که دستوری که وارد کردیم بدون هیچ مشکلی انجام شده و بدون ارور کامنت ما در پست قرار گرفت.

وقتی وارد صفحه ای شویم که کامنت گذاشتیم، این پیام را میبینیم
وقتی وارد صفحه ای شویم که کامنت گذاشتیم، این پیام را میبینیم

وقتی وارد صفحه ای که کامنت گذاشتم میشوم:
و به این معناست که کد ما در سورس کد وارد شده است و هر بار که وارد این صفحه بشویم کد های جاوااسکریپی ما اجرا میشود و نه تنها ما بلکه هر یوزری وارد این صفحه شود کد های ما در سیستم آن هم اجرا خواهد شد.

کد جاوااسکریپ ما در سورس به همین صورت اضافه شده اند
کد جاوااسکریپ ما در سورس به همین صورت اضافه شده اند


تا اینجا با انواع حملات XSS آشنا شدیم و با دو سناریو ساده کمی درک کنیم این آسیب پذیری را .



از XSS برای چه چیز هایی میتوانیم استفاده کنیم؟

اطلاعات ورودی کاربران را مثل Cookie و Session ضبط کنیم.
قابلیت های تروجان و بد افزار ها را در وبسایت پیاده کنیم، مانند استفاده Key Logger در صفحه.
Home page کاربر و وبسایت را تغییر بدهیم و دیفیس کنیم.
جعل هویت کنیم و به عنوان کاربران وبسایت لاگین کنیم.


Prevent XSS Attack
Prevent XSS Attack


چگونه از حملات XSSجلوگیری کنیم؟

این آسیب پذیری تقریبا از سال 2017 وارد لیست Owasp Top 10 شده که اهمیت و
خطرناک بودن این باگ رو به خوبی نشون میدهد.
و باید با یک سری راهکار سعی کنیم جلوی این حملات را بگیریم و البته صرفا رعایت
کردن این نکات امنیت را صد درصد تکمیل نمیکند ولی تا حد خوبی وبسایت را ایمن
میکند.

  • فیلتر کردن ورودی هایی که از کاربران دریافت میکنید قبل از گذاشتن در المنت
    های HTML

قبل از نشان دادن مقادیری که کاربر وارد کرده است میتوانیم آن مقادیر را به صورت Scape
دربیاوریم، با اینکار باعث میشویم که مرورگر دستورات HTML را به عنوان دستورات HTML
نشناسد و به صورت یک متن ساده نمایش دهد و اجرا نشود.

با استفاده از توابع htmlspecialchars
خروجی خود را فیلتر میکنیم.
با استفاده از توابع htmlspecialchars خروجی خود را فیلتر میکنیم.


  • آدرس های اینترنتی(URL) مشکوک را فیلتر کنید.
  • ایمن کردن کوکی ها

همونطور که گفتم که هکر از این آسیب پذیری میتواند برای سرقت نشست ها و کوکی های کاربران
استفاده کند، و بهترین راه برای مقابله با این موضوع، باید از کوکی های HttpOnlyاستفاده کرد که
فقط توسط مرورگر ارسال و دریافت شود و کسی با جاوااسکریپت نتواند آن را تغییر دهد.



در نهایت XSSفقط نشان دادن یک هشدار در صفحه نیست، و ممکن است عواقب خیلی زیادی در پی داشته باشد و با اینکه ارتباط مستقیم با دیتابیس ندارد و خیلی از مدیر های وبسایت ها ممکن است نادیده بگیرند این باگ رو، اما این آسیب پذیری چند سالی هست که جزو ده آسیب پذیری سال از طرف مجموعه OWASP معرفی شده است و همچنین خطرات خیلی زیادی برای یک وبسایت و همچنین شهرت وبسایت دارد و به طور مستقیم کاربر های یک وبسایت رو مورد حمله قرار میدهد.

راهکار های زیادی برای مقابله با این آسیب پذیری وجود دارد که بسته به دانش توسعه دهنده و برنامه نویس یک وبسایت ممکن است متفاوت باشد و اصلی ترین کار این هست که ورودی هارا با دقت فیلتر کنیم تا عباراتی که کاربران وارد میکنند کنترل شود و جلوی حملات را گرفت .
البته که بیشتر راهکار ها با وجود بالا بودن سطح امنیتی، امنیت وبسایت را 0 تامین نمیکنند و طی زمان های مشخص و با استفاده از روش های متنوعی مثل استفاده از اسکنر های امنیتی مثل Acunetix و Netsparker و BurpSuite وبسایت را از لحاظ امنیتی بسنجیم و سعی کنیم مواردی که گزارش شده اند را به صورت خیلی جدی پچ کنیم.


این مطلب به صورت مداوم آپدیت خواهد شد و اگر نظری داشتید خوشحال میشم با من در قسمت کامنت ها در میون بذارید.

پیج اینستاگرام من رو هم از اینجا میتونید دنبال کنید.


شاید از این پست‌ها خوشتان بیاید