شرح آسیب پذیری Open Redirection در وب

چگونه رمز و نام کاربری استادِ عزیزِ دانشگاه مان را بدست بیاوریم؟ با کمک این آسیب پذیری به راحتی می توان کاربرانِ بسیاری از سایت ها را فریب داد و اطلاعات حساس آن ها را بدست آورد. این آسیب پذیری اگرچه به راحتی می تواند ترمیم شود ولی جز ده آسیب پذیری برتر اپلیکیشن های وب می باشد.

این آسیب پذیری از اعتماد کاربر نسبت به یک دامنه (مثلا سایت دانشگاه، بانک و ....) معتبر سواستفاده کرده و کاربر را به یک سایت مخرب هدایت می کند و می تواند زمینه Phishing و جعل را فراهم کند.

پیش از تشریح آناتومی حمله، لازم به ذکر است که در بسیاری از وب اپلیکشن ها این امکان وجود دارد که کاربر را به یک آدرس Redirect کنیم. مثلا اگر کاربر ناشناسی آدرس محتوایی را وارد کند که به آن دسترسی ندارد، این کاربر به طور خودکار به صفحه لاگین برده می شود و پس از انجام لاگینِ موفق، به طور خودکار به محتوایی که درخواست کرده بود هدیت می شود. این اتفاق به این صورت رخ می دهد که صفحه لاگین دارای آدرسی به شکل زیر می باشد:

http://mellibank.ir/login?ReturnUrl=accounts

در آدرس صفحه لاگین می بینم که متغیر ReturnUrl مشخص می کند که پس از لاگین کاربر باید به چه صفحه ای هدایت شود. اما اگر ReturnUrl را دستکاری کنیم چه می شود؟

آناتومی حمله Open Redirection

1. می خواهید پسورد استاد عزیز تان را به دست بیاورید و نمره مردودی خود را به نمره قابل قبولی تغییر دهید. :wink:
2. ایمیلی به استاد خود می زنید و در این ایمیل از او در مورد یکی از مطالب موجود در سایتِ درس سوال می پرسید. در انتها لینکی را از این مطلب هم قرار می دهید تا استاد بیچاره بر روی لینک کلیک کند. اما این لینک در واقع لینک مطلب نیست، صرفا لینکی است که استاد را وادار به انجام لاگین می کند. این لینک می تواند به صورت زیر باشد:

http://sharif.courses.ir/login?ReturnUrl=shariif.courses.ir

3. استاد شما به صفحه لاگین دانشگاه هدایت می شود و نام کاربری و رمز خود را وارد می کند ولی به محتوای ReturnUrl دقت نمی کند. پس از انجام لاگین موفق، چون سایت دانشگاه هیچ گونه "اعتبارسنجی" بر روی مقدار ReturnUrl ندارد، کاربر را به آدرس مخرب shariif.courses.ir هدایت می کند.
4. در این صفحه که توسط ما طراحی شده، همه چیز از لحاظ ظاهری دقیقا مطابق با همان صفحه لاگین دانشگاه است. بدین صورت بسیار بعید است که کسی به این صفحه شک کند. فقط در این صفحه پیامی به کاربر داده شده است که "شما نام کاربری و رمز عبور خود را اشتباه وارد کرده اید".
5. استاد بیچاره با دیدن این صفحه مجددا نام کاربری و رمز عبور خود را وارد می کند ولی خبر ندارد که این بار همه چی در سایت شما ذخیره خواهد شد. پس از دریافت این اطلاعات از استاد، حالا شما مرورگر را به سایت اصلی دانشگاه Redirect می کنید و چون قبلا استاد در آنجا لاگین کرده، به مطالب دسترسی خواهد داشت و به چیزی شک نخواهد کرد.

درمان
اصلی در دنیای وب وجود دارد مبنی بر اینکه "به داده هایی که از سمت کاربران می آید اعتماد نکن". در اینجا هم داده ReturnUrl از سمت کاربر برای وب اپلیکشن ما فرستاده شده است، پس نباید به آن اعتماد کنیم و قبل از Redirect کردن کاربر به هر آدرسی باید مطمئن شویم که این آدرس، از نظر ما معتبر می باشد. مثلا در ASP.NET می توانیم، قبل از انجام Redirection، از متد Url.IsLocalUrl استفاده کنیم