اگر در زمینه امنیت وب سایت و اپلیکیشن های تحت وب تجربه کار و یا آشنایی داشته باشید، قطعا با عنوان سری حملات CSRF برخورده اید. در این آموزش سعی بر این شده است که تا حد ممکن باب آشنایی با این گونه حملات برای شما دوستان عزیز باز شود. با ما همراه باشید
حملات Cross-Site Request Forgery یا همان حملات CSRF، اساسا زمانی رخ میدهند که یک وب سایت آلوده باعث شود تا مرورگر کاربر در سایتی که مورد اعتماد (trust) است، عملی ناخواسته انجام دهد. به علت آن که بسیاری از سایت های اینترنتی توانایی محافظت از خود در برابر این حملات را ندارند و از طرف دیگر این نوع حملات معمولا از دید توسعه دهندگان وب نادیده گرفته میشوند، به آن ها لقب "غول خفته" را در بین آسیب پذیری های وب داده اند.
این آسیب پذیری ها به اتکر این اجازه را میدهند تا بدون نیازبه وارد شده به اکانت های بانکی کاربران، بتواند تراکنش مالی داشته باشد، آدرس های ایمیل کاربر را بدست اورد و با بخطر انداختن حریم خصوصی کاربر، اکانت های او را تهدید کند. بهترین راه جلوگیری از این گونه حملات، تغییراتی است که باید در سمت سرور پیاده سازی کرد تا بتوانیم بطور کامل خود را از این گونه حملات ایمن کنیم. در ادامه خصوصیاتی را خواهیم گفت که راهکارهای اجرا شده در سمت سرور باید آن ها را داشته باشند. پس از آن بر روی مرورگر کلاینت، پلاگینی را پیاده سازی خواهیم کرد که میتواند کاربران را از حملات مشخص و قطعی CSRF حفظ کند (حتی اگر وب سایت هیچگونه تمهیداتی برای جلوگیری از این حملات در خود پیاده سازی نکرده باشد).
بهرحال هدف اصلی از این آموزش، علاوه بر بحث یادگیری، بالا رفتن سطح اگاهی نسبت به اینگونه حملات در بین توسعه دهندگان وب است تا بعد از با مسئولیت بیشتری سایت خود را در برابر این گونه حملات حفظ کنند.
سری حملات CSRF، در اصل جزو تهدیدات امنیتی وب طبقه بندی نمیشوند و به ندرت در متون آکادمیک و تکنیکال صحبتی از آن ها به میان میآید. حملات CSRF براحتی تشخیص داده میشوند، براحتی اکسپلویت میشوند و براحتی رفع میشوند. این حملات وجود خود را مدیون عدم آگاهی برنامه نویس های وب از اثر و علل رخداد تهدیدات CSRF هستند. اشتباهی که اکثر برنامه نویس های وب میکنند این است که فکر میکنند ایمن کردن وب در برابر حملات XSS، ناخودآگاه آن را در برابر حملات CSRF هم ایمن میکند.
در این بخش با ارائه مثالی، آنچه را که در این حملات رخ میدهد را از نزدیک خواهیم دید. با ما همراه باشید.
برای شروع سایتی آسیب پذیر در برابر حمله CSRF را فرض میکنیم. این سایت در واقع یک سرویس ایمیل تحت وب است که به کاربران خود امکان ارسال و دریافت ایمیل را میدهد. این سایت برای احراز هویت کاربران خود، از مکانیزم authentication استفاده میکند.
یکی از صفحات این سایت،http://example.com/compose.htm میباشد که دارای فرمی HTML است که به کاربر این امکان را میدهد تا مشخصاتی مانند ایمیل دریافت کننده ایمیل، موضوع ایمیل و متن پیام را با کلیک کردن دکمه Send Email، وارد کند.
1 2 3 4 5 6 7 8 |
|
وقتی که کاربر بر روی "Send Email" کلیک میکند، اطلاعاتی را که او وارد کرده، به سمت http://example.com/send_email.htm و تحت یک GET Request ارسال میشود. زمانی که GET Request اطلاعات فرم را به URL اضافه میکند، در واقع کاربر چنین URL ای را بسمت سرور ارسال کرده است:
1 |
|
در ادامه فرایند، صفحه send_email.htm اطلاعات دریافت شده را تحویل گرفته و ایمیل را بسمت مقصدی که کاربر مشخص کرده است، ارسال میکند. توجه داشته باشید که send_email.htm، صرفا اطلاعات را گرفته و بر روی آن اکشن مناسب انجام میدهد. برای این صفحه مهم نیست که اصل درخواست از کجا ایجاد شده است. تمام این حرفا به این معنی است که اگر کاربر بجای پرکردن فرم و ارسال آن، صرفا در بخش URL،
1 |
|
را تایپ کند، example.com باز هم ایمیل را ارسال خواهد کرد.
برای مثال، اگر کاربر، سه URL زیر را در مرورگرش تایپ کند، send_email.htm، سه ایمیل را به احسان، میلاد و فرهاد ارسال خواهد کرد:
1 2 3 4 5 6 7 8 |
|
در این مرحله احتمال وقوع حمله CSRF وجود دارد، به علت انکه send_email.htm، هر دیتایی را که دریافت کند، بر طبق آن ایمیل متناظرش را ارسال میکند. send_email.htm اصالت داده و این که از طریق فرم و صفحه compose.htm ارسال شده باشد را بررسی نمیکند. بنابراین اگر اتکر کاری کند که کاربر درخواستی را برای send_email.htm ارسال کند، در ادامه send_email.htm نیز باعث میشود تا example.com ایمیلی را از طرف کاربر و با دیتایی که انتخاب اتکر بوده است، ارسال کند. در اینصورت اتکر توانسته است با موفقیت یک حمله CSRF انجام دهد.
برای انجام چنین کاری، اتکر نیاز دارد تا مرورگر کاربر را مجبور کند تا درخواستی را به send_email.htm ارسال کند تا بتواند عمل دلخواه خود را در لوای آن انجام دهد. (فرض میکنیم که کاربر سایتی که تحت کنترل اتکر است را بازدید میکند و سایت هدف نیز در برابر حملات CSRF ایمن نشده باشد). در این حالت اتکر باید از سایت خودش به example.com یک درخواست را جعل کند. متاسفانه در این مورد، HTML راه های زیادی را برای ساخت چنین درخواست هایی ایجاد کرده است. مثلا تگ <img> باعث میشود تا مرورگر هر شناسه ای (URI) ای را که به عنوان src در خود ست کرده باشد، لود کند؛ حتی اگر این URI واقعا یک image نباشد. اتکر میتواند بوسیله کد زیر، صفحه ای را ایجاد کند:
1 2 3 |
|
در حالی که کاربر از کدی که در پشت زمینه وجود دارد، مطلع نیست، وقتی که این صفحه را باز میکند، یک درخواست به send_email.htm ارسال میشود که این موضوع باعث میشود در ادامه فرآیند یک ایمیل از طرف کاربر به Ehsan@example.com ارسال شود.
حمله CSRF زمانی موفقیت آمیز است که اتکر کاری کند تا مرورگر کاربر، عملی ناخواسته را بر روی یک سایت دیگر انجام دهد. برای انکه این عمل ناخواسته موفقیت آمیز باشد، کاربر باید توانایی انجام این عمل را داشته باشد. قدرت حملات CSRF نوعا در حد سطح دسترسی و قدرت کابر است. یعنی آنکه کاربر هرکاری را که بتواند انجام دهد، اتکر نیز میتواند آن ها را انجام دهد. در نتیجه به هراندازه که یک سایت به کاربری قدرت میدهد، حملات CSRF بر روی آن نیز جدی تر و شدیدتر خواهند بود.