حمله CSRF چیست؛ این نوع حمله را میتوان به دزدی بیصدا تشبیه کرد؛ جاییکه مهاجم، از اعتماد سیستم به کاربر سوءاستفاده میکند و بدون آگاهی او، دست به اقداماتی مانند تغییر رمز عبور یا انتقال وجه میزند. در ظاهر، همه چیز قانونی است، اما در پشت پرده، کنترل در دست مهاجم است. در این مقاله قصد داریم بهطور کامل بررسی کنیم که حمله CSRF چگونه کار میکند، چطور ساخته و اجرا میشود، چگونه میتوان از آن جلوگیری کرد و چه تفاوتهایی با حملات XSS دارد.
CSRF چیست؟
CSRF که مخفف عبارت Cross-Site Request Forgery بهمعنای «جعل درخواست میانوبسایتی» است، یکی از آسیبپذیریهای جدی و رایج در حوزهی امنیت وب محسوب میشود. در این نوع حمله، مهاجم کاربر را فریب میدهد تا بدون آگاهی و رضایت، یک درخواست ناخواسته را از طرف حساب کاربری خودش در یک سایت معتبر ارسال کند. این اتفاق معمولاً زمانی رخ میدهد که کاربر در سایت هدف لاگین کرده و سشن فعال دارد. مهاجم از این فرصت سوءاستفاده میکند و درخواستهایی مانند «تغییر رمز عبور»، «انتقال وجه»، «ثبت سفارش» یا «ارسال پیام» را به سرور ارسال میکند. به عبارتی دیگر، CSRF با دور زدن بخشی از سیاست امنیتی «مبدأ یکسان» (Same-Origin Policy) به هدف خود میرسد. چون عملیات بهظاهر از سمت کاربر انجام میشود، سرور آن را معتبر تلقی میکند. برای مقابله با این تهدید، استفاده از «توکن CSRF»، اعتبارسنجی منبع درخواست (Referer/Origin) و اعمال محدودیت در کوکیهای احراز هویت از روشهای موثر و توصیهشده هستند.
حمله CSRF چگونه کار میکند؟
برای اینکه حملهی CSRF یا همان جعل درخواست میانوبسایتی عملی شود، باید سه شرط مهم بهطور همزمان برقرار باشند:
۱. وجود یک عملیات قابل هدف
در برنامهی مورد نظر، باید عملی وجود داشته باشد که مهاجم قصد اجرای آن را داشته باشد. این عمل میتواند یک اقدام حساس با دسترسی بالا باشد، مانند «تغییر سطح دسترسی کاربران دیگر» یا عملی مرتبط با دادههای کاربر مانند «تغییر رمز عبور». وجود چنین نقاط هدف، زمینهی اجرای حمله را فراهم میکند.
۲. مدیریت نشست مبتنی بر کوکی بدون تأیید اضافی
درخواست برای اجرای عملیات باید از طریق HTTP Request انجام شود و برنامه تنها بر پایهی کوکی نشست کاربر (Session Cookie) کار کند. یعنی هیچ سازوکار دیگری مانند «توکن CSRF»، تأیید مبدأ درخواست یا احراز هویت مجدد در فرآیند وجود نداشته باشد.
۳. نبود پارامترهای غیرقابل پیشبینی
درخواست مربوطه نباید شامل پارامترهایی باشد که مهاجم نتواند مقدار آنها را حدس بزند. بهعنوان مثال، اگر تغییر رمز عبور نیاز به وارد کردن «رمز قبلی» داشته باشد، حمله با شکست مواجه میشود. در چنین شرایطی، پیشبینی و اجرای موفق درخواست مخرب برای مهاجم بسیار دشوار خواهد بود.
با برقرار بودن این سه شرط، مهاجم میتواند بدون آگاهی کاربر، عملی خطرناک را از طرف او انجام دهد؛ آنهم با ظاهری کاملاً قانونی برای سرور.
چگونه یک حمله CSRF ساخته میشود؟
ساخت دستی حملهی CSRF با استفاده از کد HTML ممکن است در شرایطی دشوار و زمانبر باشد؛ بهویژه زمانی که درخواست مورد نظر شامل پارامترهای زیاد یا ساختار پیچیدهای باشد. در چنین مواردی، بهترین و سریعترین روش برای ساخت نمونهی عملی (PoC) این نوع حمله، استفاده از ابزار CSRF PoC Generator در نرمافزار Burp Suite Professional است.
مراحل ساخت حمله CSRF در Burp Suite بهصورت زیر است:
-
ابتدا درخواست موردنظر را در یکی از بخشهای Burp Suite انتخاب کنید.
-
بر روی آن راستکلیک کرده و از منوی زمینهای، گزینهی Engagement tools / Generate CSRF PoC را انتخاب کنید.
-
در این مرحله، Burp Suite یک کد HTML تولید میکند که میتواند همان درخواست را بدون کوکیها ارسال کند (کوکیها بهصورت خودکار توسط مرورگر قربانی اضافه میشوند).
-
در صورت نیاز، میتوانید تنظیمات ابزار تولید CSRF را تغییر دهید تا متناسب با ساختار خاص درخواست، خروجی دقیقتری دریافت کنید.
-
در نهایت، کد HTML ایجاد شده را در یک صفحهی وب قرار دهید، آن را در مرورگری که وارد حساب کاربری سایت آسیبپذیر شده است اجرا کنید و بررسی نمایید که آیا عمل مورد نظر با موفقیت انجام میشود یا خیر.
استفاده از این روش، ساخت حملههای هدفمند CSRF را بسیار سریعتر و دقیقتر میکند.
روشهای ارسال حمله CSRF چگونه است؟
ارسال یا تحویل یک حمله CSRF معمولاً به همان شیوهای انجام میشود که در حملات XSS بازتابی (Reflected XSS) نیز رایج است. در اغلب موارد، مهاجم کد HTML مخرب را در یک وبسایت تحت کنترل خود قرار میدهد و سپس تلاش میکند تا قربانی را به بازدید از آن وبسایت ترغیب کند. این کار ممکن است از طریق ارسال یک لینک در قالب ایمیل، پیام شبکههای اجتماعی یا حتی پیام متنی صورت گیرد.
در برخی موارد خاص، اگر کد مخرب در یک وبسایت معتبر و پرمخاطب (مانند بخش نظرات کاربران) قرار گیرد، مهاجم حتی نیازی به دعوت مستقیم کاربر ندارد و صرفاً منتظر بازدید او از آن صفحه میماند.
نکته قابل توجه این است که برخی حملات ساده CSRF با متد GET اجرا میشوند و میتوانند بهصورت کاملاً مستقل و تنها با یک URL ساخته شوند. در چنین حالتی، مهاجم حتی نیازی به داشتن سایت جداگانه ندارد و میتواند مستقیماً یک لینک مخرب در دامنهی آسیبپذیر را برای کاربر ارسال کند.
برای مثال، اگر درخواست تغییر ایمیل در یک سایت از طریق متد GET قابل انجام باشد، کد حمله میتواند بهسادگی بهشکل زیر باشد:
<img src="https://vulnerable-website.com/email/change?email=pwned@evil-user.net">
در این سناریو، تنها کافی است که کاربر وارد صفحهای شود که این کد در آن قرار دارد تا عملیات ناخواسته بهطور خودکار اجرا شود.
رایجترین روشهای دفاعی در برابر حملات CSRF
امروزه اجرای موفق حملات جعل درخواست میانوبسایتی (CSRF) نسبت به گذشته دشوارتر شده است؛ چرا که بسیاری از وبسایتها و مرورگرها مکانیزمهای امنیتی برای مقابله با این نوع حملات پیادهسازی کردهاند. در ادامه، به سه مورد از رایجترین روشهای دفاعی در برابر CSRF اشاره میکنیم:
۱. توکن CSRF
این روش یکی از مؤثرترین و پرکاربردترین تکنیکها برای مقابله با CSRF است. سرور، یک توکن منحصربهفرد، مخفی و غیرقابل پیشبینی تولید کرده و آن را به سمت کاربر ارسال میکند. هر زمان که کاربر قصد انجام یک عملیات حساس مانند ارسال فرم را داشته باشد، باید این توکن را به همراه درخواست خود ارسال کند. اگر توکن صحیح نباشد، درخواست از سمت سرور رد خواهد شد. این کار، ساخت درخواست معتبر توسط مهاجم را بسیار دشوار میسازد.
۲. کوکیهای SameSite
قابلیت SameSite یک ویژگی امنیتی در مرورگرهاست که مشخص میکند آیا کوکیهای یک وبسایت میتوانند در درخواستهایی که از دامنههای دیگر میآیند، ارسال شوند یا خیر. از آنجاییکه اغلب عملیات حساس به کوکیهای احراز هویت نیاز دارند، استفاده از این ویژگی میتواند مانع اجرای حملهی CSRF شود. از سال ۲۰۲۱، مرورگر Chrome بهطور پیشفرض حالت SameSite=Lax را اعمال میکند، و انتظار میرود سایر مرورگرهای معروف نیز این استاندارد را بهزودی دنبال کنند.
۳. اعتبارسنجی مبتنی بر Referer
برخی برنامههای وب از هدر HTTP با عنوان Referer برای بررسی منبع درخواست استفاده میکنند. در این روش، سیستم بررسی میکند که آیا درخواست از همان دامنهی سایت آمده یا از سایت خارجی. هرچند این روش نسبت به توکن CSRF کماثرتر و آسیبپذیرتر است، اما هنوز در برخی موارد کاربرد دارد.
تفاوتهای کلیدی بین حملات «XSS» و «CSRF»
با وجود آنکه حملات «XSS» و «CSRF» هر دو از آسیبپذیریهای رایج در حوزه امنیت وب هستند، اما بر پایهی دو مدل اعتماد کاملاً متفاوت عمل میکنند. در حملهی «XSS» مهاجم کدی مخرب را در وبسایت تزریق میکند و از «اعتماد کاربر به محتوای سایت» سوءاستفاده مینماید. در مقابل، حملهی «CSRF» بر اساس «اعتماد سرور به کاربر احراز هویتشده» شکل میگیرد و باعث اجرای ناخواسته درخواستهایی از سوی کاربر میشود.
در ادامه، برخی تفاوتهای اصلی این دو حمله را مرور میکنیم:
-
تعامل کاربر
در «XSS»، مهاجم معمولاً نیاز دارد کاربر روی یک لینک کلیک کند یا وارد یک صفحه خاص شود. اما در «CSRF» کافی است کاربر در حساب کاربری خود وارد شده باشد؛ حتی بدون هیچ کلیکی ممکن است حمله انجام شود. -
نیاز به سشن (Session)
حمله «CSRF» وابسته به وجود «نشست احراز هویتشده» و ارسال خودکار کوکی توسط مرورگر است، اما «XSS» میتواند حتی در نبود نشست نیز اجرا شود. -
دامنه عملکرد
در حملهی «XSS»، مهاجم میتواند به مرورگر قربانی تسلط پیدا کرده و «محتوای صفحه، کوکیها، یا اطلاعات ذخیرهشده در مرورگر» را بخواند یا تغییر دهد. ولی «CSRF» تنها میتواند «درخواستهایی را ارسال کند که کاربر مجاز به انجام آنهاست». -
منشأ حمله
کدهای مخرب «XSS» معمولاً از داخل خود وبسایت تزریق میشوند (مثل فرمهای ورودی یا URLهای دستکاریشده)، اما در «CSRF»، حمله «از یک منبع خارجی» مانند یک سایت دیگر یا ایمیل انجام میگیرد. -
سطح ریسک
«XSS» خطر بالایی برای «سرقت دادهها، ربودن نشست و دستکاری محتوا» دارد، مخصوصاً در برنامههای پیشرفته مانند «اپلیکیشنهای تکصفحهای (SPA)» یا توسعهیافته با فریمورکهایی مانند «Angular». در حالیکه «CSRF» معمولاً محدود به سوءاستفاده از عملکردهای مجاز حساب کاربری است.
جمعبندی
حمله CSRF چیست و چرا باید آن را جدی گرفت؟ در این مقاله، از تعریف و روش اجرای این حمله شروع کردیم، سپس ابزارهای ساخت و نحوهی تحویل آن را بررسی کردیم، راهکارهای دفاعی را توضیح دادیم و در پایان آن را با XSS مقایسه نمودیم. یادگیری این مفاهیم، گامی مهم برای حفظ امنیت کاربران و برنامههای وب است.