قسمت سوم از سهگانهی آسیبپذیری XSS؛ آسیبپذیری XSS Reflected
در این بلاگپست به گونهی دیگری از آسیبپذیری تزریقی XSS میپردازیم که با عنوانXSS Reflected شناخته میشود. آسیبپذیری XSS Reflected، شباهتها و تفاوتهایی با دیگر اعضای خانوادهی XSSها، یعنی XSS Stored و XSS DOM-Based دارد.
آنچه در این بلاگپست خواهید خواند:
در این بلاگپست که برداشتی آزاد و خلاصه از منابع معتبری مانند portswigger و imperva است، موارد زیر پیش روی شما هستند؛
• مقایسهی گونهی Reflected با دو گونهی Stored و DOM-Based
• معرفی گونهی Reflected آسیبپذیری XSS
• ارزش آسیبپذیری XSS Reflected
• معرفی ابزار محبوب برای کشف و اکسپلویت آسیبپذیری XSS Reflected
• روش دستی کشف و اکسپلویت آسیبپذیری XSS Reflected + مرور یک سناریوی ساده به عنوان مثال
• معرفی چند تابع و خصیصهی کمککننده در کشف و اکسپلویت این آسیبپذیری از زبان جاوا اسکریپت
• چگونگی رفع آسیبپذیری XSS Reflected
همراه ما باشید ؛)
از آنجایی که در قسمت اول از سهگانهی آسیبپذیری XSS؛ XSS DOM-Based و قسمت دوم از سهگانهی آسیبپذیری XSS؛ XSS Stored به طور مفصل به معرفی دو عضو دیگر خانوادهی XSSها پرداختهایم، بگذارید قسمت سوم از سهگانهی آسیبپذیری XSS را با مقایسهی این گونه با دوگونهی قبل آغاز کنیم:
سه تفنگدار؛ XSS Reflected ، XSS Stored و XSS DOM-Based
• گونهی Reflected و گونهی Stored هر دو با سمت سرور در تعامل هستند اما گونهی DOM-Based، با سمت کاربر در تعامل است.
• گونهی Reflected و گونهی Stored ، هر دو بر پایهی پاسخ سرور عمل میکنند ولی گونهی DOM-Based مربوط به سمت کاربر است.
• گونهی Stored پس از ارسال درخواست به سرور، منتظر پاسخ فوری نمیماند و در حقیقت درخواست در سمت سرور ذخیره میشود تا بعدا اطلاعات دریافتشده از سمت سرور که حاوی کد مخرب هستند اجرا شوند. اما گونهی Reflected منتظر پاسخ فوری سرور میماند و به بعد موکول نمیکند.
• با بررسی گزارشهای آسیبپذیری پلتفرمهای باگبانتی میتوان در مورد میزان فراوانی میان این سه گونه آسیبپذیری XSS، تخمین زد که: گونهي Stored فراوانترین گونه، و گونهي Reflected فراوانتر از گونهی DOM- Based آن است.
• فرمهای موجود در صفحهها، از جمله نقاط رایج آسیبپذیر نسبت به آسیبپذیری XSS هستند.
• یکی از راههای پیشگیری از سه گونهی آسیبپذیری XSS ، بررسی و اعتبارسنجی ورودیهاست.
• ابزار قدرتمند BurpSuite بهترین ابزار برای کشف هر یک از سه گونهی آسیبپذیری XSS است. از آنجا که آسیبپذیری XSS از طریق ورودیهایی مانند فرمهای داخل صفحه و Query Parameterها بروز میکند و این ابزار امکانات خوبی را از این جهت در اختیار شکارچی قرار میدهد.
بیایید حالا به سراغ آشنایی بیشتر و دقیقتر با گونهی Reflected برویم:
آسیبپذیری XSS Reflected چیست؟
در گونهي Reflected آسیبپذیری XSS، شکارچی با ارسال اسکریپت مخرب خود در قالب محتوای متنی یا حتی چند رسانهای، به سمت سرور و دریافت پاسخ آن، سبب اجرای آن اسکریپت هنگام ایجاد صفحات مربوط میشود. در مواردی نیز شکارچی میتواند از گونهی Reflected نیز مانند گونهی DOM-Based استفاده کند و از این طریق به سامانه و همچنین حسابهای کاربری بقیهی کاربران نفوذ کند و یا حتی سبب بروز آسیبپذیریهای ثانویهای شود که میتواند نشت اطلاعات در سمت سرور را موجب شود.
آسیبپذیری XSS Reflected چه میزان ارزشی دارد؟
بسته به سطح دسترسیای که پس از اکسپلویت این آسیبپذیری به دست میآید، این آسیبپذیری میتواند منجر به افشای اطلاعات محرمانهای مانند اطلاعات کاربری مشتریان، نمایش پیام در صفحه و دیفیس آن شود. بنابراین در مورد ارزش آسیبپذیری XSS Reflected میتوان گفت که این آسیبپذیری ، باتوجه به سطح دسترسیای که مهیا میکند، در ردهبندی آسیبپذیریهای VRT در یکی از دستههای P3 و P5 قرار میگیرد.
در مطلب «چگونه آسیبپذیری در راورو ارزشگذاری میشود؟» نیز میتوانید دربارهی معیارهای ارزشگذاری آسیبپذیریهای مختلف در راورو بیشتر بخوانید.
چگونه میتوان وجود آسیبپذیری XSS Reflected را بررسی و اکسپلویت کرد؟
آسیبپذیری XSS Reflected به کمک ابزار و یا بهصورت دستی قابلکشف و اکسپلویت است. ما در ادامه به هر دو راه، خواهیم پرداخت:
از چه ابزاری میتوانیم برای کشف آسیبپذیری XSS Reflected استفاده کنیم؟
اگر مایلید به وسیلهی ابزار اقدام به کشف آسیبپذیری XSS Reflected کنید، ابزارهای زیر میتوانند کمک بسیاری به شما بکنند:
BurpSuite
همانطور که میدانید برنامهی BurpSuite از امکانات بسیاری برای کشف آسیبپذیریهای گوناگون در یک وبسایت برخوردار است. معمولا در کشف و اکسپلویت آسیبپذیری XSS نیز اولین انتخاب هر شکارچی، استفاده از ابزار برنامهی BurpSuite است.
با کمک ابزار BurpSuite، به جای پر کردن دستی فرمها میتوان درخواستهای لازم را با تعیین مقادیر پارامترها ارسال و پاسخ سرور را دریافت کرد. اگر پاسخ دریافتشده نشان از وجود آسیبپذیری داشته باشد، میتوان در مرحلهی بعدی با ارسال مقادیر مخرب دیگری در قالب پارامترهای ورودی، آسیبپذیری را اکسپلویت کرد.
همانطور که میدانید ابزارها میتوانند در فرآیند کشف و بررسی قابلبهرهجوییبودن آسیبپذیری XSS مورداستفادهی شکارچی قراربگیرند، اما ارائهی گزارش آسیبپذیری XSS ، با استناد به ابزارهای آماده فاقدارزش است.
ما در مطلب «چگونه گزارش آسیبپذیری بنویسیم؟» مفصلتر به بایدها و نبایدهای یک گزارش آسیبپذیری استاندارد پرداختهایم.
چگونه میتوانیم وجود آسیبپذیری XSS Reflected را به صورت دستی، بررسی و اکسپلویت کنیم؟
پتانسیل بروز آسیبپذیری XSS به طور کلی در نقاطی از وبسایت که دارای فرمهایی هستند، بیشتر است. البته ارسال ورودیها به عنوان Query Parameterهای URL نیز یکی از اصلیترین راههای تزریق ورودی است.
یک سناریوی ساده:
اگر مقادیر پارامتر ورودی صفحه مورد ارزیابی قرار نگیرد و اعتبارسنجی نشود، شکارچی میتواند با ارسال کد مدنظر خود سبب اجرای اسکریپت مخرب شود. اگر صفحهی مدنظر ما مربوط به بخش کامنتهای یک پست باشد و کامنت ارسالشده نمایش داده شود، پاسخ سرور به کد مخربی که به عنوان ورودی در فرم یا Query Parameter ارسال میشود، بازتابی از مقدار ورودی یا همان کد مخرب است که مهاجم در پارامتر ورودی صفحه یا Query Parameter تزریق کرده است. بنابراین اگر در مقادیر ورودی صفحه، کد مخربی تزریق شود، آدرس آن صفحه برای هر مراجعهکننده به آن، حکم ورود به صفحهی خطرناکی را خواهد داشت که در آن شکارچی میتواند با سرقت اطلاعات کاربر از جمله مقادیر کوکی یا سشن، به حساب کاربری کاربر قربانی نفوذ کند.
تصور کنید صفحهای از یک وبسایت انجمن یا فوروم بخشی برای جستوجو دارد و مقادیر جستوجو هم از طریق Query Parameterها وارد میشود. به صورت زیر:
https://insecure-website.com/search?term=gift
همانطور که میبینید، ورودی term مقدار gift را داراست. نتایج جستوجو بر اساس همین ورودی term از سرور دریافت میشوند.
حالا اگر مانند خط زیر در همان صفحه عبارت مقدار ورودی term نیز نمایش داده میشود:
1 2<p>You searched for: gift</p> 3 4
شکارچی میتواند با تزریق کد مخربی مانند یک تگ script به عنوان ورودی term در این نمونه:
https://insecure-website.com/search?term=<script>/+Bad+stuff+here...+/</script>
پاسخ را به شکل زیر دریافت کند:
1 2<p>You searched for: <script>/* Bad stuff here... */</script></p> 3 4
تا متوجه وجود آسیبپذیری XSS Reflected شود. همانطور که میبینید کد مخرب به جای gift که مقدار ورودی term بود جا خوش کرده است. این بدین معنی است که این کد اسکریپت اجرا شده است.
چند ترفند جاوا اسکریپتی:
از آنجا که معمولا اسکریپتهای جاوا اسکریپت در مرورگرها قابلاجرا هستند، شناخت عمیقتر و بیشتر زبان جاوا اسکریپت، مهارت کشف و اکسپلویت آسیبپذیری XSS را نیز ارتقا میبخشد. چراکه مهارت در جاوا اسکریپت، نوشتن اسکریپتهایی برای اکسپلویت و نفوذ را برای شما آسان میکند.
رایجترین و سادهترین اسکریپت، نمایش یک هشدار یا alert است. چند تابع و خصیصه از زبان جاوا اسکریپت که میتوانند در کشف و اکسپلویت این آسیبپذیری کمککننده باشند، عبارتند از:
1 2document.write() 3document.writeln() 4document.domain 5someDOMElement.innerHTML 6someDOMElement.outerHTML 7someDOMElement.insertAdjacentHTML 8someDOMElement.onevent 9 10 11 12add() 13after() 14append() 15animate() 16insertAfter() 17insertBefore() 18before() 19html() 20prepend() 21replaceAll() 22replaceWith() 23wrap() 24wrapInner() 25wrapAll() 26has() 27constructor() 28init() 29index() 30jQuery.parseHTML() 31$.parseHTML() 32 33
چگونه میتوان آسیبپذیری XSS Reflected را رفع کرد؟
روش ویژهای برای رفع آسیبپذیری XSS Reflected وجود ندارد. حساسیت بر روی اعتبارسنجی مناسب ورودیها، بهترین راهکار برای رفع و جلوگیری از بروز آسیبپذیری XSS Reflected است، پس اقدامهای ممکن از این قرار خواهند بود:
تا جای ممکن، اعتبارسنجی مقادیری که از سمت پارامترهای ورودی به سرور ارسال میشوند را سختگیرانهتر انجام دهید.
مقادیری از همان ورودیها که از سمت سرور آمدهاند و در صفحه نمایش داده میشوند را به صورت ایمن نمایش دهید تا به صورت کد در صفحه اجرا نشوند.
در مطلب «کنترل ورودی کاربر، چرا و چگونه؟»، دربارهی اهمیت کنترل ورودیهای کاربر، بیشتر نوشتهایم.
سخن آخر
همانطور که گفتیم، گونهی Reflected آسیبپذیری XSS شباهتها و تفاوتهایی با دو گونهی DOM-Based و Stored دارد. به همین دلیل، در دستههای مختلفی از ردهبندی آسیبپذیری VRT قرار میگیرد. دلیل عمدهی بروز این آسیبپذیری، عدم اعتبارسنجی صحیح برای ورودیهای سمت کاربر و سمت سرور است. امیدواریم که این مطلب راهنمای خوبی برای شما شکارچی عزیز در مسیر شکار آسیبپذیری XSS Reflected و امنتر ساختن سامانهها باشد.
منابع:
https://portswigger.net/web-security/cross-site-scripting/reflected
https://www.imperva.com/learn/application-security/reflected-xss-attacks/