قسمت اول از سهگانهی آسیبپذیری XSS؛ XSS DOM-Based
در مطالب پیشین به اکثر آسیبپذیریهای نوع Injection پرداختیم. حالا و در این مطلب، میخواهیم به سراغ آسیبپذیریای برویم که در سال ۲۰۲۰، با فراوانی ۲۳٪، فراوانترین نوع آسیبپذیری گزارششده درمیان گزارشهای ارسالی به هکروان، بوده است.
آسیبپذیری XSS یا همان Cross Site Scripting
بنابراین میتوان نتیجه گرفت که شکار هر مورد این آسیبپذیری مانند سفر به ماه است. شاید سخت باشد اما طرفداران زیادی دارد که در نتیجهی ارزش آسیبپذیری است. این آسیبپذیری یکی از مطرحترین آسیبپذیریهای دستهی Injection است که بسیاری از سامانهها دچارش هستند و از این طریق موردنفوذ قرار میگیرند. گونهي DOM-Based این آسیبپذیری اغلب مربوط به سمت کاربر است. در صورت وجود این آسیبپذیری، مهاجم با استفاده از تزریق اسکریپتهای مخرب سعی میکند تا به سامانه و همچنین حسابهای کاربری بقیهی کاربران نفوذ کند.
در این مطلب؛
• از معرفی آسیبپذیری XSS شروع میکنیم،
• به بررسی گونهی DOM-Based آن میپردازیم،
• با عبور از روشهای کشف آسیبپذیری XSS به ویژه گونهی DOM-Based آن
• به نحوهی اکسپلویت آسیبپذیری XSS DOM-Based میرسیم،
• و در پایان با ابزار کشف و اکسپلویت آسیبپذیری XSS آشنا خواهیم شد.
مطلبی که با هم مطالعه میکنیم برداشتی آزاد و خلاصه از منابع معتبری مانند portswigger، owasp و acunetix است.
قرار است موشکافانه به موارد مرتبط XSS به ویژه گونهی DOM-Based آن نگاهی بیندازیم . با ما همراه باشید
آسیبپذیری XSS چیست؟
آسیبپذیری XSS را از آنجایی که امکان دستکاری یا تزریق به محتویات فایلهای دریافتی کاربر را برای شکارچی فراهم میکند، در دستهبندی آسیبپذیریهای تزریقی یا Injection قرار میدهند.
شکارچی با استفاده از زبانهای مختلف اسکریپتی و با دستکاری کد صفحات از طریق تزریق یک اسکریپت خارجی مخرب که معمولا به زبان جاوا اسکریپت نوشته میشود، سبب ایجاد تغییر در صفحات پویا میشود. پس از آن در مواقعی که هر کاربری به آن صفحه مراجعه کند، به طور خودکار آن اسکریپت اجرا میشود و شکارچی به هدف خود یعنی دانلود اسکریپت مخرب و اجرای خودکار آن در مرورگر کاربر میرسد. آن اسکریپت معمولا حاوی کدهایی جهت اجرای عملیاتهای مخرب است. به عنوان نمونه اسکریپت میتواند مانند یک کیلاگر یا Keylogger عمل کند و ورودیهای صفحهکلید کاربر را دریافت و به سرور ارسال کند.
شکارچی با اکسپلویت آسیبپذیری XSS میتواند بسیاری از اقدامات مخرب را پیادهسازی کند. بسته به سطح دسترسیای که پس از اکسپلویت این آسیبپذیری به دست میآید، این آسیبپذیری میتواند منجر به افشای اطلاعات محرمانهای مانند اطلاعات حساس مشتریان، خروجیهای پردازشهای انجامشده بر روی آن اطلاعات، نمایش پیام در صفحه و دیفیس آن شود.
این آسیبپذیری سه گونهی اصلی دارد که عبارتند از:
• DOM-Based
ما در این مطلب، به گونهی DOM-Based آن میپردازیم و در مطالب بعدی به دو گونهی دیگر خواهیم پرداخت
ارزش آسیبپذیری XSS
آسیبپذیری XSS از حدود سال 2017 وارد لیست OWASP TOP 10 شد و به سرعت در مرتبهی هفتم جای گرفت و در سالهای بعد نیز رتبهی پنجم را ازآن خود کرد. هرروزه آسیبپذیریهای گوناگونی کشف و اکسپلویت میشوند و هرکدام از آنها بسته به میزان دسترسیای که به پایگاهداده فراهم میکنند، درجهبندی میشوند. آسیبپذیری XSS به طور مستقیم با پایگاهداده در ارتباط نیست اما به عنوان نمونه امکان نفوذ به حسابهای کاربری بقیهی کاربران با دسترسی بالاتر را برای شکارچی فراهم میکند. به همین دلیل است که درجهی آسیبپذیری XSS معمولا زیاد در نظر گرفته میشود.این آسیبپذیری به علت گستردگیاش به طور مستقل از دستهی Injection در این لیست آورده میشود. همهی آنچه گفتیم نشان از خطرناک بودن این آسیبپذیری دارد و گویای این است که تسلط هرچهبیشتر به این آسیبپذیری، تاچه اندازه به توانایی شکارچی میافزاید.
شکارچی با آسیبپذیری XSS میتواند:
• هر عملیاتی که کاربران عضوشده در یک سامانه، به ویژه کاربران خاص با دسترسی بالا، میتوانند انجام دهند را انجام دهد.
• به همهی دادههایی که کاربر عضو میتواند به آنها دسترسی پیدا کند، دسترسی داشته باشد؛ آنها را بخواند یا ...
• خود را به جای کاربر دیگری جا بزند و به حساب کاربری او نفوذ کند.
• یک بدافزار به وبسایت تزریق کند تا مراجعه کنندگان نیز آلوده شوند. مهاجم میتواند به وسیلهی بدافزار جاسوسی کند یا اطلاعاتی را، حتی بدون آگاهی کاربر قربانی، به دست آورد.
• اطلاعات ورود یا لاگین کاربر را بخواند و ذخیره کند.
• وبسایت را دیفیس کند.
در مطلب «چگونه آسیبپذیری در راورو ارزشگذاری میشود؟» میتوانید دربارهی معیارهای ارزشگذاری آسیبپذیریهای مختلف بیشتر بخوانید.
چگونه میتوان وجود آسیبپذیری XSS DOM-Based را بررسی و اکسپلویت کرد؟
آسیبپذیری XSS DOM-Based بیشتر توسط اسکنر نرمافزار Burp Suite بررسی میشود. این ابزار میتواند ابزار خوبی برای کشف و اکسپلویت این آسیبپذیری باشد.
اما اگر بخواهیم آسیبپذیری XSS DOM-Based را بهصورت دستی بررسی کنیم، موارد زیر میتوانند کمک کننده باشند:
روش اول: آیا فرم ورودی در صفحه میبینید؟ اگر فرم وجود دارد، با وارد کردن مقادیر خاصی و ارسال آن تغییری در لود صفحه مشاهده میکنید؟ به عنوان نمونه نمایش همان ورودی.
روش دوم: آیا امکان مقداردهی ورودیها از طریق URL وجود دارد؟ اگر به یکی از ورودیها مقداری اختصاص دهید تغییری در لود صفحه مشاهده میکنید؟
مواردی که گفته شد از جمله مهمترین روشهایی هستند که میتوانند در کشف آسیبپذیری XSS DOM-Based کمک کنند. این آسیبپذیری بر پایهی نقص در اعتبارسنجی ورودیها استوار است و شکارچی میتواند با استفاده از ورودیهای صفحه مقادیر لازم را تزریق کند. به عنوان نمونه اگر وبسایت از روش دوم آسیبپذیر باشد، شکارچی میتواند با تزریق اسکریپت مخرب خود به مقادیر ورودی و یا حتی پیام دیفیس، لینک صفحه را که متشکل از همهی آن ورودیهای مقداردهیشده است، از راههای مختلف برای کاربر هدفش ارسال کند تا او پس از گشودن لینک قربانی شود.
به عنوان نمونه، به یک سناریوی ساده برای این آسیبپذیری میپردازیم:
فرض کنید کادری برای جستوجو در صفحه قرار دارد و دکمهی جستوجو نیز دیده میشود. هر آنچه که در این کادر وارد شود، موردپردازش قرار میگیرد و به عبارت بهتر مقادیر ورودی اعتبارسنجی نمیشود. این چه فرصتی را برای یک شکارچی فراهم میکند؟ یعنی با استفاده از خصیصههای موجود تگ input میتواند وجود آسیبپذیری XSS DOM-Based را مورد بررسی قرار دهد؛ مقادیری را در کادر وارد کند و روی دکمهی جستوجو کلیک کند.
اگر پس از کلیک، ببینید که در قسمتی از صفحه، یا بالای نتایج جستوجو و یا حتی زیر کادر جستوجو، مقداری که وارد کردهایم در ادامهی متن «شما این کلمه را جستجو کردهاید:» قرار گرفته است، متوجه چه چیزی میشویم؟
با این شواهد، احتمال وجود آسیبپذیری در نظرمان بالاتر میرود. اما هنوز وجود آسیبپذیری به طور قطعی ثابت نشده است.
حالا تگهای مختلفی که میتوان از آنها استفاده کرد را در کادر جستوجو وارد میکنیم. با این کار در حقیقت کدهای زیر در مرورگر اجرا میشوند:
1var search = document.getElementById('search').value; 2var results = document.getElementById('results'); 3results.innerHTML = 'شما این کلمه را جستجو کردهاید: ' + search; 4
همانطور که میبینید، مقدار ورودی در کادر جستوجو دریافت، مستقیما به قسمتی از صفحه ارسال و نمایش داده میشود. اگر مقدار ورودی یک رشتهی متنی نباشد و یک اسکریپت مخرب باشد، میتواند در صفحه اجرا شود و به مرحله عملیاتی در بیاید. مانند نمونهی زیر:
1<img src=1 onerror='/* اسکریپت مخرب */'> 2
رایجترین و سادهترین اسکریپت نمایش یک هشدار یا alert است. چند تابع و خصیصههایی از زبان جاوا اسکریپت که در کشف و اکسپلویت این آسیبپذیری میتوانند کمک کنند، عبارتند از:
1document.write() 2document.writeln() 3document.domain 4someDOMElement.innerHTML 5someDOMElement.outerHTML 6someDOMElement.insertAdjacentHTML 7someDOMElement.onevent 8 9add() 10after() 11append() 12animate() 13insertAfter() 14insertBefore() 15before() 16html() 17prepend() 18replaceAll() 19replaceWith() 20wrap() 21wrapInner() 22wrapAll() 23has() 24constructor() 25init() 26index() 27jQuery.parseHTML() 28$.parseHTML() 29
برای کشف و اکسپلویت آسیبپذیری XSS از چه ابزارهایی میتوانید کمک بگیرید؟
معمولا در کشف و اکسپلویت آسیبپذیری XSS بهترین ابزار برنامهی BurpSuite است، اما ابزار دیگری هم وجود دارد که میتواند تا حد بسیاری به طور خاص در اکسپلویت آسیبپذیری XSS یار شکارچی باشد:
FinDOM-XSS
این ابزار به صورت شل اسکریپت نوشته شده است. شیوهی کار ابزار FinDOM-XSS به این صورت است:
آدرس صفحه مدنظر را دریافت میکند، با بررسی ورودیهای صفحه، وجود آسیبپذیری XSS را مورد بررسی قرار میدهد و نتیجه را به کاربر نمایش میدهد.
دانلود و راهنمای ابزار:
https://github.com/dwisiswant0/findom-xss.git
البته شایان ذکر است که در این باره باید توجه داشت که این ابزار میتواند در فرآیند کشف و قابل بهرهجوییبودن آسیبپذیری XSS مورداستفادهی شکارچی قراربگیرد، اما استفاده از ابزارهای آماده در گزارش آسیبپذیری XSS فاقد ارزش است.
در مطلب «چگونه گزارش آسیبپذیری بنویسیم؟» مفصلتر به بایدها و نبایدهای یک گزارش آسیبپذیری پرداختهایم.
روشهای رفع آسیبپذیری XSS کدامند؟
روش ویژهای برای رفع آسیبپذیری XSS DOM-Based وجود ندارد و اعتبارسنجی مناسب ورودیها بهترین راه برای رفع آسیبپذیری XSS DOM-Based است؛ به ویژه بهتر است از دریافت دادههایی از آدرس نامطمئن که میتواند منجر به دانلود و یا اجرای اسکریپت مخرب شود، جلوگیری شود.
در مطلب «کنترل ورودی کاربر، چرا و چگونه؟»، دربارهی اهمیت کنترل ورودیهای کاربر، بیشتر نوشتهایم.
سخن آخر
به طور کلی، ماهیت آسیبپذیریهای دستهی Injection را میتوان ایجاد انحراف در روند عادی عملیاتهای یک سامانه دانست. عامل این انحراف نیز همان مواردی هستند که باید به سامانه و در روند عادی تزریق شوند.
اصولا هرچه شکارچی بر زبانهای برنامهنویسی تحت وب به ویژه جاوا اسکریپت، روشهای کار با آنها و توابع و خصیصههای جاوا اسکریپت مسلطتر باشد، در کشف و اکسپلویت آسیبپذیری XSS موفقتر خواهد بود. روشهای کشف و اکسپلویت آسیبپذیری XSS کاملا به صورت دستی قابل انجام است و در فرآیند کشف و اکسپلویت، ابزارهای معرفی شده در کنار نکات و نمونهها میتوانند یاریگر شکارچی باشند. امیدواریم که شما شکارچی عزیز بتوانید از نکات و ترفندهای مطرح شده استفاده کنید و در مسیر شکار و در شکارگاههای مختلف آسیبپذیری XSS بیشتری را کشف و بانتیهای بیشتری را دریافت کنید (؛