قسمت دوم از سهگانهی آسیبپذیری XSS؛ XSS Stored
در مطلب آسیبپذیری XSS DOM-Based به گونهای از آسیبپذیری XSS پرداختیم که مربوط به سمت کاربر بود؛ شکارچی با سمت سرور ارتباط خاصی نداشت و با تزریق ورودیهایی به فیلدهای ورودی سامانه، برای مواردی مانند، سرقت اطلاعات ورود کاربران، تلاش میکرد. در این مطلب به گونهی دیگری از آسیبپذیری XSS میپردازیم؛ آسیبپذیری XSS Stored. گرچه نقص در اعتبارسنجی ورودیها میتواند مهمترین علت بروز آسیبپذیری XSS Stored باشد، اما شکارچی در آن اغلب با سمت سرور در ارتباط است.
آنچه در این بلاگپست خواهید خواند:
در این بلاگپست که برداشتی آزاد و خلاصه از منابع معتبری مانند portswigger، owasp، linuxsecurity و hackerone است، موارد زیر پیش روی شما هستند؛
• معرفی گونهی Stored آسیبپذیری XSS
• معمولا چه نقاطی از سامانهها نسبت به XSS Stored آسیبپذیرترند؟ + رایتاپ نمونه برای هر کدام
• ارزش آسیبپذیری XSS Stored
• معرفی ابزارهای محبوب برای کشف و اکسپلویت آسیبپذیری XSS Stored
• روش دستی کشف و اکسپلویت آسیبپذیری XSS Stored + مرور یک سناریوی ساده به عنوان مثال
• معرفی چند تابع و خصیصهی کمککننده در کشف و اکسپلویت این آسیبپذیری از زبان جاوا اسکریپت
• چگونگی رفع آسیبپذیری XSS Stored
همراه ما باشید ؛)
آسیبپذیری XSS Stored چیست؟
آسیبپذیری XSS Stored یکی از سهگانهی آسیبپذیری تزریقی XSS است. در گونهي Stored آسیبپذیری XSS، شکارچی با ارسال و ذخیرهی اسکریپت مخرب خود در سمت سرور در قالب محتوای متنی یا حتی چند رسانهای، سبب اجرای آن اسکریپت هنگام ایجاد صفحات مربوط میشود. در مواردی نیز شکارچی میتواند از گونهی Stored مانند گونهی DOM-Based استفاده کند و از این طریق به سامانه و همچنین حسابهای کاربری بقیهی کاربران نفوذ کند و یا حتی سبب بروز آسیبپذیریهای ثانویهای شود که میتواند نشت اطلاعات در سمت سرور را موجب شود.
در چه نقاطی از سامانهها به دنبال آسیبپذیری XSS Stored بگردیم؟
در جواب سوال "احتمال کشف آسیبپذیری XSS Stored در چه نقاطی از وبسایتها بیشتر است؟" میتوان گفت: "در نقاطی از وبسایت که لازم است کاربر اطلاعاتی را وارد کند و دارای فرم و فیلدهایی برای واردکردن اطلاعات توسط کاربراست؛ به ویژه فرمهایی که اطلاعات آنها پس از کلیک بر روی دکمه ارسال، در پایگاه داده و یا به طور کلی سمت سرور ذخیره شوند. "
چند نقطهای که پتانسیل بالایی برای کشف آسیبپذیری XSS Stored دارند، عبارتند از:
• صفحهی پروفایل: این صفحه معمولا امکان افزودن و ویرایش اطلاعات را به کاربر میدهد که از این نظر امکان ارسال دادهی مخرب وجود دارد و به همین منظور فرمهای ورودی پتانسیل بروز آسیبپذیری XSS Stored را خواهند داشت.
در رایتاپ زیر، میتوانید مثالی از چگونگی کشف و اکسپلویت آسیبپذیری XSS Stored در صفحهی پروفایل را مطالعه کنید:
https://hackerone.com/reports/484434
• سبد آنلاین خرید: تمام عناصر مربوط به سبد خرید فروشگاههای اینترنتی میتوانند پتانسیل بروز آسیبپذیری XSS و به ویژه گونهی Stored آن را داشته باشند.
در رایتاپ زیر، میتوانید مثالی از کشف آسیبپذیری XSS Stored در سبد آنلاین خرید را مطالعه کنید:
https://hackerone.com/reports/186462
• مدیریت فایل: بخشی از سامانه که امکان آپلود فایل را برای کاربر فراهم میکند. فایل آپلودشده میتواند شامل کد خطرناک باشد و زمینهی نفوذ به سامانه را فراهم کند.
در رایتاپ زیر میتوانید بخوانید که هکر کلاهسفید چگونه با دستکاری هدر Content-Type آسیبپذیری XSS Stored را در عملیات آپلود تصویر کشف کرده است:
https://hackerone.com/reports/1019425
• انجمنها و یا فوروم: در این قسمت نیز امکان ارسال مقادیر در ورودی به عنوان تاپیک و یا متن وجود دارد که پس از آن در صفحه نمایش داده میشود.
• بخش نظرات: بخش کامنتها پتانسیل کشف آسیبپذیری XSS Stored را دارند.
در رایتاپ زیر میتوانید مثالی از کشف آسیبپذیری XSS Stored در بخش کامنتهای بلاگ، را بخوایند:
https://hackerone.com/reports/192210
لاگ یا ثبت رخدادها: ممکن است سامانهای مقادیر را به عنوان لاگ ذخیره کند که معمولا برای مدیر نیز نمایش داده میشوند و در آن صورت امکان سرقت اطلاعات لاگین مدیر فراهم خواهد بود.
رایتاپ زیر نیز سناریویی مشابه ثبت رخدادها دارد که به وسیلهی آن آسیبپذیری XSS Stored کشف شده است:
https://hackerone.com/reports/788732
آسیبپذیری XSS Stored چه میزان ارزشی دارد؟
بسته به سطح دسترسیای که پس از اکسپلویت این آسیبپذیری به دست میآید، این آسیبپذیری میتواند منجر به افشای اطلاعات محرمانهای مانند اطلاعات حساس مشتریان، خروجیهای پردازشهای انجامشده بر روی آن اطلاعات، نمایش پیام در صفحه و دیفیس آن شود. بنابراین در مورد ارزش آسیبپذیری XSS Stored میتوان گفت که این آسیبپذیری ، باتوجه به سطح دسترسیای که مهیا میکند، در ردهبندی آسیبپذیریهای VRT در یکی از دستههای P2، P3، P4 و P5 قرار میگیرد.
در مطلب «چگونه آسیبپذیری در راورو ارزشگذاری میشود؟» نیز میتوانید دربارهی معیارهای ارزشگذاری آسیبپذیریهای مختلف در راورو بیشتر بخوانید.
چگونه میتوان وجود آسیبپذیری XSS Stored را بررسی و اکسپلویت کرد؟
آسیبپذیری XSS Stored به کمک ابزار و یا بهصورت دستی قابلکشف و اکسپلویت است. ما در ادامه به هر دو راه، خواهیم پرداخت:
از چه ابزاری میتوانیم برای کشف آسیبپذیری XSS Stored استفاده کنیم؟
اگر مایلید به وسیلهی ابزار اقدام به کشف آسیبپذیری XSS Stored کنید، ابزارهای زیر میتوانند کمک بسیاری به شما بکنند:
BurpSuite
همانطور که میدانید برنامهی BurpSuite از امکانات بسیاری برای کشف آسیبپذیریهای گوناگون در یک وبسایت برخوردار است. معمولا در کشف و اکسپلویت آسیبپذیری XSS نیز اولین انتخاب هر شکارچی، استفاده از ابزار برنامهی BurpSuite است.
با کمک ابزار BurpSuite، به جای پر کردن دستی فرمها میتوان درخواستهای لازم را با تعیین مقادیر پارامترها ارسال و پاسخ سرور را دریافت کرد. اگر پاسخ دریافتشده نشان از وجود آسیبپذیری داشته باشد، میتوان در مرحلهی بعدی با ارسال مقادیر مخرب دیگری در قالب پارامترهای ورودی، آسیبپذیری را اکسپلویت کرد.
XSStrike
این ابزار به زبان پایتون نوشته شده است و در مخزن گیتهاب خود، از 10 هزار ستاره برخوردار است. شیوهی کار ابزار XSStrike به این صورت است:
آدرس صفحهی موردنظر را دریافت میکند،
با بررسی ورودیهای صفحه، وجود آسیبپذیری XSS را در آن نقاط مورد بررسی قرار میدهد
و نتیجه را به کاربر نمایش میدهد.
به همین سادگی، به همین خوشمزگی ؛)
XSStrike همچنین دارای محیط چند رنگ در خط فرمان است که در خوانایی کدها نیز کمک بسیاری میکند.
دانلود و راهنمای ابزار:
https://github.com/s0md3v/XSStrike
همانطور که میدانید ابزارها میتوانند در فرآیند کشف و بررسی قابلبهرهجوییبودن آسیبپذیری XSS مورداستفادهی شکارچی قراربگیرند، اما در ارائهی گزارش آسیبپذیری XSS ، استفاده از ابزارهای آماده آن گزارش را فاقدارزش میکند.
ما در مطلب «چگونه گزارش آسیبپذیری بنویسیم؟» مفصلتر به بایدها و نبایدهای یک گزارش آسیبپذیری استاندارد پرداختهایم.
چگونه میتوانیم وجود آسیبپذیری XSS Stored را به صورت دستی، بررسی و اکسپلویت کنیم؟
پتانسیل بروز آسیبپذیری XSS به طور کلی در نقاطی از وبسایت که دارای فرمهایی هستند بیشتر است. به طور خاص در گونهیXSS Stored ، صفحاتی که دارای فرمهایی هستند و اطلاعاتی که در آن فرمها وارد میشوند قرار است به سمت سرور ارسال شوند، نیز پتانسیل بیشتری دارند. البته ارسال ورودیها به عنوان Query Parameterهای URL نیز یکی از راههای تزریق ورودی است.
اگر بخواهیم آسیبپذیری XSS Stored را بهصورت دستی در صفحهای دارای فرم بررسی کنیم، بررسی سوالات زیر میتوانند کمککننده باشند:
• سوال اول: آیا فرم ورودی برای ذخیرهی مقادیر ورودی در سمت سرور است یا فقط برای جستجوی کلیدواژهي خاصی؟
• سوال دوم: آیا میتوانید مقادیری که در فرم وارد میکنید را در صفحهای مشاهده کنید؟
یک سناریوی ساده:
تصور کنید فرم ورودی در بخش "ارتباط با ما" و یا "نظرات" یک پست وجود دارد. همانطور که میدانید این اطلاعات قرار است در سمت سرور و در پایگاهداده ذخیره شوند. علاوه بر آن معمولا کامنتهای ارسالشده نیز در همان صفحه به نمایش در میآیند.
اگر فرم ورودی مذکور، مقادیر ورودی را مورد ارزیابی قرار ندهد و اعتبارسنجی نکند، شکارچی میتواند با ارسال کد مدنظر خود سبب ذخیرهشدن آن در پایگاهداده شود. اگر صفحهی مدنظر ما مربوط به بخش کامنتهای یک پست باشد و کامنت ارسالشده نمایش داده شود، کد مخربی که به عنوان ورودی در فرم ارسال شده و در پایگاهداده ذخیره شده بود، اینک در محل نمایش کامنت اجرا میشود.
مواردی که مطرح کردیم به چشم یک فرد معمولی، عادی و بیخطر بینظر میرسند. اما شکارچی از این زمینه چه استفادهای میتواند بکند؟
یعنی اگر یک کامنت عادی و معمولی به صورت زیر، یک رشتهی متنی باشد:
1 2<p>Hello, this is my message!</p> 3 4
شکارچی میتواند با تزریق کد مخربی مانند یک تگ script به تگ p در این نمونه:
1 2<p><script>/* Bad stuff here... */</script></p> 3 4
متوجه وجود آسیبپذیری XSS Stored شود.
چند ترفند جاوا اسکریپتی:
از آنجا که معمولا اسکریپتهای جاوا اسکریپت در مرورگر قابل اجرا هستند، شناخت عمیقتر و بیشتر زبان جاوا اسکریپت، مهارت کشف و اکسپلویت آسیبپذیری 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 Stored را رفع کرد؟
روش ویژهای برای رفع آسیبپذیری XSS Stored وجود ندارد. حساسیت بر روی اعتبارسنجی مناسب ورودیها، بهترین راهکار برای رفع و جلوگیری از بروز آسیبپذیری XSS Stored است، پس اقدامهای ممکن از این قرار خواهند بود:
تا جای ممکن، اعتبارسنجی مقادیری که از سمت فرمهای ورودی به سرور ارسال میشوند را سختگیرانهتر انجام دهید.
و مقادیری از همان ورودیها که از سمت سرور آمدهاند و در صفحه نمایش داده میشوند را به صورت ایمن نمایش دهید تا به صورت کد در صفحه اجرا نشوند.
در مطلب «کنترل ورودی کاربر، چرا و چگونه؟»، دربارهی اهمیت کنترل ورودیهای کاربر، بیشتر نوشتهایم.
سخن آخر
به طور کلی، ماهیت آسیبپذیریهای دستهی Injection را میتوان ایجاد انحراف در روند عادی عملیاتهای یک سامانه دانست. عوامل این انحراف نیز همان کدها و دستوراتی هستند که باید به سامانه و در روند عادی تزریق شوند. هرچه شکارچی بر زبانهای برنامهنویسی تحت وب (به ویژه جاوا اسکریپت) ، روشهای کار با آنها، توابع و خصیصههای جاوا اسکریپت مسلطتر باشد، در کشف و اکسپلویت آسیبپذیری XSS موفقتر خواهد بود. روشهای کشف و اکسپلویت آسیبپذیری XSS کاملا به صورت دستی قابلانجام است و در فرآیند کشف و اکسپلویت، ابزارهای معرفی شده میتوانند یاریگر شکارچی باشند. امیدواریم که شما شکارچی عزیز بتوانید از نکات و ترفندهای مطرح شده استفاده و در مسیر شکار و در شکارگاههای مختلف آسیبپذیریهای XSS بیشتری را کشف و بانتیهای بیشتری را دریافت کنید. چون جهان برای امنتر شدن را به تخصص شما نیاز دارد ؛)
منابع:
https://portswigger.net/web-security/cross-site-scripting/stored