آسیب پذیریهای تحت وب زیاد هستند و به صورت روز افزون افزایش مییابند. حفظ امنیت و حریم خصوصی کاربران، مهم است. عدم رسیدگی به آسیبپذیریهای تحت وب، منجر به از بین رفتن اعتبار و کاهش اعتماد کاربران میشود که هزینههای بالایی را برای مدیر سایت، در پی خواهد داشت.
سایتها و اپلیکیشنهای تحت وب، در برابر حملات بدافزارها، اسپمها و… آسیب پذیر هستند. در این مقاله به بررسی Cross-Site Request Forgery (جعل درخواست بینسایتی) یا CSRF که یکی از مسیرهای دسترسی هکرها به رایانه شما است، پرداخته میشود.
حمله CSRF، به دلیل اینکه میتواند بدون اطلاع کاربر رخ دهد، خطرناک است. علاوه بر این، شناسایی این نوع حملات برای یک توسعه دهنده یا مالک سایت دشوار است. زیرا درخواستهای مخرب شباهت زیادی به درخواستهای واقعی دارند.
تصویر(1)
در این مقاله با موارد زیر آشنا خواهید شد:
- حمله CSRF چیست؟
- حمله CSRF چگونه کار میکند؟
- نمونه هایی از حمله CSRF
- سه روش برای کاهش حملات CSRF
- جمع بندی
حمله CSRF چیست؟
جعل درخواست بینسایتی یا CSRF، حملهای است که یک کاربر احرازهویت شده را مجبور میکند تا به صورت ناخواسته درخواست های مخرب ارسال کند.
تصویر(2)
معمولاً حمله CSRF شامل درخواستهای تغییر وضعیت میشود زیرا هکر اطلاعاتی دریافت نمیکند. حذف رکورد، تغییر گذرواژه، خرید محصول یا ارسال پیام، چندین نمونه از این درخواستها هستند. هکر معمولا از مهندسی اجتماعی برای ارسال یک لینک به ایمیل یا چت کاربر، استفاده میکند. بعد از کلیک کاربر روی لینک، دستورات تنظیم شده توسط هکر، اجرا خواهد شد. به عنوان مثال، در صورت کلیک روی لینک، هکر میتواند موجودی یک حساب را انتقال دهد یا با تغییر آدرس ایمیل، مانع ورود مجدد کاربر به ناحیه کاربری شود.
حمله CSRF چگونه کار میکند؟
اولین و مهم ترین گام در حملات CSRF، فریب کاربر برای ارسال درخواست های تغییر وضعیت، حین ورود به سیستم می باشد. در واقع هدف مهاجم این است که کاربر احراز هویت شده را مجبور کند تا بدون اطلاع، درخواستی مخرب به یک سایت یا اپلیکیشن تحت وب، ارسال کند. این درخواستها میتوانند شامل کوکی ها، پارامترهای URL و سایر انواع دادههایی باشند که برای یک کاربر، عادی به نظر میرسند.
برای موفقیت آمیز بودن حمله CSRF، شرایط زیر باید رعایت شود:
- کاربر احراز هویت شده باید به یک اپلیکیشن تحت وب که از کوکیها برای مدیریت سشن استفاده میکند، وارد شود.
- هکر باید یک درخواست جعلی که سبب تغییر وضعیت میشود، ایجاد کند.
- درخواستهای واقعی که توسط سرور انجام میشود نباید دارای پارامترهای غیر قابل پیش بینی باشد.
برای تکمیل روند حملات CSRF، باید از کوکیها در اپلیکیشنهایی که سیاست کوکی Same Site ضعیفی دارند، استفاده گردد. توسط SameSite، زمان و نحوه فعالسازی کوکیها مشخص میشود. کوکیها اغلب به صورت ناشناس و خودکار، در مرورگرها ذخیره خواهند شد.
اگر SameSite روی strict یا "سختگیرانه" تنظیم شود، جهت جلوگیری از حملات CSRF، زمانی که کاربر بین سایتها به گشتوگذار میپردازد، کوکی به اشتراک گذاشته نمیشود. در صورتی که SameSite روی none تنظیم گردد، کوکیها در تمام سایتها در دسترس خواهند بود. این موضوع سبب میشود تا اپلیکیشن شما در برابر حملات CSRF آسیب پذیر باشد.
اگر کاربر بیاطلاع، درخواستی مخرب از طریق مرورگر ارسال کند، کوکیهای ذخیره شده سبب میشوند تا سرور درخواست را مجاز در نظر بگیرد. در نهایت، سرور با تغییر حساب کاربر و اطلاعات سشن یا برگشت اطلاعات درخواست شده، به درخواست پاسخ میدهد.
نمونه هایی از حمله CSRF
- ارسال درخواست GET
- ارسال درخواست POST
تصویر(3)
ارسال درخواست GET
فرض کنید سرور یک بانک به شما اجازه تغییر وضعیت از طریق درخواست get را بدهد. حمله CSRF میتواند توسط درخواست get و دریافت لینک، صورت گیرد.
در مثال زیر، یک درخواست GET برای انتقال پول به حساب بانکی را مشاهده میکنید:
GET https://example.com/online/transfer?amount=1000&accountNumber=547895 HTTP/1.1
در نمونه فوق، کاربر برای پرداخت هزینه محصولات خریداری شده درخواست دارد که مبلغ 1000 دلار را به حساب شماره 547895 منتقل کند.
اگرچه این درخواست ساده، کاربردی و در عین حال واضح بوده اما ممکن است دارنده حساب را در معرض حملات CSRF قرار دهد. زیرا درخواست مطرح شده، به جزئیاتی که احتمالا مهاجم از آن بی اطلاع است، نیازی ندارد. بدین ترتیب، فرد مهاجم صرفا باید پارامترهای این درخواست شامل مبلغ و شماره حساب را تغییر دهد تا یک درخواست جعلی قابل اجرا ایجاد کند.
درخواست مخرب برای هر یک از کاربران بانک تا زمانی که سشن مبتنی بر کوکی داشته باشند، موثر خواهد بود. در نمونه زیر، هکر با تغییر دستور بالا میتواند مبلغ 500 دلار را به حساب خود (در اینجا شماره حساب 654585) انتقال دهد.
GET https://example.com/online/transfer?amount=500&accountNumber=654585 HTTP/1.1
بعد از تکمیل فرآیند فوق، هکر باید به دنبال روشی برای فریب کاربر باشد تا این درخواست را پس از ورود به اپلیکیشن بانکداری آنلاین خود، ارسال کند. یکی از این راهکارها، ایجاد یک لینک به ظاهر بی ضرر است تا توجه کاربر را جلب نماید. لینک میتواند به شکل زیر باشد:
<a href="https://example.com/online/transfer?amount=500&accountNumber=654585">Click here to get more information</a>.
اگر هکر، آدرس ایمیل صحیح کاربران را بیابد، میتواند لینک تقلبی خود را از آن طریق، برای اکثر مشتریان بانک ارسال کند. در صورتی که افراد پس از ورود، روی آن لینک کلیک نمایند، درخواست انتقال مبلغ 500 دلار به حساب هکر آغاز خواهد شد.
ارسال درخواست POST
اگر بانکی صرفا از درخواستهای POST به جای درخواستهای GET استفاده کند، دیگر هایپرلینکهای به کار برده شده در مثال GET، جوابگو نخواهند بود. بنابراین، برای داشتن یک حمله CSRF، هکر باید فرم HTML ایجاد کند.
در نمونه زیر، درخواست انتقال 1000 دلار برای خرید یک محصول را مشاهده میکنید:
POST /online/transfer HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Cookie: session=FRyhityeQkAPzeQ5gHgTvlyxHJYhg
amount=1000
account=547895
تصویر(4)
درخواست POST، به یک کوکی برای احراز هویت کاربر، مبلغ قابل پرداخت و حساب مقصد نیاز دارد. هکرها برای انجام حمله CSRF میتوانند درخواست فوق را تغییر دهند.
مهاجم باید به درخواست جعلی خود یک کوکی واقعی اضافه کند تا سرور مجبور به پردازش انتقال وجه شود. آنها میتوانند این کار را با استفاده از یک لینک به ظاهر بیخطر انجام دهند تا کاربر را به یک صفحه جدید مشابه زیر، هدایت کنند.
<html>
<body>
<form action="https://example.com/online/transfer" method="POST">
<input type="hidden" name="amount" value="500"/>
<input type="hidden" name="account" value="654585" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
مبلغ قابل انتقال و اطلاعات حساب، در فرم بالا تنظیم شده است. هنگام بازدید یک کاربر احراز هویت شده از صفحه، مرورگر قبل از ارسال درخواست به سرور، کوکی سشن را اضافه میکند. در نهایت سرور مبلغ 500 دلار را به حساب هکر واریز خواهد کرد.
سه روش برای کاهش حمله CSRF
برای پیشگیری و کاهش شدید احتمالی حمله CSRF در سایت یا اپلیکیشن، چندین روش وجود دارد که عبارتند از:
- استفاده از توکنهای CSRF
- استفاده از header ارجاع دهنده
- از یک شرکت هاستینگ امن استفاده کنید.
مقابله با حملات CSRF با استفاده از توکن
سایتی که در برابر حملات CSRF امن است، به هر سشن یک توکن منحصربهفرد اختصاص میدهد و آن را با سرور و مرورگر مشتری به اشتراک میگذارد. هر زمان که کاربر از طریق مرورگر خود درخواست ارسال نماید، سرور توکنهای CSRF آن درخواست را بررسی میکند. اگر درخواست ارسالی دارای توکن اشتباه باشد، سرور به آن پاسخ نخواهد داد. به دلیل مسائل امنیتی، توکن CSRF در کوکیهای سشن مرورگر کاربر ذخیره نمی شود.
آسیب پذیریهای بالقوه توکنهای CSRF
اگر چه استفاده از توکنهای CSRF یک اقدام امنیتی عالی است اما این روش بدون ضرر نیست. برخی از آسیب پذیریهای استفاده از توکنهای CSRF عبارتند از:
- دور زدن اعتبار سنجی
تصویر(5)
برخی اپلیکیشنها در صورت عدم یافتن توکن، از مرحله اعتبار سنجی عبور میکنند. اگر هکر به کد حاوی توکن دست یابد، میتواند توکن آن را حذف نموده و حمله CSRF را اجرا کند.
اگر درخواست ارسالی به سمت سرور همانند نمونه زیر باشد:
POST /change_password
POST body:
password=pass123&csrf_token=93j9d8eckke20d433
هکر توکن را حذف نموده و آن را به شکل زیر ارسال می کند تا حمله اجرا گردد.
POST /change_password
POST body:
password=pass123
- مجموعه توکن ها
برخی اپلیکیشنها به جای تعیین یک توکن خاص برای هر سشن، مجموعه ای از توکنها را جهت اعتبار سنجی سشنهای کاربر، استفاده میکنند. هکر برای جعل هویت هر یک از کاربران سایت، صرفا باید یکی از توکنهای موجود در مجموعه را دریافت کند. مهاجم با استفاده از حساب کاربری خود میتواند وارد اپلیکیشن شده و توکن را به دست آورد. به عنوان مثال:
[application_url].com?csrf_token=93j9d8eckke20d433
به دلیل اشتراکی بودن توکنها، هکر میتواند یکی از آنها را کپی نموده و برای ورود به حساب کاربری دیگری استفاده کند.
- توکن CSRFها را میتوان در کوکی کپی نمود
برخی از اپلیکیشنها، پارامترهای مربوط به یک توکن را در کوکی کاربر کپی میکنند. اگر هکر به چنین کوکی دست یابد، به راحتی میتواند با ایجاد یک کوکی دیگر و قرار دادن آن در مرورگر، یک حمله CSRF را اجرا نماید. بنابراین، هکر میتواند با استفاده از حساب کاربری خود وارد یک اپلیکیشن شده و در فایل کوکی به دنبال بخشی مانند زیر باشد:
Csrf_token:93j9d8eckke20d433
سپس به منظور تکمیل فرآیند حمله، میتواند از این اطلاعات برای ایجاد یک کوکی دیگر استفاده کند.
- توکنهای نامعتبر
در برخی از اپلیکیشنها، توکنهای CSRF با سشن کاربر مطابقت داده نمیشوند. در چنین شرایطی هکر میتواند وارد یک سشن شده و برای سازماندهی حملات CSRF، یک توکن CSRF مشابه با موارد بالا، ایجاد کند.
جلوگیری از حملات CSRF با استفاده از header ارجاع دهنده
استراتژی دیگر برای جلوگیری از حمله CSRF، استفاده از header ارجاع دهنده است. در HTTP، هدرهای ارجاع دهنده منشا صدور درخواستها را نشان میدهند. آنها معمولا برای آنالیز، بهینه سازی و لاگها استفاده میشوند.
همچنین، برای پیشگیری از حمله CSRF میتوانید هدرهای ارجاع دهنده را از سمت سرور فعال کنید. سمت سرور، منبع درخواست را چک نموده و هدف را مشخص میکند. اگر مطابقت داشته باشند، درخواست مجاز خواهد بود. در صورت عدم تطابق، سرور درخواست را رد کرده و به آن پاسخ نخواهد داد.
به کار گیری هدر ارجاع دهنده بسیار سادهتر از توکنها است زیرا نیازی به شناسایی انفرادی کاربر ندارد.
آسیب پذیریهای احتمالی header ارجاع دهنده
header ارجاع دهنده همانند توکنهای CSRF، آسیب پذیریهای مهمی دارد. وجود header ارجاع دهنده ضروری نبوده و برخی از سایتها میتوانند بدون آن، درخواست ارسال کنند. اگر CSRF سیاستی برای رسیدگی به درخواستهای بدون هدر نداشته باشد، هکرها میتوانند از آن درخواستها برای حملات CSRF و تغییر وضعیت، استفاده نمایند.
آنها میتوانند بخشی از اطلاعات header ارجاع دهنده را در معرض نمایش قرار دهند یا مانند مثال زیر، با افزودن یک تگ metadata در صفحه HTML، آن را غیرفعال کنند:
<meta name="referrer" content="no-referrer">
قطعه کد فوق، header ارجاع دهنده را برای تمامی درخواستهای یک صفحه حذف مینماید. این کد کار اپلیکیشنهایی که نیاز به header ارجاع دهنده برای جلوگیری از حملات CSRF از چنین صفحاتی را دارند، سخت میکند.
از یک شرکت هاستینگ امن استفاده کنید
علاوه بر توکنهای CSRF و header ارجاع دهنده، استفاده از یک شرکت هاستینگ امن مانند میهن وب هاست راهکار آسانتری است. استفاده از یک هاست قدرتمند برای سایتها و اپلیکیشنهای تحت وب، امنیت بیشتری را برای کاربران شما در برابر هکرها، فراهم میکند. علاوه بر این، میهن وب هاست دارای امکانات امنیتی پیشرفته و همچنین بکاپگیری خودکار، احراز هویت دو مرحله ای و فایروالهای قدرتمند است.
جمع بندی
جعل درخواست بینسایتی یا همان حمله CSRF، حملهای است که کاربران را فریب میدهد تا به یک سایت دارای سیستم احرازهویت، به صورت ناخواسته درخواست تغییر وضعیت ارسال کنند. هکرها اپلیکیشنهایی را برای هک کردن انتخاب مینمایند که بین درخواستهای تغییر وضعیت معتبر و جعلی، تمایزی قائل نمیشوند.
حملات CSRF صرفا در اپلیکیشنهایی که برای شناسایی کاربران به کوکیهای سشن متکی بوده و سیاست کوکی SameSite ضعیفی دارند، موفق خواهند شد. همچنین، هکرها از سروری که درخواستهای بدون پارامترهای ناشناخته مانند گذرواژه را بپذیرد، سو استفاده میکنند. آنها می توانند حملات مخرب CSRF را با استفاده از درخواستهای GET یا POST انجام دهند.
برای پیشگیری از این نوع حملات استفاده از توکنهای CSRF یا اجرای header ارجاع دهنده میتواند مفید باشد. با این حال، هر کدام از این اقدامات دارای آسیبپذیریهای احتمالی هستند که اگر مراقب نباشید، میتوانند بی فایده شوند.