ایجاد: ۱۳:۱۱ ۱۳۹۱/۷/۵
ویرایش: ۱۳:۴۴ ۱۳۹۴/۱/۲۶
»
CSRF مخفف Cross-Site Request Forgeries است. درخواستی جعلی که از طریق یک سایت دیگر میآید. مثلا «فرض کنید» کاربران سایت google.com با رفتن به صفحه google.com/logout کوکیشان حذف و در نتیجه logout میشوند.
حال اگر یکی از کاربران یک سایت دیگر (مثلا یک کاربر در یک انجمن و فاروم خیلی شلوغ) عکس زیر را در آنجا درج کند، چه اتفاقی خواهد افتاد؟
<img src="http://www.google.com/logout/" alt="" />
بله؛ همه کسانی که صفحهی حاوی عکس فوق را باز کنند، درخواست محتوای آدرس google.com/logout از طرف براوزرشون (و به همراه کوکی آنها) برای سایت گوگل ارسال میشود و موجب میشود تا همه کسانی که آن صفحه را میبینند، از اکانت گوگلشان بیرون انداخته شوند!
خب این یک مثال ساده و غیرخطرناک بود. حالتهای خطرناکی نیز وجود دارد که در ادامه مطلب به برخی از آنها اشاره میشود.
1) حذف یا تغییر اطلاعات شما در یک سایت خاص
مثلا «فرض کنید» شما در سایت بلاگفا وبلاگی دارید و طی سالیان گذشته با زحمت و دقت فراوان، 500 مطلب خوب در آن نوشتهاید.
«فرض کنید» جهت حذف یک مطلب در محیط مدیریت، کلیک بر روی لینک حذف مطلب که به صورت زیر است، کافی باشد:
http://www.blogfa.com/Desktop/DeletePost.aspx?postid=5
کافی است که مهاجم، یک ایمیل به شما بزند که در بخشی از آن این 2000 تصویر 1×1 پیکسل را گنجانده باشد:
<img src="http://www.blogfa.com/Desktop/DeletePost.aspx?postid=1" width="1" height="1" alt="" style="border:0 none;" />
...
<img src="http://www.blogfa.com/Desktop/DeletePost.aspx?postid=2000" width="1" height="1" alt="" style="border:0 none;" />
وقتی شما نامه فوق را که در ظاهر از طرف یکی از مخاطبین سایت آمده، باز کنید تمامی مطالب شما در بلاگفا پاک میشود!
البته مثال بالا فقط یک مثال فرضی بود و بلاگفا با استفاده از روشهای پیشگیری از حملات csrf (که در انتهای مطلب آمده)، جلوی آن را گرفته است اما کماکان سایتهای زیادی هستند که از این طریق نفوذپذیر هستند.
2) تغییر/انتقال موجودی و سرقت اطلاعات حساب بانکی/مالی شما!
شاید بعید به نظر برسد اما بد نیست بدانید که در سال 2008 اطلاعات 18 میلیون کاربر سایت معروف eBay به همین روش دزدیده شد! (
منبع)
مثلا اگر سایتی برای تغییر مشخصه کاربر یا انتقال پول از آدرسهای ساده زیر استفاده کند، با کمک همان تصاویر 1×1 که در بالا مثال زده شد، میتواند قابلنفوذ باشد:
http://site.com/changeUserDetail/?newName=Qoli!
http://BankSite.com/TransferMyMoneyTo/?targetCardNumber=654173546544
3) حملات تغییر DNS و تسلط کامل روی اطلاعات کاربر!
این یکی واقعا به عقل جن هم نمیرسد! اما خب انسان اشرف و برتر از جن است و برای همین به عقلش رسیده است :)
همانطور که میدانید بسیاری از مودم/روترهای خانگی و اداری، از طریق براوزر قابل دسترسی هستند. حال اگر مودم/روتری برای تغییر DNS SERVER آدرسی شبیه آدرس زیر را استفاده کند:
http://192.168.1.1/DNS/change/?newDNS=15.124.159.251
آنگاه هکر قصهی ما کافیست یک DNS SERVER در سرورش نصب کرده باشد و ip آن را در آدرس فوق لحاظ کند و آن آدرس توسط روشی (مثلا همان تصاویر) در براوزر کاربر فراخوانی شود:
<img src="http://192.168.1.1/DNS/change/?newDNS=31.32.33.34" width="1" height="1" alt="" style="border:0 none;" />
در نتیجه دی ان اس سرور مودم/روتر شما عوض شده و از آن به بعد، مقصد تمام url ها را از ip مذکور خواهد پرسید و ip مذکور هم به همه url ها، ip واقعی را نشان خواهد داد بجز مواردی که بخواهد آن را شنود کند (مثل حساب بانکی و شبکه اجتماعی شما)
روشهای پیشگیری از حملات CSRF یا XSRF
- یکی از مقدماتیترین کارهایی که جلوی اغلب حملات فوق را میگیرد، چک کردن صفحه ارجاع (http refferer) پیش از تمامی اعمال مدیریتی (درج/حذف/ویرایش) است.
-
تمامی حالات فوق مربوط به روش GET و غیر Ajax ـی بود. اما اگر اعمال حساس و مدیریتی با متد POST و خصوصا Ajax ـی انجام شود و post و ajax ـی بودن درخواست هم چک شود، میتوان تا حد زیادی بابت این حملات خیالمان راحت باشد هرچند اگر هکر بتواند شما را به صفحه خودش بکشاند، باز هم امکان انجام حمله با روش post را خواهد داشت که در اینجا مراعات نکته شماره 1 یا Ajax ـی بودن درخواست میتواند منجی شما باشد چرا که در براوزرهای جدید، درخواست ایجکسی فقط اگر از دامنه خودتان رسیده باشد، قابل قبول خواهد بود.
استفاده از براوزر جدید و آپدیت شده (مثل فایرفاکس یا کروم) بسیار مهم است. مسلما کسی که از Internet explorer 6 استفاده میکند، نباید انتظار امنیت داشته باشد. نه فقط امنیت سایتش بلکه امنیت کل سیستمعاملش!
همچنین افزونههای براوزرهای جدید (مثل NoScript که روی فایرفاکس نصب میشود)، مانع برخی حملات میشود.
- ایجاد token (رشته رندوم برای هر بار ورود کاربر که در سشن وی ذخیره میگردد) و لحاظ کردن آن پیش از تمامی عملیاتهای مدیریتی
- محدود کردن عمر کوکی سشن
- اجبار کاربر به ورود مجدد اطلاعات مهم حساب (یا رمز عبور) قبل از انجام عملیاتهای مهم مثل انتقال پول
- اطمینان از عدم وجود فایل clientaccesspolicy.xml که موجب دسترسی ناخواسته SilverLight گردد (منبع و توضیح بیشتر)
- اطمینان از عدم وجود فایل crossdomain.xml که موجب دسترسی ناخواسته Adobe flash گردد (منبع و توضیح بیشتر)
- در صورتی که بخش مدیریت سایت جداست (مثلا در مسیر admin/ قرار دارد)، میتوان بخش ادمین را از طریق زیردامنه خاص و غیرقابل حدس یا حتی دامنه دیگر کنترل کرد تا حملات csrf و همچنین xss تا حد بالایی دفع شود.
همچنین در صورتی که برنامه شما از مسیر و آدرس مجازی برای ارسال پارامترها استفاده میکند، میتوان پس از هر بار login یک رشته رندوم به ابتدای uri اضافه کرد. کاری که cPanel هم جدیدا انجام میدهد.
-
یکی از بهترین و قطعیترین روشهای پیشگیری از حملات CSRF این است که برای احراز هویت یک کاربر، از روشهای مبتنی بر توکن، بجای روشهای مبتنی بر کوکی یا سشن استفاده کنیم که قبلا در این مطلب اشاره شد.
یادداشتهای مرتبط
- API چیست؟
- ارتقاء امنیت وردپرس
- آشنایی با دو قابلیت جدید مرورگرها: WebRTC و ضبط صدا و تصویر!
- لیست مواردی که برای امنیت برنامه PHP لازم است چک شود
- امنیت در انگولر جی اس
- انواع روش های شناسایی و احراز هویت کاربران یک صفحه وب
- موثرترین روش برنامه نویسان برای مقابله با کی لاگر ها
- حملات ضدامنیتی XSS یا تزریق کد
- تنظیم اچ تی ام ال پیوریفایر