شرکت ایران سرور یکی از شرکت های ارائه دهنده خدمات هاستینگ و ثبت دامنه است. تقریبا چند ماه پیش زمانی که میخواستم یک دامنه از سایتشون بخرم به صورت اتفاقی با آسیبپذیری Reflected XSS مواجه شدم. این آسیبپذیری به هکر اجازه میده اکثر کارهایی که کاربر میتونه با مرورگرش انجام بده رو با کد جاوا اسکریپت انجام بده. مثلا ایجاد تیکت، تعلیق سرویس، تغییر اطلاعات حساب کاربری و غیره. سناریوی اصلی حمله این بود که با دادن لینک حاوی Payload به قربانی، اطلاعات شماره تلفن و ایمیل فرد عوض کنی و با استفاده از فراموشی رمزعبور وارد حساب کاربری قربانی بشی. البته خیلی ممنون از تیم فنی ایران سرور که خیلی سریع و با روی باز آسیبپذیری پتچ کردند و هدیهای هم به رسم یاد بود دادند.
شرح آسیب پذیری:
به صورت کلی آسیبپذیری XSS (Cross Site Scripting) زمانی اتفاق میافته که هکر بتونه کنترل بین مرورگر کاربر با نرم افزار تحت وب مقصد در اختیار بگیره. که باز خود آسیب پذیری XSS انواع مختلفی داره که تو اینجا قراره به نوع Reflected XSS بپردازیم.
نوع Reflected آسیبپذیری XSS یکی از رایجترین انواع این آسیبپذیری است. این آسیبپذیری زمانی رخ میده که نرم افزار تحت وب اطلاعاتی که دریافت میکند را در پاسخ خود و به صورت ناامن نمایش میدهد. برای مثال درخواست زیر در نظر بگرید:
https://example.ir/search?q=test
زمانی که این درخواست به برنامه تحت وب ارسال میشه در پاسخ حالت زیر به وجود میاد:
<input name="search-box" value="test"/>
حالا اگر برنامه تحت وب فیلترینگ مناسبی روی پارامتر ورودیاش نداشته باشد، هکر میتواند ورودی را به صورت زیر تغییر دهد:
https://example.ir/search?q=test"+autofocus+onfocus=alert(document.domain)+x="
در این صورت پاسخ برنامه به صورت زیر خواهد بود:
<input name="search-box" value="test" autofocus="" onfocus="alert(document.domain)" x="" />
از autofocus استفاده کردم برای اینکه focus برنامه به صورت خودکار بیارم روی این تگ. در قسمت onfocus ها که یک event listener هست گفتم پیلود مورد نظرم اجرا بشه.
نکته: تو باگ بانتیها معمولا از alert کردن document.domain استفاده میکنند به جهت اینکه قلمرو یا همون Scope آسیبپذیری مشخص باشه.
تکنیک Prefilled Form Input:
بعضی وبسایت ها با استفاده از پارامتر های داخل درخواستهای GET فیلدهای فرمها را پر میکنند. برای مثال با درخواست آدرس https://example.ir/userprofile/change-email فرمی به شکل زیر برای کاربر به نمایش درمیاد:
<form>
<input name="email" id="user-email" value=""/>
</form>
در صورتی که برنامهنویس بخواد که ایمیل کاربر در فرم به صورت پیشفرض نمایش بده میتونه از تکنیک های مختلفی استفاده کند. یکی از متدهایی که میتواند پیاده سازی کند به این صورت است که پارامتر های فرم را در URL ارسال و در فرم نمایش دهد. مثلا اگر آدرس example.ir/change-email?email=test@gmail.com درخواست شود برنامه فرم را به صورت زیر چاپ میکند:
<form>
<input name="email" id="user-email" value="test@gmail.com" />
</form>
خب حالا از همین قابلیت میشه استفاده کرد تا بتوان حملات XSS پیادهسازی کرد. آسیبپذیری که در ایران سرور پیدا کردم از همین تکنیک استفاده شده بود.
حالا بریم سراغ فرآیند خرید یک دامنه از ایران سرور. توی سایت ایران سرور یک فیلد وجود داره که میتوان اسم دامنه مورد نظر انتخاب کرد.
بعد از وارد کردن نام دامنه روی دکمه جستجو کلیک میشه و در نهایت نتیجه کار به صورت زیر هست:
این فرآیند با استفاده از AJAX انجام میشه و در URL نهایی هم میبینیم که خبری از پارامتری در URL نیست که بخواهیم تست XSS بگیریم. اما بریم اسم فیلد سرچ دامنه را در بیاریم تا تست Prefilled Form بگیریم.
اسم تگ input در اینجا “search-domain” است. در نتیجه URL نهایی برای تست میشه این:
https://www.iranserver.com/?search-domain=test.ir/
حالا باید ببینیم که سمت آیا این تکنیک اینجا جواب میده یا نه! تست میکنیم:
همانطور که در تصویر قابل مشاهده است این تکنیک اینجا جواب میده و فقط باید دید که برنامه نویس فیلتری اینجا گذاشته یا نه. خب در این مورد برنامه نویس هیچ فیلتری نگذاشته بود و با یک exploit ساده میشد حمله XSS پیاده سازی کرد.
در نهایت یک ویدیو هم آماده کردم که این فرآیند کامل توضیح داده شده.
عالی??
سلام بسیار عالی بود ممنون
عالی ایول دمت گرم?
عالی کاش منم مثل شما حرفه ای بودم
عالی بود خیلی ممنون