در این مقاله قرار است توضیح دهیم که اسکریپت بین سایتی چیست، انواع مختلف آسیب پذیریهای اسکریپتنویسی متقابل را شرح میدهیم و نحوه یافتن و جلوگیری از اسکریپتهای متقابل سایت را توضیح میدهیم. در واقع این ارور وردپرس با عنوان خطای Cross-site scripting (XSS) attack detected موجود است که به بررسی دلایل رخ دادن و همچنین راهحلهای آن خواهیم پرداخت.
ارور Cross-site scripting (XSS) attack detected در وردپرس چیست؟
Cross-site Scripting (همچنین به عنوان XSS شناخته میشود) یک آسیب پذیری امنیتی وب است که به مهاجم اجازه میدهد تا تعاملات کاربران با یک برنامه آسیب پذیر را به خطر بیندازد. این خطا به مهاجم اجازه میدهد تا سیاست مبدا یکسانی را که برای جداسازی وبسایتهای مختلف از یکدیگر طراحی شده است، دور بزند. آسیبپذیریهای اسکریپت بین سایتی معمولاً به مهاجم این امکان را میدهند تا خود را به عنوان یک کاربر قربانی درآورد، هر اقدامی را که کاربر قادر به انجام آن است انجام دهد و به هر یک از دادههای کاربر دسترسی پیدا کند. اگر کاربر قربانی دسترسی ممتازی به برنامه داشته باشد، ممکن است مهاجم بتواند کنترل کاملی بر تمام عملکردها و دادههای برنامه داشته باشد.
XSS چگونه کار می کند؟
خطای Cross-site scripting (XSS) attack detected با دستکاری یک وبسایت آسیبپذیر کار خود را آغاز میکند تا جاوا اسکریپت مخرب را به کاربران برگرداند. هنگامی که کد مخرب در داخل مرورگر قربانی اجرا میشود، مهاجم میتواند به طور کامل تعامل آنها با برنامه را به خطر بیندازد.
شما میتوانید انواع آسیب پذیریهای XSS را با تزریق یک باری که باعث میشود مرورگر شما جاوا اسکریپت دلخواه را اجرا کند، تأیید کنید. استفاده از تابع ()alert برای این منظور از دیرباز معمول بوده است، زیرا کوتاه و بی ضرر است و هنگام فراخوانی موفقیت آمیز به سختی نمیتوان آن را از دست داد. در واقع، شما اکثر آزمایشگاههای XSS ما را با فراخوانی ()alert در مرورگر قربانی شبیه سازی شده حل میکنید.
متأسفانه، اگر از Chrome استفاده میکنید، مشکلی جزئی وجود دارد. از نسخه 92 به بعد (20 ژوئیه 2021)، iframe های متقاطع از فراخوانی ()alert جلوگیری میکنند. از آنجایی که از اینها برای ساختن برخی از حملات پیشرفتهتر XSS استفاده میشود، گاهی اوقات باید از یک بار دیگر PoC استفاده کنید. در این سناریو، تابع ()print را توصیه میکنیم.
انواع خطای Cross-site scripting (XSS) attack detected
سه نوع اصلی از حملات XSS وجود دارد. اینها عبارتند از:
- منعکس شده XSS، جایی که اسکریپت مخرب از درخواست فعلی HTTP میآید.
- XSS ذخیره شده، جایی که اسکریپت مخرب از پایگاه داده وبسایت میآید.
- XSS مبتنی بر DOM، که در آن آسیبپذیری در کد سمت کلاینت به جای کد سمت سرور وجود دارد.
اسکریپت نویسی متقابل در سایت منعکس شده
Reflected XSS سادهترین نوع اسکریپت نویسی بین سایتی است. زمانی ایجاد میشود که یک برنامه دادهها را در یک درخواست HTTP دریافت میکند و آن دادهها را در پاسخ فوری به روشی ناامن شامل میشود. در اینجا یک مثال ساده از آسیب پذیری XSS منعکس شده است:
. <p>Status: All is well.</p>
برنامه هیچ پردازش دیگری از دادهها را انجام نمیدهد، بنابراین یک مهاجم میتواند به راحتی حملهای مانند زیر بسازد:
*+Bad+stuff+here…+*/</script> <p>Status: <script>/* Bad stuff here… */</script></p>
اگر کاربر از URL ساخته شده توسط مهاجم بازدید کند، اسکریپت مهاجم در مرورگر کاربر، در زمینه جلسه آن کاربر با برنامه اجرا میشود. در آن مرحله، اسکریپت میتواند هر عملی را انجام دهد و هر دادهای را که کاربر به آن دسترسی دارد، بازیابی کند.
اسکریپت بین سایتی ذخیره شده
XSS ذخیره شده (همچنین به عنوان XSS دائمی یا مرتبه دوم شناخته میشود) زمانی ایجاد میشود که یک برنامه دادهها را از یک منبع نامعتبر دریافت کرده و آن دادهها را در پاسخهای HTTP بعدی خود به روشی ناامن شامل میشود. دادههای مورد نظر ممکن است از طریق درخواستهای HTTP به برنامه ارسال شوند. به عنوان مثال، نظرات در مورد یک پست وبلاگ، نام مستعار کاربر در اتاق گفتگو، یا جزئیات تماس در مورد سفارش مشتری. در موارد دیگر، دادهها ممکن است از منابع غیرقابل اعتماد دیگری به دست آیند. به عنوان مثال، یک برنامه ایمیل وب که پیامهای دریافت شده از طریق SMTP را نمایش میدهد، یک برنامه بازاریابی که پستهای رسانههای اجتماعی را نمایش میدهد، یا یک برنامه نظارت بر شبکه که دادههای بسته را از ترافیک شبکه نمایش میدهد.
در اینجا یک مثال ساده از خطای Cross-site scripting (XSS) attack detected ذخیره شده است. یک برنامه پیام رسان به کاربران امکان میدهد پیامهایی را ارسال کنند که برای سایر کاربران نمایش داده میشود:
<p>Hello, this is my message!</p>
برنامه هیچ پردازش دیگری از دادهها انجام نمیدهد، بنابراین یک مهاجم میتواند به راحتی پیامی ارسال کند که به سایر کاربران حمله میکند:
<p><script>/* Bad stuff here… */</script></p>
اسکریپت نویسی متقابل سایت مبتنی بر DOM
XSS مبتنی بر DOM (همچنین به عنوان DOM XSS شناخته میشود) زمانی ایجاد میشود که یک برنامه حاوی جاوا اسکریپت سمت سرویس گیرنده باشد که دادهها را از یک منبع نامعتبر به روشی ناامن پردازش میکند، معمولاً با نوشتن دادهها در DOM این اتفاق میافتد. در مثال زیر، یک برنامه از مقداری جاوا اسکریپت برای خواندن مقدار از یک فیلد ورودی و نوشتن آن مقدار در یک عنصر در HTML استفاده میکند:
var search = document.getElementById(‘search’).value; var results = document.getElementById(‘results’); results.innerHTML = ‘You searched for: ‘ + search;
اگر مهاجم بتواند مقدار فیلد ورودی را کنترل کند، میتواند به راحتی یک مقدار مخرب بسازد که باعث میشود اسکریپت خودش اجرا شود:
You searched for: <img src=1 onerror=’/* Bad stuff here… */’>
در یک مورد معمولی، فیلد ورودی از بخشی از درخواست HTTP پر میشود، مانند پارامتر رشته جستجوی URL، که به مهاجم اجازه میدهد با استفاده از یک URL مخرب، به همان روشی که XSS منعکس شده است، حمله را انجام دهد.
XSS برای چه منظور استفاده شود؟
مهاجمی که از یک آسیبپذیری اسکریپت بین سایتی سوء استفاده میکند معمولاً میتواند:
- جعل هویت یا خودنمایی به عنوان کاربر قربانی.
- هر اقدامی را که کاربر قادر به انجام آن است انجام دهید.
- هر دادهای که کاربر میتواند به آن دسترسی داشته باشد را بخوانید.
- اطلاعات ورود کاربر را ضبط کنید.
- تخریب مجازی وبسایت را انجام دهید.
- قابلیتهای تروجان را به وبسایت تزریق کنید.
تاثیر آسیب پذیری های XSS
تأثیر واقعی یک حمله XSS که منجر به خطای Cross-site scripting (XSS) attack detected به طور کلی به ماهیت برنامه، عملکرد و دادههای آن و وضعیت کاربر در معرض خطر بستگی دارد. به عنوان مثال:
- در یک برنامه، که در آن همه کاربران ناشناس هستند و همه اطلاعات عمومی هستند، تأثیر اغلب حداقل خواهد بود.
- در برنامهای که دادههای حساسی مانند تراکنشهای بانکی، ایمیلها یا سوابق مراقبتهای بهداشتی را در خود نگهداری میکند، معمولاً تأثیر آن جدی خواهد بود.
- اگر کاربر آسیبدیده دارای امتیازات بالاتری در برنامه باشد، تأثیر آن به طور کلی بسیار مهم خواهد بود و به مهاجم اجازه میدهد تا کنترل کامل برنامه آسیبپذیر را در دست بگیرد و همه کاربران و دادههای آنها را به خطر بیاندازد.
چگونه آسیب پذیری های XSS را پیدا کنیم؟
اکثریت قریب به اتفاق آسیبپذیریهای XSS را میتوان به سرعت و با اطمینان با استفاده از اسکنر خطا پیدا کرد. آزمایش دستی برای XSS منعکس شده و ذخیره شده معمولاً شامل ارسال یک ورودی منحصر به فرد ساده در هر نقطه ورودی در برنامه، شناسایی هر مکانی است که ورودی ارسال شده در پاسخهای HTTP برگردانده میشود و هر مکان را به صورت جداگانه آزمایش میکند تا تعیین شود. آیا میتوان از ورودی ساخته شده مناسب برای اجرای جاوا اسکریپت دلخواه استفاده کرد. به این ترتیب، میتوانید زمینهای را که XSS در آن رخ میدهد تعیین کرده و یک بار مناسب برای بهره برداری از آن انتخاب کنید.
آزمایش دستی برای XSS مبتنی بر DOM که از پارامترهای URL ناشی میشود، شامل فرآیند مشابهی است:
قرار دادن یک ورودی منحصر به فرد ساده در پارامتر، استفاده از ابزارهای توسعهدهنده مرورگر برای جستجوی DOM برای این ورودی، و آزمایش هر مکان برای تعیین اینکه آیا قابل بهرهبرداری است یا خیر.
با این حال، تشخیص انواع دیگر DOM XSS دشوارتر است. برای یافتن آسیبپذیریهای مبتنی بر DOM در ورودیهای غیر URL (مانند document.cookie) یا سینکهای غیر مبتنی بر HTML (مانند setTimeout)، هیچ جایگزینی برای بررسی کد جاوا اسکریپت وجود ندارد، و میتواند بسیار زمانبر باشد. اسکنر آسیبپذیری وب Burp Suite تجزیه و تحلیل استاتیک و پویا جاوا اسکریپت را ترکیب میکند تا به طور قابل اعتمادی تشخیص آسیبپذیریهای مبتنی بر DOM را خودکار کند.
خط مشی امنیت محتوا
سیاست امنیتی محتوا (CSP) یک مکانیسم مرورگر است که هدف آن کاهش تأثیر خطای Cross-site scripting (XSS) attack detected و برخی آسیب پذیریهای دیگر است. اگر برنامهای که از CSP استفاده میکند دارای رفتاری شبیه به XSS باشد، ممکن است CSP مانع یا جلوگیری از بهرهبرداری از آسیبپذیری شود. اغلب، CSP را میتوان دور زد تا امکان بهره برداری از آسیب پذیری اساسی فراهم شود.
چگونه از حملات XSS جلوگیری کنیم؟
جلوگیری از خطای Cross-site scripting (XSS) attack detected در برخی موارد بیاهمیت است، اما بسته به پیچیدگی برنامه و روشهایی که دادههای قابل کنترل توسط کاربر را مدیریت میکند، میتواند بسیار سختتر باشد. به طور کلی، پیشگیری موثر از آسیبپذیریهای XSS احتمالاً شامل ترکیبی از اقدامات زیر است:
- ورودی فیلتر هنگام ورود در نقطهای که ورودی کاربر دریافت میشود، تا حد امکان براساس ورودی مورد انتظار یا معتبر فیلتر کنید.
- کدگذاری دادهها در خروجی در نقطهای که دادههای قابل کنترل توسط کاربر در پاسخهای HTTP خارج میشود، خروجی را رمزگذاری کنید تا از تفسیر آن به عنوان محتوای فعال جلوگیری کنید. بسته به زمینه خروجی، ممکن است نیاز به استفاده از ترکیبی از HTML، URL، جاوا اسکریپت و رمزگذاری CSS داشته باشد.
- از هدرهای مناسب استفاده کنید. برای جلوگیری از XSS در پاسخهای HTTP که در نظر گرفته نشده است حاوی هیچ HTML یا جاوا اسکریپت باشد، میتوانید از سرصفحههای Content-Type و X-Content-Type-Options استفاده کنید تا اطمینان حاصل کنید که مرورگرها پاسخها را به روشی که شما میخواهید تفسیر میکنند.
- خط مشی امنیت محتوا به عنوان آخرین خط دفاعی، میتوانید از سیاست امنیت محتوا (CSP) برای کاهش شدت آسیبپذیریهای XSS استفاده کنید.
نویسنده بهاره کوهستانی
سایر مقالات نویسندهبهاره کوهستانی یک نویسنده و کارشناس حرفهای در حوزه وردپرس است که با چندین سال تجربه، مقالات آموزشی و راهنماهای کاربردی متعددی را برای کاربران منتشر کرده است. مطالب او به کاربران کمک میکند تا با بهرهگیری از ابزارها و تکنیکهای نوین، سایتهای خود را به سطح بالاتری ارتقا دهند.