تا حالا شده دوستتون رمز اکانت شما رو به صورت ناخواسته تغییر بده یا بدون اینکه شما متوجه بشین، به حساب کاربری شما دسترسی داشته باشه؟ نوعی از حملات در دنیای امنیت وجود داره که از طریق فریب دادن فرد قربانی انجام میشه و فرد قربانی به صورت ناخواسته کارهایی رو انجام میده که حمله رو برای فرد نفوذگر راحت میکنه. تو این مقاله قصد دارم در مورد یکی از این دست حملات، حملهی Clickjacking صحبت کنم.
حملات Clickjacking
فرض کنید وارد سایتی میشید و ناگهان پیام جذابی رو صفحه ظاهر میشه. مثلا با این مضمون که تنها تا آخر امروز فرصت دارید برای استفاده از تخفیف 90 درصدی دورههای آکادمی راوین و ازتون بخواد برای استفاده از تخفیف، روی لینکی کلیک کنید. خود من قطعا اولین نفری هستم که روی این لینک کلیک میکنم تا تخفیف 90 درصدی دورههای آکادمی راوین رو بگیرم :دی
طبعا وقتی کلیک کردیم، منتظریم تا کد تخفیف به ما داده بشه؛ ولی ناگهان میبینیم که نه تنها کد تخفیفی به ما داده نمیشه، بلکه به صورت ناخواسته اکانت فیسبوک ما هم حذف شد. حالا تو همچین فرضی، بریم بررسی کنیم که چه اتفاقاتی میافته که این بلا سر ما میاد.
تو حملهی Clickjacking در واقع کاربر در صفحه روی لینک، دکمه، عکس و...کلیک میکنه و انتظار داره عملی رو که درخواست داده اجرا بشه (تو این مثال گرفتن تخفیف 90 درصدی از آکادمی راوین)، اما درخواست دیگهای اجرا میشه (حذف حساب کاربری فیسبوک). این فرآیند میتونه منجر به انتقال وجه، دریافت توکن احراز هویت، تغییر رمز عبور، حذف اطلاعات، اضافه کردن اطلاعات، دریافت اطلاعات کاربر، افزایش لایک و.... به صورت ناخواسته بشه. اینجا یه سوال پیش میاد اکه این حمله چگونه پیادهسازی شده؟ چی شد که ما درخواست کد تخفیف 90 درصدی آکادمی راوین رو دادیم اما اکانتمون توی فیسبوک حذف شد؟ سناریوی حملهی Clickjacking به این صورته:
این حمله وقتی انجام میشه که 2 شرط زیر برقرار باشه:
- اول اینکه فرد قربانی باید تو سایت موردنظر لاگین باشه. مثلا وارد حساب کاربری فیسبوک خودش شده باشه. توجه داشته باشیم که هر صفحه یا هر بخشی از سایت ممکنه این آسیب پذیری رو داشته باشه ولی هدف ما پیدا کردن قسمتهایی از سایت هست که بتونیم با پیدا کردن ClickJacking به یک آسیبپذیری با impact بالا برسیم.
- دوم اینکه اون صفحهای که میخوایم مورد هدف قرار بدیم از طریق تگ Iframe در دسترس باشه تا بتونیم محتوای صفحهی مورد نظر رو در Iframe لود کنیم. مثلا تو مثال بالا بتونیم درخواست Delete Account Facebook رو تو تگ Iframe بارگذاری کنیم. اینکه آیا هر صفحهای رو میتونیم تو تگ Iframe بارگذاری کنیم یا نه، جلوتر به صورت کامل توضیح داده میشه.
سناریو حملات Clickjacking به صورت ساده
- تو مرحلهی اول فرد نفوذگر اقدام به طراحی دام جذابی میکنه که فرد رو مشتاق به بازدید از اون کنه. مثلا " دریافت کد تخفیف فقط تا پایان امروز ".
- تو مرحلهی دوم لینک رو از طریق ایمیل، چت و سایر روشهای مهندسی اجتماعی برای قربانی ارسال میکنه.
- درصورتی که فرد قربانی وارد لینک ارسال شده بشه، بهعنوان مثال پیامی دریافت میکنه مبنی بر "برای تخفیف 90 درصدی دورههای آکادمی راوین روی لینک زیر کلیک کنید و کد تخفیف رو دریافت کنید ".
- خب اینجا اگه فرد قربانی روی لینک کلیک کنه درواقع روی دریافت کد تخفیف کلیک نمیکنه و داره یه Iframe با opacity=0 (شفافیت) رو کلیک میکنه که دقیقا زیر اون قسمت دریافت کد تخفیف قرار گرفته تا فرد قربانی رو مجبور به انجام درخواستی ناخواسته کنه (مثل حذف اکانت فیسبوک).
کد مربوط به صفحهی مخرب تقریبا شبیه به کد بالاست. ما iframe رو به صورتی بارگذاری میکنیم که شفافیت اون صفر هست. یعنی اصلا مشخص نیست تو صفحه وجود داره و همچنین اون رو با تنظیمات Css جایی قرار میدیم که فرد قربانی میخواد کلیک کنه.
خب بریم یه سناریو عملی و کاربردی رو ببینیم که اکثرا سایتها با این روش مورد حمله قرار میگیرن.
مثال: فرض کنید فرد قربانی تو سایت portal لاگینه و درصورتی که به مسیر /profile/get_token درخواست بزنه، توکن احراز هویت رو به اون نشون میده.
از اونجایی که هیج مکانیزمی برای جلوگیری از بارگذاری این صفحه داخل Iframe انجام نشده، به راحتی میتونیم این Authorization_Token رو تو سایت مخرب درون Iframe بارگذاری کنیم. خب الان توکن روی سایت مخرب درون تگ Iframe بارگذاری شد. به نظرتون الان به توکن دسترسی داریم؟؟ جواب منفیه. زمانی که توکن درون iframe بارگذاری میشه، ما نمیتونیم از طریق جاوا اسکریپ به اون دسترسی داشته باشیم و برای خودمون ارسالش کنیم. عکس بالا رو ببینید. ما دسترسی به محتوایIframe نداریم. اونم به خاطر مکانیزم SOP هست که اجازه نمیده محتوای Iframe رو از طریق جاوا اسکریپت بخونیم. راه حل چیه؟ برای Exploit این آسیبپذیری باید چیکار کنیم؟ درواقع برای این کار باید به طریقی کاربر رو فریب بدیم تا محتوای داخل Iframe رو داخل Textarea یا قسمت دیگهای کپی کنه. زمانی که عملیات کپی انجام شد، دیگه به اون محتوا دسترسی داریم و میتونیم از طریق کدهای جاوااسکریپت مقدار توکن رو بخونیم. روشهای مختلفی وجود داره که شما صفحهی جذابی طراحی کنید تا کاربر به طریقی محتوای Iframeرو داخل Text Area کپی کنه. مثلا میتونید مثل عکس بالا صفحه رو جوری طراحی کنید تا کاربر آشغال رو بگیره و بندازه تو سطل آشغال. پشت این بازی کدی نوشته شده که محتوای Iframe رو تو text Area کپی میکنه. یعنی کاربر فکر میکنه کاغذ رو داره میندازه تو سطل آشغال درصورتی که داره محتوای Iframe رو تو textarea کپی میکنه، یا مثلا recaptcha بذارید تو سایت که کاربر recaptcha رو بزنه محتوا کپی بشه. در اینجا من به صورت دستی این کد رو تو قسمت Text Area کپی میکنم که صرفا ببینید چه اتفاقی میافته و نحوهی نوشتن Exploit حرفهای رو به عهده خودتون میذارم. این مثالی که در اینجا بررسی شد، فقط یک نمونه از پیادهسازی این نوع حملاته و در باگبانتی، هدف ما اینه تا حد امکان User Interaction رو پایین بیاریم و از تکنیکهای پیشرفتهتری استفاده کنیم بدون اینکه قربانی متنی رو از داخل iframe به جای دیگه کپی پیست کنه.
لان با توجه به اینکه محتوای Iframe تو Textarea کپی شد، دیگه میتونیم از طریق کدهای جاوااسکریپت به اون دسترسی داشته باشیم.
تا اینجا توضیح دادم که آسیب پذیری Clickjacking چی هست و چطوری میتونیم این آسیبپذیری رو exploit کنیم. بریم ببینیم چطوری میتونیم از این آسیبپذیری جلوگیری کنیم.
جلوگیری از حملات Clickjacking
X-Frame-Options -1
هدر X-Frame-Options درواقع تو پاسخ سمت کاربر فرستاده میشه که مشخص میکنه آیا صفحهی شما میتونه از طریق تگ Frame و یا Ifarme نمایش داده بشه یا نه. سرآیند X-Frame-Options میتونه شامل یکی از مقادیر زیر باشه:
- DENY: صفحه نمیتونه داخل Iframe نمایش داده بشه.
- SAMEORIGIN: صفحه فقط میتونه توی Iframe سایت هایی نمایش داده بشه که دارای Orogin یکسان هستند.
- ALLOW-FROM-URI: صفحه فقط میتونه توی Iframe وبسایتهای مشخصشده نمایش داده بشه.
تو این مثال چون مقدار هدر X-Frame-Optionsبرابر با DENY قرار گرفته، دیگه هیچ جایی نمیتونه داخل Iframe بارگذاری بشه.
2- Content-Security-Policy
هدرهای CSP هم هر کدوم برای هدف خاصی استفاده میشن که در بحث جلوگیری از حملهی ClickJacking از هدر frame-ancestors استفاده میشه و میتونیم مشخص کنیم آیا وبسایت ما میتونه از طریق تگ Frame و یا Ifarme نمایش داده بشه یا نه. برای تعیین نمایش یا عدم نمایش محتوا از طریق تگ Frame و یا Iframe میشه از یکی از مقادیر زیر استفاده کرد.
- ‘Content-Security-Policy: frame-ancestors ‘none : صفحه نمیتونه در Iframe نمایش داده بشه.
- ’Content-Security-Policy: frame-ancestors ‘self: صفحه فقط میتونه در Iframe Iframe سایتهایی نمایش داده بشه که دارای Orogin یکسان هستند.
- *Content-Security-Policy: frame-ancestors *uri: صفحه فقط میتونه در Iframe وبسایتهای مشخصشده نمایش داده بشه.
خب تا الان فک کنم با مفهوم حملات Clickjacking آشنا شده باشین. اگه یک درصد هنوز کامل متوجه نشدین با دو تا عکس زیر حمله Clickjacking رو به صورت کامل درک میکنید. توی شکل بالا همانطور که میبینید فرد نفوذگر از طریق یک تگ Iframe اقدام به نمایش صفحهی پورتال سازمان کرده، اما به دلیل اینکه توی پاسخ هدر X-Frame-Option: Same Origin ارسال شده، امکان مشاهدهی این صفحه از طریق یک تگ Iframe در این سایت نیست، صفحه دیده نمیشود.
اما تو این شکل به دلیل اینکه هیچ سرآیندی توی پاسخ ارسال نشده، صفحهی پورتال به راحتی در تمام وبسایتهای دیگه ازجمله وبسایت فرد نفوذگر داخل تگ Iframe در دسترسه و فرد نفوذگر میتونه توکن احراز هویت قربانی رو به دست بیاره.
امیدوارم این مقاله براتون مفید بوده باشه و همچنین خوشحال میشم نظراتتون رو درمورد این مقاله بنویسید تا بتونیم مقالههای بعدی رو با کیفیت بهتر بنویسیم.