بررسی Logout Functionality
در این بخش از دوره آموزشی OWASP-WSTG به ششمین بخش از استاندارد WSTG با شناسه WSTG-SESS-06 می پردازیم که مربوط به بررسی Logout Functionality می باشد.
خلاصه
خاتمه Session بخش مهمی از چرخه عمر Session است. کاهش حداقل طول عمر نشانههای Session احتمال حمله Session Hijacking را کاهش میدهد. این امر را میتوان به عنوان یک کنترل در برابر جلوگیری از حملات دیگر مانند XSS و CSRF در نظر گرفت. چنین حملاتی به کاربری که یک Session تصدیق شده دارد، وابسته است. عدم اتمام نشست ایمن تنها سطح حمله را برای هر یک از این حملات افزایش میدهد.
پایان Session امن حداقل به مولفههای زیر نیاز دارد:
• در دسترس بودن کنترلهای رابط کاربر که به کاربر اجازه خروج به صورت دستی را میدهد.
• اتمام Session پس از یک زمان مشخص بدون فعالیت (Timeout Session).
• ابطال مناسب وضعیت نشست در سرور.
مسائل متعددی وجود دارند که میتوانند از پایان موثر یک Session جلوگیری کنند. برای برنامه وب امن ایدهآل، کاربر باید بتواند در هر زمانی از طریق رابط کاربری، Session را به پایان برساند. هر صفحه از برنامه، باید شامل یک دکمه خروج از سیستم در مکانی مناسبی بوده که به طور مستقیم قابلمشاهده باشد و امکان خروج را فراهم سازد. عملکردهای خروج نامشخص یا مبهم میتواند باعث شود که کاربر به چنین عملکردی اعتماد نداشته باشد.
اشتباه رایج دیگر در پایان Session این است که توکن Session سمت کلاینت بر روی یک مقدار جدید تنظیم میشود در حالی که وضعیت آن در سرور فعال باقی میماند و میتواند با تنظیم کوکی Session به مقدار قبلی مجددا مورد استفاده قرار گیرد. گاهی اوقات تنها یک پیام تایید به کاربر بدون انجام هیچ اقدام دیگری نشان داده میشود. باید از این کار اجتناب شود.
برخی از چارچوبهای برنامه کاربردی وب تنها بر روی کوکی نشست تکیه میکنند تا کاربر وارد شده را شناسایی کنند. شناسه کاربر در مقدار کوکی (رمزنگاری شده) تعبیه شدهاست. برنامه هیچ گونه ردیابی را در سمت سرور برای نشست انجام نمیدهد. هنگام خروج از سیستم، کوکی نشست از مرورگر حذف میشود. با این حال، از آنجا که برنامه هیچ ردیابی انجام نمیدهد، نمیداند که آیا یک Session خارج میشود یا خیر. بنابراین با استفاده مجدد از یک کوکی نشست امکان دسترسی به نشست تصدیق شده وجود دارد. یک مثال معروف از این موضوع، قابلیت احراز هویت فرمها در ASP.NET است.
کاربران مرورگرهای وب اغلب اهمیتی نمیدهند که یک برنامه هنوز باز است و فقط مرورگر یا زبانه را میبندد. یک برنامه کاربردی وب باید از این رفتار آگاه باشد و Session را به طور خودکار در سمت سرور پس از یک زمان مشخص خاتمه دهد.
استفاده از یک سیستم single sign-on یا SSO به جای یک طرح احراز هویت برنامه خاص اغلب باعث همزیستی جلسات متعدد میشود که باید به طور جداگانه خاتمه یابد. به عنوان مثال، پایان Session برنامه خاص، Session را در سیستم SSO خاتمه نمیدهد. بازگشت به پورتال SSO به کاربر امکان ورود مجدد به برنامه ای را میدهد که قبلاً خروج از آن انجام شده است.
از طرف دیگر، یک تابع خروج از سیستم در یک سیستم SSO لزوماً باعث خاتمه جلسه در برنامههای متصل نمیشود.
اهداف تست
• رابط کاربری خروج از سیستم را ارزیابی کنید.
• زمان اتمام Session را بررسی کنید و ببینید آیا Session پس از خروج از سیستم به درستی از بین می رود یا خیر.
چگونه تست را انجام دهیم
Testing for Log Out User Interface
ظاهر و نمایش عملکرد خروج از سیستم را در رابط کاربر تایید کنید. برای این منظور، هر صفحه را از دیدگاه یک کاربر که قصد خروج از برنامه کاربردی وب را دارد، ببینید.
ویژگیهایی وجود دارند که نشاندهنده یک رابط کاربری خروج از سیستم خوب هستند:
• یک دکمه خروج از سیستم در تمام صفحات برنامه کاربردی وب وجود دارد.
• دکمه خروج از سیستم باید به سرعت توسط کاربری که میخواهد از برنامه کاربردی وب خارج شود، قابل مشاهده بوده و شناسایی شود.
• پس از بارگذاری یک صفحه، دکمه خروج از سیستم باید بدون scrolling قابلمشاهده باشد.
• در حالت ایدهآل، دکمه log out در ناحیهای از صفحه قرار داده میشود که هنگام نمایش در مرورگر، ثابت است و تحتتاثیر scrolling قرار نمیگیرد.
Testing for Server-Side Session Termination
ابتدا، مقادیر کوکیهای مورد استفاده برای شناسایی یک Session را ذخیره کنید. قابلیت خروج را فراخوانی نموده و رفتار برنامه را مشاهده کنید، به خصوص در مورد کوکیهای نشست. سعی کنید به سمت صفحهای بروید که تنها در یک Session احراز هویت شده قابلمشاهده است، به عنوان مثال با استفاده از دکمه back در مرورگر این کار را انجام دهید. اگر یک نسخه Cache شده از صفحه نمایش داده میشود، از دکمه بارگذاری مجدد (reload) برای Refresh کردن صفحه از سرور استفاده کنید.
اگر قابلیت خروج از سیستم باعث شود که کوکیهای نشست به یک مقدار جدید تنظیم شوند، مقدار قدیمی کوکیهای نشست را بازیابی کنید و یک صفحه را از ناحیه تصدیق شده برنامه بارگذاری کنید. اگر این تست هیچ آسیبپذیری را در یک صفحه خاص نشان نمیدهد، حداقل چند صفحه دیگر از برنامه را امتحان کنید که از نظر امنیت بحرانی در نظر گرفته میشوند، تا اطمینان حاصل شود که پایان Session به درستی توسط این حوزههای برنامه به رسمیت شناخته میشود.
هیچ دادهای که تنها توسط کاربران تصدیق شده قابلمشاهده باشد، نباید در صفحات بررسی شده در حین انجام آزمایشها قابلمشاهده باشد. در حالت ایدهآل، برنامه در حالی که پس از اتمام Session به نواحی تصدیق شده دسترسی پیدا میکند، میبایست شما را به یک ناحیه عمومی یا یک فرم ورود تغییر هدایت کند. البته این موضوع برای امنیت برنامه نباید ضروری باشد، اما تنظیم نشست کوکیها به مقادیر جدید پس از خروج از سیستم به طور کلی به عنوان یک عمل خوب در نظر گرفته میشود.
Testing for Session Timeout
سعی کنید با یک تاخیرا زمانی مناسب، یک درخواست به صفحه ای در ناحیه احراز هویت شده برنامه کاربردی وب ارسال نمایید تا زمان اعتبار یک Session یا Session Timeout را تعیین کنید. اگر پس از ارسال این درخواست، موارد مشابه با خروج از سیستم ظاهر شود، تاخیر زمانی مورد استفاده با مقدار زمان خروج از سیستم مطابقت دارد. بدین صورت، مشخص می شود که برنامه پس از چه مدتی Session موجود را به صورت خودکار خاتمه میدهد.
مقدار مناسب برای اتمام Session به هدف برنامه بستگی دارد و باید تعادل بین امنیت و Functionality در نظر گرفته شود. در برنامههای مربوط به حوزه بانکداری حفظ یک Session غیر فعال بیش از ۱۵ دقیقه منطقی به نظر نمیرسد. از سوی دیگر، یک بازه زمانی کوتاه در یک ویکی یا فروم میتواند کاربران را که نیاز به زمان بیشتری دارند تا مقالات طولانی را در برنامه بارگذاری کنند، ناراحت نماید. در این موارد، بازههای زمانی یک ساعت و بیشتر میتواند قابلقبول باشد.
Testing for Session Termination in Single Sign-On Environments (Single Sign-Off)
در برنامه تست شده خروج از سیستم را انجام دهید. تایید کنید که آیا یک پورتال مرکزی یا دایرکتوری برنامه وجود دارد که به کاربر اجازه دهد تا بدون تایید هویت وارد برنامه شود.
در حالی که وارد برنامه مورد آزمایش شده اید، در سیستم SSO، فرآیند خروج را اجرا کنید. سپس سعی کنید به یک حوزه احراز هویت شده از برنامه دسترسی داشته و نتیجه را بررسی نمایید.
انتظار میرود که فراخوانی یک تابع خروج از سیستم در یک برنامه کاربردی وب متصل به یک سیستم SSO یا در خود سیستم SSO، منجر به پایان عمومی (Global Termination) تمام جلسات شود. احراز هویت کاربر باید برای دسترسی به برنامه پس از خروج از سیستم SSO و برنامههای متصل، مورد نیاز باشد.
Tools
ابزار Burp Suite – قسمت Repeater