آسیب پذیری Open Redirect چیست؟
Redirect چیست و چگونه میتواند به یک آسیب پذیری تبدیل شود؟ به واسطه وجود Open Redirect چه اتفاقاتی ممکن است برای کاربران یک برنامه رخ بدهد؟ با ما همراه باشید تا با آسیب پذیری Open Redirect آشنا شویم.
آسیب پذیری یا باگ Open Redirect چیست؟
این آسیب پذیری، یکی از آسیب پذیری های تحت وب میباشد که شاید بعضاً، از نظر صاحبان وبسایت، تهدید بزرگی به شمار نرود، اما وجود آن میتواند موجب افزایش سطح تخریب، در حملات دیگر بشود. در این نوشتار، به شرح کامل آسیب پذیری Open Redirect، سناریو های حمله، تشخیص و امن سازی برنامه برای پیشگیری از این آسیب پذیری خواهیم پرداخت.
اما پیش از پرداختن به آسیب پذیری Open Redirect لازم است تا با عمل Redirection یا تغییر مسیر، آشنا باشیم. پس مختصرا به شرح عملکرد تغییر مسیر در برنامه میپردازیم.
عملکرد Redirection
این عملکرد زمانی رخ میدهد که یک وبسایت، کاربران خود را به یک وبسایت دیگر منتقل می کند. به این عمل، Redirection گفته و معنی فارسی آن به صورت “تغییر مسیر” تلفظ می شود؛ اما در گفتار عامیانه ، بیشتر با همان واژه ریدایرکشن به این عملکرد اشاره میشود.
استفاده از این عملکرد، دلایل مختلفی می تواند داشته باشد. مثلا:
- یک سامانهی فروشگاهی، کاربران خود را برای پرداخت وجه محصولات، به یک سامانهی بانکی منتقل میکند.
- یک وبسایت، از طریق بخش منابع در انتهای یک مطلب، کاربران سایت خود را به وبسایت های منبع همان مطلب، ارجاع می دهد.
- یک وبسایت شبکه اجتماعی، دارای قابلیتی است که کاربران می توانند در مطالبی که منتشر میکنند، کاربران دیگر را به یک وبسایت دیگر پیوند دهند.
این عملکرد، چگونه رخ می دهد؟
فرض کنید در یک قسمت از وبسایت example.com، دکمه ای وجود دارد که شما را به وبسایت example2.com منتقل میکند. پس از اینکه کاربر روی دکمه کلیک میکند، با URL زیر به یک وبسایت دوم منتقل می شود:
https://example.com/index.php?redirect_to=https://example2.com
در این مرحله، یک درخواست با متد GET از طریق مرورگر کاربر به وبسایت example.com ارسال میشود که پارامتر redirect_to در آن، مشخص میکند که مقصد مرورگر به سمت چه سامانه ای میباشد.
بعد از این مرحله، یک پاسخ (Response) از سرور example.com برای مرورگر کاربر بر میگردد که کد وضعیت (status code) آن، یکی از کد های مربوط به ریدایرکشن می باشد. پاسخ های مربوط به ریدایرکشن، با کد های وضعیتی 301، 302، 303، 307 یا 308 ارسال میشوند.
در مرحله آخر، مرورگر با هدر Location در پاسخ دریافت شده، که مقدار آن برابر با پارامتر redirect_to می باشد، به وبسایت مذکور منتقل میشود.
آسیب پذیری Open Redirect
عمل ریدایرکشن یا تغییر مسیر، به خودی خود یک قابلیت برای وبسایت ها، حساب میشود. اما زمانی این قابلیت تبدیل به یک آسیب پذیری میشود، که به صورت کنترل نشده از آن استفاده شود. در این صورت، برنامهی گفته شده دچار آسیب پذیری Open Redirect یا ریدایرکت آزاد میشود. مثلا فرض کنید، وبسایت example.com ، با پارامتر redirect_to، عمل ریدایرکشن را انجام میدهد:
https://example.com/index.php?redirect_to=https://example2.com
حال چه اتفاقی میافتد اگر نفوذگر، url گفته شده را مانند url زیر تغییر بدهد:
https://example.com/index.php?redirect_to=https://attacker.com
در این صورت، چنانچه وبسایت example.com، اعتبار سنجی درستی روی پارامتر redirect_to انجام نداده باشد یا سیاست های درستی را برای ریدایرکشن تعیین نکرده باشد، کاربر از طریق این لینک وارد سایت نفوذگر میشود که میتواند یک قدم از سناریو حملات دیگر باشد.
شاید این سوال برایتان پیش بیاید که، چگونه قربانی متوجه انتهای لینک نمیشود؟
یکی از دلایل آن این است که نفوذگر قربانی را با پیشنهاداتی مانند خواندن یک مطلب فوری و جذاب، برنده شدن یک جایزهی بزرگ و حقه هایی مانند آن، هیجان زده میکند و او را در اضطرار قرار میدهد.
دلیل بعدی این است که در چنین شرایطی، بیشترین دقت قربانی، به نام دامنه در لینک مدنظر است. ولی با این حساب این گونه لینکها، به صورت ساده فرستاده نمیشوند. نفوذگر برای اینکه توجه قربانی را سمت دامنهی سایت آسیب پذیر جلب کند تا وی نتواند لینک سایت مخرب را ببیند، آدرس سایت مخرب را Url encode میکند:
https://example.com/%69%6e%64%65%78%2e%70%68%70%3f%72%65%64%69%72%65%63%74%5f%74%6f%3d%68%74%74%70%73%3a%2f%2f%61%74%74%61%63%6b%65%72%2e%63%6f%6d
در این صورت، نفوذگر به جز دامنه سایت آسیب پذیر چیز دیگری را متوجه نمیشود.
مثال واقعی از Open Redirect
یک مثال از این آسیب پذیری مربوط به سامانه semrush میباشد که در 1 فوریه 2018 در پلتفرم باگ بانتی hacker one، توسط یک کارشناس تست نفوذ، گزارش شد. این سامانه یکی از ابزار های معروف و مورد استفاده در مبحث سئو(SEO) یا بهینه سازی وبسایت برای موتور جستجو را ارائه میدهد.
کارشناس گزارش دهنده، از لینک زیر به عنوان poc (اثبات مفهوم) استفاده نمود:
https://www.semrush.com/redirect?url=http://bing.com
که با این لینک، فرد از طریق لینک سایت semrush وارد سایت bingمیشد.
بعد از اینکه این آسیب پذیری در semrush برطرف شد، یک کارشناس دیگر، لینک های زیر را به عنوان poc، مبنی بر بایپس شدن مکانیزم امنیتی در نظر گرفته شده، ارائه نمود:
https://www.semrush.com/redirect?url=https%3A%2F%2Fwww.google.com%2F https://www.semrush.com/redirect?url=https://www%2Egoogle%2Ecom https://www.semrush.com/redirect?url=https://www%252Egoogle%252Ecom https://www.semrush.com/redirect?url=http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D
در واقع، زمانی که لینک مد نظر به حالت Url Encode شده تغییر میکرد، توسط مکانیزم امنیتی سامانه، مورد اعتبار سنجی قرار نمیگرفت و تایید میشد.
آسیب پذیری Open Redirection(DOM based)
حالت دیگری از این آسیب پذیری زمانی اتفاق میافتد که، برنامه بوسیلهی دستورات DOM عمل ریدایرکت را انجام میدهد. DOM یک API مخصوص محتوای برنامه وب در مرورگر میباشد که به سازندگان برنامه این قابلیت را میدهد که به واسطهی آن، تغییراتی را در اشیاء یا صفتهای(Attributes) آن اعمال کنند.
به عنوان مثال، یک برنامه وب از کد زیر برای ریدایرکت کردن کاربر استفاده میکند:
<a href='#' onclick='returnUrl = /url=(https?:\/\/.+)/.exec(location); if(returnUrl)location.href = returnUrl[1];else location.href = "/"'>Back to Blog</a>
در اینجا، نفوذگر متوجه میشود که مقصد ریدایرکشن، به وسیله ی پارامتر url تعیین میشود. پس برای اینکه از وجود این آسیب پذیری مطمئن شود، آدرس زیر را به وجود میآورد:
https://vulnerable.com/posts?postid=3&url=https://attacker.com
در صورت ریدایرکت شدن مرورگر نفوذگر، وی متوجه وجود این باگ در سایت میشود. پس در ادامه میتواند از این آسیب پذیری برای حملات مختلف استفاده کند.
مثال واقعی از Open Redirect (DOM Based)
مثالی از حالت Dom Based این آسیب پذیری، مربوط به سامانهی NordVPN میباشد که در 7 دسامبر 2019، در Hacker One گزارش شد. کارشناس گزارش دهندهی این آسیب پذیری، لینک زیر را برای اثبات آسیب پذیری ارائه نمود:
https://support.nordvpn.com/#/path///google.com
همچنین، وی در این گزارش، کد زیر را به عنوان دلیل این آسیب پذیری مشخص کرد:
<script> if (window.location.href.indexOf('#/path') !== -1) { console.log("document.URL", document.URL) window.location.href = document.URL.slice(window.location.href.indexOf('#/path') + 6); } </script>
ترکیب Open Redirect با حملات دیگر
در این قسمت، به روش هایی میپردازیم که چگونه این آسیب پذیری، میتواند توسط یک آسیب پذیری دیگر به وجود بیاید یا این که خود عامل به وجود آمدن یک آسیب پذیری دیگر باشد:
Open Redirect از طریق XSS
نفوذگر متوجه وجود یک آسیب پذیری XSS از نوع stored در یک وبسایت میشود. حال او میداند که سناریو های متفاوتی برای استفاده از این حمله در اختیار دارد. او برای اینکه قربانی را وارد سایت مخرب خود کند، از این آسیب پذیری برای ریدایرکت کردن او به سایت خود استفاده میکند. او برای این کار، کد زیر را به برنامه آسیب پذیر تزریق میکند:
<img src=x onmouseover=window.location=”http://malicious.site” width=”2000” height=”2000” >
در صورت اجرا شدن کد گفته شده در یک صفحه، یک تصویر بزرگ صفحه مرورگر را پوشش میدهد که در مرحله بعد، به دلیل اینکه نشانگر ماوس کاربر، بر روی تصویر قرار میگیرد، صفت onmouseover، در این کد فعال و با دستور window.location ، کاربر را وارد سایت مخرب مینماید.
Open Redirect از طریق Host header injection
این حالت از آسیب پذیری زمانی اتفاق میافتد که برنامه وب مدنظر، دچار حالتی از آسیب پذیریHost Header Injection میباشد و زمانیکه نفوذگر، هدر Host را به یک دامنه ی دیگر تغییر میدهد، برنامه پاسخ ریدایرکت را به مرورگر بازمیگرداند و مرورگر وارد دامنهی دیگری میشود.
SSRF به کمک Open Redirect
نفوذگر قصد انجام یک حملهی SSRF ، بر یک وبسایت دارد. او پس از چند بار آزمون و خطا متوجه میشود، برنامه با تدابیر امنیتی تعیین شده، درخواست های او را تشخیص داده و فیلتر میکند. او پس از ارزیابی سایت، متوجه وجود آسیب پذیری Open Redirect، در پارامتر مربوط به درخواست تغییر صفحه میشود:
/news/nextpage?path=/news/page_id=3
زمانی که مقدار پارامتر path را به یک سایت دیگر تغییر میداد، پاسخ ریدایرکت آمده و مرورگر به سایت دیگری وارد میشد. به دلیل اینکه برنامه، مقادیر کاربر را در این پارامتر، اعتبار سنجی نمیکند، نفوذگر از این پارامتر برای دسترسی به صفحهی ادمین استفاده مینماید.
/news/nextpage?path=/http://192.168.0. 6:8080/admin
در نهایت، بعد از فرستاده شدن درخواست، صفحهی ادمین بر روی مرورگر نفوذگر، ظاهر میشود.
نحوه تشخیص آسیب پذیری Open Redirect
ابزار هایی که عمل پروکسی برای مشاهده درخواست ها(Requests) و پاسخها (Responses) در مرورگر را انجام میدهند، برای آنالیز و کشف این باگ، به ما کمک میکنند. مانند:
- Burp Suite
- Fiddler
- Post Man
- و ابزار های دیگر
به این صورت که پس از پروکسی یا تونل شدن ارتباطات مرورگر و وبسایت، توسط این ابزارها، درخواست هایی که موجب عمل ریدایرکت شده اند و پاسخ های آنها، کد وضعیتی مربوط به ریدایرکشن یعنی 301،302،307و… دارند را مورد ارزیابی قرار میدهیم.
در صورتی که مقدار پارامتر مربوط به ریدایرکشن، در درخواست گفته شده را با یک وبسایت دیگر تغییر بدهیم و پس از ارسال شدن آن، مرورگر ما بواسطهی پاسخ دریافت شده، عمل ریدایرکت را انجام بدهد، متوجه وجود آسیب پذیری در وبسایت مدنظر میشویم.
سناریو حملات با استفاده از باگ Open Redirect
تا اینجای مطلب، با شیوه های بوجود آمدن، شیوه حمله و روش کشف این آسیب پذیری آشنا شدیم. در ادامه به سناریو حملاتی میپردازیم که به ما نشان میدهد، یک سایت دارای این باگ، در معرض چه خطراتی قرار میگیرد:
استفاده در حملهی Phishing
این حمله، تقریبا در بین سناریو هایی که در مورد استفاده از این آسیب پذیری گفته شدهاند، معروف تر است. این سناریو به این صورت است که نفوذگر، وبسایتی مشابه یک وبسایت دارای آسیب پذیری Open Redirect میسازد. سپس یک لینک ریدایرکت از سایت آسیب پذیر میسازد تا قربانی را به وبسایت خود هدایت کند. قربانی با دیدن دامنه سایت اصلی فریب میخورد و وارد سایت جعلی نفوذگر میشود. به دلیل اینکه سایت نفوذگر مشابه سایت اصلی ساخته شده است، قربانی متوجه ورود خود به سایت جعلی نشده و ممکن است حتی نام کاربری و رمز عبور خود را نیز، وارد کند. البته حمله Phishing، سناریو های زیادی دارد که نفوذگر میتواند از آن استفاده کند.
استفاده در حمله ی XSS
نفوذگر پس از کشف آسیب پذیری Open Redirect در یک وبسایت معتبر، کاربر قربانی را به بهانهی خواندن یک مطلب در آن سایت، ترغیب به کلیک روی لینک مخرب فرستاده شده میکند. قربانی پس از کلیک روی لینک مخرب، وارد یک وبسایت دیگر با آسیب پذیری XSS میشود.
استفاده در حملهی CSRF
نفوذگر آسیب پذیری CSRF را در یک وبسایت کشف میکند. سپس یک لینک مخرب از یک وبسایت دارای باگ Open Redirect میسازد و برای قربانی میفرستد. کاربر قربانی، با دیدن دامنهی وبسایت معتبر، فریب میخورد و بر روی لینک کلیک میکند و یک درخواست جعلی از سمت مرورگر وی، به وبسایت دارای باگ CSRF ارسال میشود.
البته مدنظر داشته باشید که استفاده از این باگ فقط به موارد گفته شده خلاصه نمیشود، بلکه نفوذگر با توجه به خلاقیت و شرایطی که برای حمله دارد، میتواند از روش ها و سناریو های مختلفی برای استفاده از این باگ، بهره ببرد.
راه های پیشگیری از Open Redirect
برای اطمینان از اینکه برنامه شما در برابر این آسیب پذیری، ایمن باشد، نیاز است تا برنامه وب مورد نظرتان را با موارد زیر منطبق کنید.
- اگر از عمل ریدایرکشن استفاده میکنید، از آدرس url مقصد، در پارامتر ورودی کاربر استفاده نکنید.
- حتی الامکان از نام کوتاه، ID یا توکن ای برای مقصد ریدایرکت ها استفاده کنید، که در سمت سرور به آدرس مقصد منطبق شده باشد.
- اگر نمیتوانید از ورودی کاربر جلوگیری کنید، مطمئن شوید که مقادیری که از سمت کاربران وارد میشوند، معتبر، مرتبط با برنامه و در سطح دسترسی کاربر باشند.
- ورودی های کاربر را با یک لیست از مقصد های مجاز برای ریدایرکت، اعتبار سنجی کنید. دقت کنید که این رویکرد باید بر اساس یک لیست مجاز(allow-list) باشد و نه یک بلاک لیست(block list).
جمع بندی
در این نوشتار سعی شد تا به طور کامل با آسیب پذیری Open Redirect، شیوه ی کشف ، سناریو های حمله و متد های امن سازی برنامه در برابر آن، آشنا بشویم. همانطور که دیدیم، اگر چه بعضاً، این آسیب پذیری، یک باگ با ریسک پایین شمرده میشود، اما در صورتی که برای جلوگیری از آن، تدبیری دیده نشود، درکنار حملات دیگر یا گاهاً به تنهایی میتواند تخریب های جبران ناپذیری به همراه داشته باشد. پس هیچ وقت وجود یک آسیب پذیری حتی با سطح پایین، نباید بی تاثیر به شمار برود.