CSRF چیست؟

  • آخرین بروزرسانی در دوشنبه 14 سپتامبر 2020

    Average rating 5 / 5. Vote count: 2

CSRF کوتاه شده عبارت Cross-Site Request Forgery به معنای “جعل درخواست مابین سایت” است.

در طی یک حمله CSRF، یک کاربر بی گناه در دام حقه حمله کننده میافتد و حمله کننده بدون اطلاع کاربر یک درخواست در بستر وب ارسال می کند. این درخواستی که به سوی یک وب سایت فرستاده می شود می تواند به منظور بدست آوردن یک سری اطلاعات محرمانه یا ایجاد تغییر در حساب کاربری آن شخص [در آن وب سایت] شود.

ویکی پدیا

یک مثال آموزشی از حمله CSRF

برای مثال فرض کنید که یک وب سایت دارید که در آن کاربر امکان وارد شدن به حساب کاربری خود با استفاده از آدرس ایمیل خود دارد.

طبیعتا در حساب کاربری، کاربر وب سایت شما امکان مشاهده پروفایل خود و ویرایش اطلاعاتی از جمله آدرس ایمیل خود را دارد.

اگر کاربر شما بخواهد که آدرس ایمیلش را تغییر دهد کافی است تا یک درخواست GET یا POST از طریق مرورگر به سرور شما بفرستد.

برای یک حمله کننده این امکان وجود دارد که درخواست از سوی سیستم کاربر وب سایت شما بدون اطلاع برای تغییر ایمیل بفرستد.

حالا شاید برای شما این سوال پیش بیاید که حمله کننده از کجا می داند که کاربر مورد نظر در چه وب سایت هایی عضو است که بخواهد به آن وب سایت ها از سوی سیستم کاربر درخواست بفرستد.

یک حمله کننده تحت وب

معمولا در این گونه حمله ها، از قبل الگوریتم هایی طراحی می شود که تمامی احتمالات را در نظر می گیرد و به صورت گروهی درخواست هایی ارسال می شود تا شاید در بین تمامی این درخواست ها چند مورد موفق باشد.

در مثالی از یک حمله CSRF که در ادامه می بینید، داده ای که قرار است تغییر کند در پارامتری به نام “EmailAddress” قرار می گیرد.

اگر کاربر فریب بخورد و وب سایت فرد حمله کننده را بازدید کند، وب سایت حمله کننده درخواست به صورت زیر ارسال می کند.

کد HTML حمله CSRF
کد HTML حمله CSRF به صورت GET

کافی است تا یک صفحه وب را که حاوی کد بالاست مشاهده کنید تا درخواستی به یک وب سایت که اتفاقا شما هم در آن عضو هستید بدون اطلاع شما ارسال شود.

حالا اگر حتی وب سایت شما به گونه ای طراحی شده باشد که برای تغییر ایمیل باید به آن درخواست را در قالب POST ارسال کنید هم باز برای حمله کننده مشکل خاصی به حساب نمی آید:

کد HTML حمله CSRF
کد HTML حمله CSRF به صورت POST

در هر دو حالت، حمله کننده بدون اطلاع کاربر وب سایت شما می تواند ایمیل آن را در سرور وب سایت شما تغییر دهد.

فرآیند انجام حمله CSRF

حالا تنها کاری که لازم است برای بدست آوردن حساب کاربری کاربر شما انجام دهد این است که درخواست ریست پسورد دهد.

با این کار پسورد جدیدی به ایمیلی که حمله کننده تعیین کرده است ارسال می شود و عملا کاربر وب سایت شما بدون این که در جریان باشد دسترسی به اکانت خود را از دست می دهد.

حالا فرض کنید این وب سایت، وب سایت شما نباشد و وب سایت یک بانک باشد.

یک مشکلی که ممکن است در این حمله سر راه حمله کننده باشد این است که در هنگام انجام حمله، کاربر باید از قبل در وب سایت لاگین کرده باشد که معمولا هم این طور است.

توکن CSRF چیست؟

توکن CSRF یک عبارت یکتا، امن و غیرقابل پیش بینی است که برای جلوگیری از حمله CSRF باید سمت سرور تولید شود و در قالب پاسخ به درخواست HTTP به سمت کاربر ارسال شود.

هنگامی که کاربر دوباره درخواست HTTP بفرستد، توکن فرستاده شده به کاربر با توکن تولید شده سمت سرور مقایسه می شود.

اگر توکنی وجود نداشته باشد یا یکسان با توکن تولید شده سمت سرور نباشد، درخواست کاربر پذیرفته نمی شود.

اینجاست که حمله CSRF با شکست روبرو می شود چرا که در این حمله، حمله کننده اطلاعی از مقدار توکن CSRF ندارد و نمی تواند آن را هم به سایت مقصد ارسال کند.

این توکن چگونه تولید می شود؟

در تولید توکن CSRF باید غیرقابل پیش بینی بودن رعایت شود.

بنابراین باید از الگوریتم های رمزنگاری و استفاده از Timestamp در ساخت یک عبارت استفاده کنید.

البته اگر از یک فریمورک آماده برای توسعه پروژه های خود استفاده می کنید، مثلا لاراول یا کدایگنیتر … این فریمورک ها به صورت پیشفرض از این تکنیک پشتیبانی می کنند.

در این صورت کافی است تا از دستورالعمل های توضیح داده شده استفاده کنید و نیازی به تولید توکن و بررسی دستی آن نیست.

این توکن را چگونه باید به سمت کاربر فرستاد؟

یکی از روش های موثر و خوب برای فرستادن توکن به سمت کاربر، استفاده از یک فیلد پنهان HTML و مقدار دهی به آن است.

به صورتی که در فرم POST که توسط کاربر ممکن است برای مقاصد مختلف از جمله بروزرسانی حساب کاربری استفاده شود، گنجانده شود.

<input type="hidden" name="csrf-token" value="CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz" />

برای این که ایمنی کار بیشتر شود، بهتر است فیلدی که دارای توکن CSRF است در ابتدای صفحه HTML قرار گیرد.

یعنی پیش از هر فیلد ورودی غیر پنهان و پیش از هر قسمتی که کاربر می تواند داده آن فیلد را تغیین کند.

در نتیجه، حمله کننده نمی تواند از تکنیک داده پیش ساخته (Crafted Data) برای دستکاری صفحه HTML و دریافت بخشی از محتوای آن استفاده کند.

نباید ها:

  • توکن CSRF نباید از طریق درخواست GET از سمت کاربر به سمت سرور ارسال شود.
  • توکن CSRF نباید از طریق کوکی مبادله شود.

چگونه باید توکن را اعتبارسنجی کرد؟

زمانی که یک توکن CSRF تولید می شود، می بایست در سمت سرور نیز در قالب داده های Session کاربر ذخیره شود.

زمانی که درخواستی در سمت سرور از سوی کاربر دریافت می شود که نیاز به اعتبارسنجی دارد، سرور باید بررسی کند که آیا درخواست دارای توکن CSRF هست یا خیر.

سپس باید بررسی شود که آیا توکن ارسال شده با توکنی که در Session کاربر ذخیره شده یکسان است یا خیر.

برای دنبال کردن نوشته های کاپ کد به کانال تلگرامی آن (cupcode_ir@) بپیوندید!

دیدگاه خود را بیان کنید

@