حملات CSRF یا XSRF، در این حمله کاربر در صفحه مدیریت سایت خود لاگین است یا مهاجم از طریق یک لینک کاربر را مجبور به وردو به مدیریت سایت میکند بدون آنکه کاربر متوجه این موضوع باشد و درنهایت به صفحه مورد نظر دسترسی خواهد یافت. این حمله از طریق کشف آدرس هایی که محتوایی را تایید و ارسال میکنند اتفاق می افتد (مانند صفحات لاگین). کدهای اجرایی میتواند از قالب یک URL source در یک تصویر ذخیره شود بصورتی که کاربر از رخداد و اجرای URL آگاهی پیدا نکند. عموما تزریق از طریق image tag در HTML يا JavaScript انجام مي شود در صورتی که در سایت بصورت غیر امن (http) متصل باشیم و یا کوکی ها روی مرورگر ذخیره شده باشند این حمله با احتمال موفقیت بالاتری اجرا خواهد شد.
سرویس PayPal یک مرتبه با آسبی پذیری CSRF روبرو شده است. نمونه دیگر این مشکل در Google رخ داد، در حالی که مهاجم میتوانست اطلاعات اکانت Google کاربر را کشف کند و به اکانت قربانی دسترسی یابد.
عموما صفحات ثبت نام عمومی که با ارسال و دریافت اطلاعات طراحی شده اند بیشتر هدف این حمله قرار میگیرند و از متدهایی مانند GET یا POST میتواند استفاده کند.
راهکار رایج برای مقابله این مشکل ایجاد یک رشته کد (توکن) بصورت تصادفی که هم برای کوکی استفاده میشود و هم در آدرس ایجاد شده بصورت پنهان وجود خواهد خواهد داشت. در هنگام ارسال فرم بررسی می شود آیا CSRFToken در فرم همان CSRFToken ذخیره شده در کوکی است یا خیر و در صورت یکسان بودن اجازه اجرا و ارسال اطلاعات و یا لاگین را خواهد داد.
راهکارها:
همانطور که اشاره شد جلوگیری از CSRF معمولا نیاز به گنجاندن رمز غیر قابل پیش بینی در هر درخواست HTTP دارد. این کد باید حداقل و برای هر session کاربر بصورت مجزا باشد.
1 - قرار گرفتن یک Token منحصر به فرد بصورت پنهان در بدنه در خواست HTTP ارسال میشود.
2- استفاده از reauthenticate درخواست با استفاده از ابزاری مانند کد CAPTCHA
3- استفاده از OWASP’s CSRF Guard
OWASP سازمان بین المللی جهت استاندارد کردن ایمن سازی در طراحی و پیاده سازی می باشد. (Open Web Application Security Project)
یک نمونه کد PHP مشکل دار بصورت زیر است:
<?php
if (isset($_POST["user"], $_POST["pass"])){
// code for checking the user and password
} else {
echo '
<form method="post">
<input name="user">
<input name="pass" type="password">
<input type="submit">
</form>
';
}
?>
این کد اجرای عملیات از سمت فرستنده را بررسی نمیکند که دستور اجرایی از چه طریقی اجرا میشود. آیا یک کاربر واقعی است یا خیر.
کدی که میتواند کاربر بازدید کننده را با توجه به کد بالا فریب دهد:
<form id="LoginForm" action="http://target/login.php" method="post">
<input name="user" value="foo">
<input name="pass" type="password" value="bar">
<input type="submit">
</form>
<script>
document.getElementById("LoginForm").submit();
</script>
مرورگر یک درخواست POST با اعتبار ورود به صفحه PHP که چک می کند اگر آنها درست باشند و سپس کاربران به سیستم لاگین میشوند.