در این بخش، ابتدا توضیح خواهیم داد که حملهی تزریق اسکریپت از طریق وبگاه چیست، سپس نقاط مختلف آسیبپذیر در برابر این نوع حمله را شرح خواهیم داد و در آخر، به طور دقیق به نحوهی شناسایی این نوع حمله و طریقهی پیشگیری از آن خواهیم پرداخت.
XSS یا Cross-site Scripting چیست؟
Cross-site Scripting یا XSS (همچنین موسوم تزریق اسکریپت از طریق وبگاه)، نوعی نقص امنیتی صفحات وب است که فرد مهاجم را قادر میسازد تا تعاملات میان کاربران با برنامهی آسیبپذیر تحت وب را در اختیار گیرد. این امر فرد مهاجم را قادر میسازد تا «سیاست مبدأ» وبسایت اصلی را دور بزند؛ همان سیاستی که بهمنظور افزایش امنیت برای جداسازی وبسایت مبدأ از (لینک) سایر وبسایتها طراحی و عرضه شده است. آسیبپذیریهای تزریق اسکریپت از طریق وبگاه معمولاً به فرد مهاجم اجازه میدهد تا ظاهر کاربر قربانی را به خود بگیرد، تمام اعمالی را که کاربر قادر به انجام آنهاست را انجام دهد و در آخر، به تمام دادههای وی دسترسی پیدا کند. درصورتیکه کاربر قربانی دسترسی کامل به برنامهی تحت حمله داشته باشد، آنگاه ممکن است فرد مهاجم بتواند بر تمام عملکردها و دادههای برنامه کنترل پیدا کند.
نحوهی کار حملهی XSS
حملهی تزریق اسکریپت از طریق وبگاه با دستکاری وبسایت آسیبپذیر کار میکند؛ به این نحو که کدهای مخرب تزریقی جاوا اسکریپت را بهعنوان بخشی از پاسخ وبسایت به کاربر قربانی بازمیگرداند. بهمحض اجرای کد مخرب در مرورگر قربانی، فرد مهاجم تعاملات وی با برنامهی تحت وب را به طور کامل در اختیار میگیرد.
اثبات مفهومی XSS (ارزیابی امنیتی و تأیید آسیبپذیری یک صفحهی وب)
میتوان با تزریق کد مخربی تحت عنوان پیامبار که باعث اجرای جاوا اسکریپتی با نتایج مدنظر مهاجم در مرورگر میشود، اکثر نقاط آسیبپذیر در برابر حملهی XSS را شناسایی و تأیید کرد. معمولاً استفاده از تابع () alert بهعنوان روشی برای این منظور از قدیم تا کنون رایج بوده است، چراکه کوتاه و بیخطر است و هنگامی که با موفقیت فراخوانی میشود، بسیار سخت است که بتوان آن را نادیده گرفت. در واقع میتوان گفت که با فراخوانی تابع () alert در مرورگر شبیهسازیشدهی کاربر قربانی، بخش اعظم تمرینهای عملی آزمایشگاهی XSS ما حل خواهند شد.
متأسفانه، در صورت استفاده از مرورگر گوگل کروم مشکلی جزئی وجود دارد. از نسخهی 92 به بعد که در 20 ژوئیه 2021 منتشر شد، محدودیتهایی امنیتی برای آیفریمهای با مبدأ متقاطع اعمال گردید که دیگر قادر به فراخوانی تابع () alert نیستند. ازآنجاییکه این نوع آیفریمها جهت تدارک حملات پیشرفتهتر XSS استفاده میشوند، برای پروسهی اثبات مفهومی، گاهی اوقات به پیامبار جایگزین نیاز است. در اینگونه سناریوها، توصیهی ما استفاده از تابع print () است.
ازآنجاییکه مرورگر قربانی شبیهسازیشده در آزمایشگاههای عملی ما گوگل کروم است، برای وفقپذیری با مشکل مذکور، دستورالعمل این آزمایشگاههای آلوده را اصلاح و بهروزرسانی کردهایم مبنیبر اینکه با استفاده از تابع جایگزین print () نیز میتوان تمرینهای عملی آنها را حل کرد. در این دستورالعملها هر کجا که مقتضی بوده است، به استفاده از تابع جایگزین print () اشاره کردهایم.
انواع حملات XSS
حملات XSS به سه نوع اصلی دستهبندی میشوند که عبارتاند از:
- حملهی XSS انعکاسی که در آن کد اسکریپت مخرب در خود درخواست HTTP (مانند فیلد ورودی فرم) تزریق و سپس در پاسخ سرور منعکس میشود.
- حملهی XSS ذخیرهشده که در آن کد اسکریپت مخرب در پایگاهداده وبسایت (مانند پروفایل) به طور دائم ذخیره و توسط مرورگر بازدیدکنندگان قربانی اجرا میشود.
- حملهی XSS مبتنی بر DOM که در آن نقطهی آسیبپذیر بهجای کد طرف سرور، در کد طرف سرویسگیرنده (کلاینت) قرار دارد.
XSS انعکاسی
حملهی XSS انعکاسی (Reflected cross-site scripting) سادهترین نوع حملات تزریق اسکریپت از طریق وبگاه است. این حمله زمانی رخ میدهد که برنامهی تحت وب (مثلاً مرورگر) دادههایی را در قالب درخواست HTTP از سوی کاربر دریافت میکند و سپس بلافاصله این دادهها را به روشی غیر ایمن و بدون اعتبارسنجی یا رمزگذاری مناسب درون پاسخ HTTP قرار میدهد.
در ادامه مثالی ساده دررابطهبا آسیبپذیری حملهی XSS انعکاسی آورده شده است:
https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>
برنامهی تحت وب (مرورگر) هیچ پردازش اضافی بر روی دادهها انجام نمیدهد، بنابراین فرد مهاجم بهراحتی میتواند حملهای مانند زیر ترتیب دهد:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script> <p>Status: <script>/* Bad stuff here... */</script></p>
درصورتیکه کاربر از URL ساختهشده توسط فرد مهاجم بازدید کند، آنگاه کد مخرب فرد مهاجم در مرورگر کاربر قربانی یا به عبارتی در جلسه یا دورهی زمانی تعامل کاربر با برنامهی تحت وب اجرا خواهد شد. در این مرحله، کد مخرب قادر به انجام هر عملی خواهد بود و میتواند هر دادهای که کاربر به آن دسترسی دارد را در اختیار بگیرد.
XSS ذخیرهشده
حملهی XSS ذخیرهشده (همچنین موسوم به XSS ماندگار یا مرتبهی دوم) زمانی رخ میدهد که برنامهی تحت وب دادهها را از منبعی غیرقابلاعتماد دریافت میکند و سپس این دادهها را به روشی غیر ایمن در پاسخهای HTTP خود میگنجاند.
این دادهها ممکن است از طریق درخواستهای HTTP به برنامه ارسال شوند؛ برای مثال، نظرات در زیر پستهای وبلاگی، اسامی مستعار در چترومها (اتاق گپزنی)، یا جزئیات تماس مانند نام، نشانی، ایمیل یا شمارهتلفن مربوط به سفارش مشتری (هنگام خرید آنلاین) که همهی این موارد از طریق درخواستهای HTTP به برنامه منتقل میشوند و اگر برنامه بهدرستی این اطلاعات حساس را مدیریت یا ایمن نکند، ممکن است منجر به دسترسی غیرمجاز به دادههای کاربر شود. در موارد دیگر، ممکن است دادهها از منابع غیرقابلاعتماد دیگری آمده باشند؛ برای مثال، برنامهی وبمیل (پست الکترونیکی) که پیامهای دریافتشده از طریق پروتکل SMTP را نمایش میدهد، برنامهی بازاریابی که پستهای رسانههای اجتماعی را نشان میدهد یا برنامهی نظارت بر شبکه که بستههای دیتای برگرفته از ترافیک شبکه را به تصویر میکشد.
در ادامه مثالی ساده دربارهی آسیبپذیری حملهی XSS ذخیرهشده آورده شده است. برنامهای پیامرسان را داریم که به کاربران اجازه میدهد تا پیامهایی را ارسال کنند که به سایر کاربران نشان داده میشوند:
<p>Hello, this is my message!</p>
برنامه هیچگونه پردازش اضافی بر روی دادهها انجام نمیدهد، بنابراین فرد مهاجم بهراحتی میتواند پیامی ارسال کند که سایر کاربران را تحت حمله قرار دهد:
<p><script>/* Bad stuff here... */</script></p>
XSS مبتنی بر DOM
حملهی XSS مبتنی بر DOM (همچنین موسوم به DOM XSS) زمانی رخ میدهد که برنامهای حاوی جاوا اسکریپت در طرف سرویسگیرنده، دادههایی نشئتگرفته از منبعی غیرقابلاعتماد را پردازش کند که روش معمول آن نوشتن این دادهها در DOM است.
در مثال زیر، برنامهای با استفاده از جاوا اسکریپت به خواندن (استخراج) مقدار یک فیلد ورودی و نوشتن (تزریق) آن در یک عنصر درون ساختار HTML صفحهی وب میپردازد:
<p>Hello, this is my message!</p>
برنامه هیچگونه پردازش اضافی بر روی دادهها انجام نمیدهد، بنابراین فرد مهاجم بهراحتی میتواند پیامی ارسال کند که سایر کاربران را تحت حمله قرار دهد:
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 مخرب و به روشی مشابه حملهی انعکاسی، حملهی خود را ترتیب دهد. برای مثال، در URL زیر، رشتهی پرسوجو شامل «param1=value1» و «param2=value2» است که پس از نماد «?» میآیند و شامل جفتهای کلید-مقدار هستند که با نماد «&» از هم جدا شدهاند.
موارد استفادهی حملات XSS
مهاجمی که از نقص تزریق اسکریپت از طریق وبگاه بهره میگیرد، معمولاً قادر به انجام این کارها خواهد بود:
- جعل هویت یا گرفتن ظاهر کاربر قربانی به خود
- انجام هر عملی که کاربر قادر به انجام آن است
- خواندن هر دادهای که کاربر به آن دسترسی دارد
- ربودن اطلاعات ورود کاربر
- تخریب مجازی ظاهر وبسایت
- تزریق قابلیت مخرب تروجان به وبسایت
تأثیر آسیبپذیریهای حملات XSS
تأثیر واقعی حملات XSS عموماً به ماهیت برنامه، عملکرد و دادههای برنامه و وضعیت کاربر در معرض خطر بستگی دارد. برای مثال:
- در برنامهای مانند بروشورافزار که در آن همهی کاربران ناشناس و تمامی اطلاعات عمومی (همگانی) هستند، اغلب اوقات تأثیر حملات حداقل خواهد بود.
- تأثیر حملات بر روی برنامهای که دادههای حساسی همچون تراکنشهای بانکی، ایمیلها یا سوابق درمانی را در خود نگهداری میکند، معمولاً جدی خواهد بود.
- درصورتیکه کاربر قربانی از امتیازات دسترسی بالایی در برنامه برخوردار باشد، تأثیر حملات عموماً بحرانی خواهد بود، چراکه دسترسی سطح بالا فرد مهاجم را قادر میسازد تا کنترل کامل برنامهی آسیبپذیر را در دست بگیرد و همهی کاربران و دادههای آنها را در معرض خطر قرار دهد.
برای آشنایی با روشهای شناسایی و پیشگیری از حملات XSS، توصیه میشود مقاله نحوه شناسایی و پیشگیری از حملات XSS را مطالعه نمایید.