در این بخش از دوره SEC504 از موسسه SANS به آشنایی با حمله Cross Site Scripting یا XSS و انواع آن خواهیم پرداخت.
آسیب پذیری Cross Site Scripting یا XSS
یکی از آسیبپذیریهای مهم و خطرناک در سطح وب، آسیبپذیری Cross Site Scripting یا XSS میباشد. اگر در یک وب سرور، مقادیری را که از کاربر دریافت میکند به وی باز گردانده و یا چاپ نماید، نفوذگر میتواند با استفاده از آن، حمله XSS را انجام دهد. توجه داشته باشید که تعداد زیادی از برنامههای تحت وب این کار را انجام میدهند.
یکی از بخشهایی که امکان وجود این آسیبپذیر در آن متصور است، بخش جستجو و یا بخشهایی مانند عنوان مطالب میباشد. در این حالت پس از جستجوی یک عبارت esecurity در بخش جستجوی سایت، به شما نمایش داده میشود که عبارت Esecurity در سایت موجود نیست. در این حالت همان عبارت جستجو شده در خروجی به شما نمایش داده شده است.
وجود آسیبپذیری Cross Site Scripting یا XSS نفوذگر را قادر میسازد تا برخی اطلاعات مهم کاربر مانند کوکیهای مرورگر وی را به سرقت ببرد. بنابراین اگر وب سایت بانک آسیبپذیر باشد، ممکن است ما بتوانیم کوکیهای آن را به سرقت برده و از حساب بانکی افراد دیگر سوء استفاده نماییم.
برای استخراج اطلاعات با استفاده از آسیبپذیری Cross Site Scripting یا XSS باید از کدهای جاوا اسکریپت یا وی بی اسکریپت استفاده نمود. پس از ارسال کد جاوا اسکریپت، اطلاعات درخواستی مانند نمایش کوکیها و اطلاعات مرورگر به شما نمایش داده خواهد شد.
یکی از دستورات یا اصطلاحا پیلودهایی که برای تست آسیبپذیری Cross Site Scripting یا XSS استفاده میشود، دستور زیر است:
دستور بالا پس از اجرا، عبارت esecurity را در قالب یک alert به ما نمایش میدهد.
نوعی دیگری از این دستور به صورت زیر است:
برای اکسپلویت نمودن و بهره برداری از این حمله، نفوذگر باید اسکریپت مخرب خود را بر روی دستگاه قربانی اجرا نماید. برای این کار حداقل سه راه وجود دارد:
اولین راه، ارسال آن از طریق ایمیل به قربانی میباشد. شما میتوانید از عبارات فریب آمیز در متن ایمیل استفاده کنید تا کاربر را وادار به کلیک بر روی لینک ارسالی نمایید. به عنوان مثال “با کلیک بر روی لینک زیر و مطالعه مقاله داخل آن 20 هزار تومان به اکانت شما در سایت test.com اضافه خواهد شد و میتوانید از محصولات آن تا سقف 20 هزار تومان به صورت رایگان استفاده نمایید.”
دومین راه، ایجاد تنها یک لینک در وب سایت به عنوان محتوا میباشد. توجه داشته باشید که فقط یک لینک در سایت وجود دارد و گزینه دیگری وجود نخواهد داشت. به عنوان مثال در این لینک با فونتی درشت نوشته شده است “اگر آمادگی لازم برای انجام یک معامله بزرگ و کسب درآمد عالی را ندارید کلیک نکنید” این لینک دارای کد جاوا اسکریپت میباشد که توسط نفوذگر در این لینک قرار داده شده است.
دوره آموزشی تست نفوذ وب – SEC542
سومین راه، ارسال در قالب پاسخ به یک سوال و یا ارسال یک مقاله است. در برخی از وب سایتها این امکان وجود دارد که کاربر میتواند دادههایی را ارسال نماید که کاربران دیگر آن را مشاهده نمایند. یکی از این سایتها slashdot.org میباشد. در این روش ما یک مقاله را ارسال میکنیم که شامل یک کد جاوا اسکریپت میباشد و هنگامیکه مقاله مشاهده میشود، کد جاوا اسکریپت توسط مرورگر قربانی اجرا شده و کوکیها به سرقت میرود.
نفوذگر میتواند به وسیله یکی از راههایی که در بالا ذکر شد، اطلاعات مورد نظر خود را از قربانی دریافت نماید. در برخی موارد از اجرای کدهای جاوا اسکریپت با ساختاری خاص جلوگیری به عمل میآید که میتوانید با مراجعه به آدرس زیر، اطلاعات در مورد طریقه عبور از آنها، اطلاعات مفیدی کسب نمایید:
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
در حمله XSS نفوذگر میخواهد اطلاعاتی که در مرورگر کاربر ذخیره میشود، مانند کوکیها را به دست آورد.
برای انجام این حمله، نفوذگر ابتدا به دنبال بخشهایی که امکان دریافت ورودی دارند میگردد. لازم به ذکر است این ورودیها باید مقادیر را به کاربر نمایش دهند. وب سایت مورد نظر باید کلیه ورودیهایی که توسط کاربر وارد میشود را بازگرداند و نمایش دهد. همچنین برنامه تحت وب نباید ورودیهای خاص مانند کاراکترها را فیلتر نماید.
مثالی برای این آسیبپذیری، سرقت کوکیهای ذخیره شده در مرورگر قربانی میباشد. برای این کار نفوذگر یک اسکریپت را بر روی وب سرور خود ایجاد میکند که قابلیت دریافت کوکی را داشته و همچنین قادر به ذخیره سازی آن نیز میباشد. برای این منظور از لینک زیر استفاده میشود. زمانیکه قربانی بر روی این لینک کلیک مینماید، کوکیهای ذخیره شده در مرورگر وی برای سرور نفوذگر ارسال میشود.
مراحل اجرای حمله XSS به 5 مرحله زیر تقسیم میگردد:
مرحله اول: کاربر قربانی یک حساب کاربری را در یک وب سرور ایجاد میکند که دارای آسیبپذیری XSS میباشد.
مرحله دوم: نفوذگر یک ایمیل را به قربانی ارسال مینماید که با ترفندهای مختلف وی را ترغیب مینماید تا بر روی لینک موجود در ایمیل کلیک نماید. این لینک دارای یک اسکریپت است که داخل لینک جاسازی شده است.
مرحله سوم: مروگر قربانی اسکریپت را به برنامه کاربردی وب به عنوان ورودی کاربر ارسال میکند.
مرحله چهارم: برنامه وب ورودی کاربر را به مرورگر قربانی باز میگرداند که همان اسکریپت میباشد.
مرحله پنجم: اسکریپت بر روی مرورگر قربانی اجرا میشود. این اسکریپت میتواند تمامیکوکیهای وب سایت را دریافت نموده و آنها را از طریق ایمیل یا اسکریپت به نفوذگر ارسال نماید. علاوه بر این، اسکریپت میتواند یک کنترل ActiveX یا برنامه جاوا را با یک Backdoor بر روی سیستم قربانی دانلود و نصب نماید.
حمله XSS از نوع Stored
در شکل دیگری از حمله XSS، که با عنوان Stored XSS مشخص میشود، نفوذگر اقدام به ارسال اسکریپت مخرب خود مینماید که این اسکریپت در وب سایت قربانی ذخیره میشود و با هر بار مراجعه به آن، اطلاعاتی مانند کوکی برای نفوذگر ارسال خواهد شد.
در این حالت وب سایت اجازه میدهد تا محتوا توسط شخص ثالث ارسال شود و این محتوا در وب سایت ذخیره میگردد(مانند فرمهای ارسال اطلاعات یا کامنتها). در صورتی که کنترل لازم در ورودیها انجام نشده باشد، امکان بروز آسیبپذیری Stored XSS وجود خواهد داشت.
مراحل این حمله هم مشابه Reflected XSS میباشد.
حملات مربوط به XSS همیشه شامل اسکریپت نمیشوند! در برخی موارد با استفاده از یک تگ در URL میتوان کاربر را گمراه نمود و یا یک تصویر یا متن را به وی نمایش داده که فرض کند از سایت اصلی به وی نمایش داده شده است.
یک بهره برداری از این آسیبپذیری در سال 2004 و برای وب سایت هواشناسی CNN رخ داد.
وب سایت هواشناسی CNN به کاربران اجازه میداد تا شهر مورد نظر خود را جستجو نموده و از آب و هوای آن اطلاع کسب نمایند. برخی از افراد کشف کردند که یک کاربر میتواند جستجویی انجام دهد که حاوی یک تگ Image بوده و وب سایت هواشناسی CNN این تگ را به مرورگر باز میگرداند. در این روش مرورگر تصویر را از یک وب سایت دیگر دریافت نموده و در صفحه نمایش میداد. در فصل توفان در سپتامبر 2004 افرادی لینکی را که به صفحه هواشناسی CNN ارجاع داده میشد برای تعدادی از مردم ارسال نمودند با این متن که تمام ساکنان فلوریدا خواهند مرد. در واقع این لینک یک جست و جوی دروغین را انجام میداد که باعث بروز یک پیام خطا در وب سایت CNN میشد. البته پیام خطا حاوی یک تصویر از یک سایت دیگر نیز بود.
http://weather.cnn.com/weather/search?wsearch=Florid a” xss-payload
یکی از ابزارهای مفید در بهره برداری از آسیبپذیری XSS ابزار BeEF است که نفوذگر با استفاده از این ابزار میتواند به مرورگر قربانی دسترسی داشته باشد. این ابزار شامل ماژولهایی است که امکان اسکن پورت، مشاهده URLهای مشاهده شده توسط کاربر، فعال نمودن میکروفن، مشاهده آدرس ip داخلی سیستم، نوع سیستمعامل و …. به نفوذگر میدهد.
نفوذگر ابتدا باید در یک وب سرور که به آن دسترسی کامل دارد، ابزار BeEF را نصب نموده و آن را به حالت Listen آماده نماید. پس از انجام این کار، باید لینک ایجاد شده توسط ابزار BeEF را برای کاربر ارسال نماید. پس از اجرای اسکریپت در مرورگر کاربر، یک نشست بین وی و BeEF ایجاد میشود. مطابق با تصویر بالا، پس از اتصال قربانی به سرور BeEF، امکاناتی که این ابزار در اختیار شما قرار میدهد، قابل دسترس خواهد بود.
حمله به مدیران با استفاده از XSS
بیشتر برنامههای تحت وب دارای یک کنسول مدیریتی مبتنی بر وب میباشند. با استفاده از این کنسول میتوان برنامه تحت وب را پیکربندی نموده و Logهای آن را مشاهده نمود. اکثر برنامههای وب، اطلاعات دقیق و با جزئیات را در مورد اقدامات کاربران ذخیره میکنند که برخی از آن عبارتند از:
• تاریخ و Timestamp
• حسابهای کاربری
• نوع تراکنش و جزئیات مربوط به معاملات
• User Agent مربوط به مرورگر
• Logهای مربوط به بستهها
لازم به ذکر است مدیران در بازههای زمانی مشخص با استفاده از یک ابزار مدیریتی تحت وب مبتنی بر مرورگر، این لاگها را بررسی مینمایند. محتوای برخی از فیلدهای این Logها میتواند توسط نفوذگر کنترل شود که وی میتواند در صورت امکان، اسکریپتهای مد نظر خود را به آن تزریق نماید. نحوه انجام این حمله در تصویر زیر نمایش داده شده است.
برای تجسم این نوع حمله، فرض کنید که ما نوعی برنامه داریم که ورودیها را از کاربر جمع آوری نموده و آن را ذخیره میکند. در برخی موارد هم شاید Logها را نیز برای بررسیهای بعدی مدیر ذخیره نماید.
یک مدیر در بازههای زمانی مختلف محتواها و یا Logهای ذخیره شده که حاوی ورودیهای کاربر (یا مهاجم) میباشد را بررسی میکند.
در مرحله اول نفوذگر نوعی ورودی که شامل یک اسکریپت میباشد را ایجاد میکند. در مرحله دوم برنامه، ورودی را از کاربر دریافت کرده و آن را اصطلاحا Log مینماید. البته شاید آن را به یک سرور جداگانه که مختص ذخیره سازی لاگها میباشد منتقل نماید. در مرحله سوم یک کاربر مدیر، Logها را با استفاده از یک برنامه مدیریتی مبتنی بر وب بررسی و مشاهده میکند.
در مرحله چهارم محتوای مخرب یا همان اسکریپتی که توسط نفوذگر وارد شده است توسط مرورگر مدیر اجرا میشود که احتمالا کوکیهای سیستم را به سرقت برده و آنها را به سیستم نفوذگر تحویل میدهد.
در مرحله پنجم، با توجه به اجرای اسکریپت در مرورگر مدیر، نفوذگر میتواند به برنامه وب دسترسی پیدا کند و حتی یک کاربر جدید درون آن ایجاد نماید.
راه کارهای مقابله با حملات XSS
یکی از راههای مقابله با حملات XSS، کنترل و فیلترینگ ورودی کاربران است. در واقع این راه کارها، همان راه کارهای مربوط به حمله SQL Injection میباشند. توسط دفاع در برابر حملات SQL Injection، شما میتوانید در برابر حملات XSS نیز مقاوم باشید. علاوه بر این، حذف کاراکترهای خاص از خروجی نیز راه کار دیگری میباشد که بسیار موثر است. با این حال برای اینکه مطمئن شوید که XSS کاملا از کار افتاده است، باید برنامه تحت وب هر متغیر را که بر روی صفحه مرورگر نمایش میدهد، اصطلاحا Clean نماید.
مایکروسافت یک کتابخانه رایگان با نام Anti-XSS را ارائه میدهد که توسعه دهندگان ASP.NET میتوانند برای Encode کردن تمام کاراکترهای خروجی از آن استفاده کنند.
برخی از مرورگرها مانند گوگل کروم دارای فیلتر XSS میباشند.
استفاده از سیستمهای تشخیص نفوذ هم برای شناسایی اسکریپتها مخرب بسیار مفید خواهد بود.
استفاده از فایروالهای لایه اپلیکیشن (WAF) مانند Citrix NetScaler، F5 Application Security Manager، Free OWASP Stinger و ModSecurity گزینههای دیگری برای مقابله با حملات XSS هستند.