زمان مطالعه : ۶ دقیقه

آسیب‌پذیری CSRF همان موضوعی است، همیشه در مباحث امنیت می‌گوییم که نباید روی هر لینک یا فایلی که برای شما از طریق‌های مختلف مثل شبکه‌های اجتماعی، سایت‌ها، ایمیل و … ارسال می‌شود کلیک کنید زیرا باعث هک شدن سیستم‌های شما می‌شود. در این مقاله آموزشی می‌خواهیم به یک آسیب‌پذیری خطرناک به نام CSRF  صحبت کنیم که تاکنون سرویس‌های قوی و معروفی چون Netflix  و Youtube دچار آن شده‌اند. به این نوع حمله لقب  “هیولای خفته‌ی جهان امنیت وب” را داده‌اند. پس با متخصص شو همراه باشید تا به صورت کامل با آسیب‌پذیری CSRP آشنا شوید.

آسیب‌پذیری CSRF چیست؟

آسیب‌پذیری CSRF مخفف Cross Site Request Forgery است اما برخی آن را بانام‌های XSR، Sea Surf(موج‌سواری)، Session Riding(جلسه رانی)، Hostile Linking(پیوند خصمانه) و One Attack(حمله یک کلیکی) نیز می‌شناسند. این حمله ازجمله حملات خطرناک سمت سرور (Server-Side) است که سایت‌هایی که دارای سیستم احراز هویت کاربران برای ورود و عضویت رادارند مانند سرویس بانک‌ها، مراکز آموزشی، فروشگاه‌ها و … را درگیر خود می‌کند.
آسیب‌پذیری CSRF را اگر بخواهیم به فارسی ترجمه کنیم می‌توان به آن “حملات جعل درخواست” بگوییم. پس هکر با کمک فرستادن درخواست جعلی توسط هویت کاربر قربانی، موفق به آسیب‌پذیری و عملکرد در سطح‌های مختلف، ضررهای گوناگونی را وارد کند.

آسیب‌پذیری CSRF

تأثیرات حمله جعل درخواست (CSRF)

با کمک حمله جعل درخواست (CSRF) که بر اساس عملکرد برنامه کاربردی (Web Application)، هکر می‌تواند آسیب‌پذیری های مختلف و مخصوص به خود را داشته باشد که عبارت‌اند از:

  • تغییر ایمیل یا رمز عبور کاربران قربانی که در این سایت فعالیت دارند.
  • وادار کردن کاربر قربانی با سطح دسترسی بالا به حذف، ایجاد یا تغییر لیست اطلاعات یا کاربران
  • انتقال وجه توسط هویت کاربران قربانی به‌صورت ناخواسته در صورت وجود باگ در سیستم انتقال وجه بانک
  • ثبت محتوای دلخواه از حساب کاربر قربانی در سایت‌هایی که اجازه ثبت محتوا با حساب کاربری خود رادارند

بنابراین هکر می‌تواند با توجه به اهداف و اقداماتی که مدنظر دارد کنترل کامل حساب کاربر یا حتی دسترسی کامل به تمام داده‌ها و اطلاعات را به‌دست گیرد.

چگونه می‌توان آسیب‌پذیری CSRF را کشف کرد؟

آسیب‌پذیری CSRF برای اینکه در یک برنامه بتوان پیاده‌سازی کرد باید سه شرط زیر را داشته باشد:

اقدام مطلوب برای ساخت درخواست جعلی

یک عملکرد یا اقدامی باید در برنامه کاربردی باشد که هکر با کمک آن بتواند درخواست جعلی ایجاد کند مثل تغییر رمز عبور، دادن دسترسی به کاربران و …

احراز هویت بر اساس کوکی

هویت و نشست کاربران با کمک ریکوئست HTTP توسط کاربر ارسال‌شده است مشخص می‌شود و با کمک کوکی نشست تنها راهی است که می‌توان سشن ها و اعتبارسنجی ریکوئست‌های کاربران قربانی را شناسایی کرد.

عدم وجود پارامترهای غیرقابل حدس

جعل درخواست رازمانی می‌توان در برنامه کاربردی از بین برد که پارامترهای غیرقابل تشخیص یا حدس هکر باشد برای مثال زمانی که هکر پسورد کاربران قربانی را می‌خواهد تغییر دهد حتماً پسورد فعلی از کاربران درخواست شود تا هرکسی نتواند به‌راحتی این کار را انجام دهد.

CSRF Example

ابزارهای کشف آسیب‌پذیری CSRF

ابزارهای کشف آسیب‌پذیری CSRF که نقش پروکسی داخلی را برای آنالیز درخواست ریکوئست و پاسخ‌ها برای ما ایفا کنند عبارت‌اند از:

  • Burp Suite
  • Fiddler
  • Postman

مزیت‌هایی که این ابزارها در اختیار ما قرار می‌دهند ایجاد تغییر در درخواست و همچنین مشاهده‌ی پاسخ‌ها به‌صورت خام(RAW) است که در تست آسیب‌پذیری CSRF به ما کمک می‌کند.

انواع آسیب‌پذیری CSRF

حملات آسیب‌پذیری CSRF را ازنظر اجرا و پیاده‌سازی می‌توان به سه نوع تقسیم‌بندی کرد:

  • سناریو متد GET
  • سناریو متد POST
  • سناریو متد PUT

هکرها در حملات آسیب‌پذیری CSRF به دلیل آن‌که یک سایت را مورد هدف قرار می‌دهند، بیشتر از تکنیک‌های مهندسی اجتماعی که در دوره آموزشی هک قانونمند نسخه ی ۱۱ (CEH v11) به‌صورت کامل در مورد آن صحبت شد برای بهتر انجام دادن حمله خود استفاده می‌کنند.

سناریو متد GET

سناریو متد GET، سایت آسیب‌پذیر برای اقدام‌های حساس همانند انتقال وجه، تغییر در نام کاربری، ایمیل یا رمز عبور و … از متد GET استفاده می‌کند که باعث بالا رفتن شدت آسیب‌پذیری CSRF در برنامه می‌شود.

اگر بخواهیم یک مثال شفاف برای درک بهتر این موضوع بزنیم. یک بانک که از متد GET استفاده می‌کند، هکر زمانی که می‌خواهد مبلغ ۲۰ هزار تومان را به‌حساب فردی با شماره کارت فرضی ۲۵۸ انتقال دهد. به‌راحتی پس از واردکردن اطلاعات و انتخاب گزینه‌ی “انتقال”، مشاهده می‌کند که درخواست او به‌صورت GET در حال ارسال است و محتوای URL، رشته‌ای مانند زیر است:

http://bank.com/transfer.do?acct=258&amount=200000

همان‌طور که مشاهده می‌کنید تمام شرایط آسیب‌پذیری CSRF را دارد و تنها با تغییر پارامترهای amount و acct می‌تواند با حساب کاربری قربانی که وارد سایت شده است و در وضعیت آنلاین قرار دارد پول به‌حساب شخص موردنظرش ارسال کند.

روش‌های مهندسی اجتماعی که برای این کار هکر می‌تواند استفاده کند:

  • ارسال یک ایمیل به همراه یک فایل صفحه html
  • قرار دادن یک آدرس URL از صفحه‌ی اجرایی یا یک اسکریپت در صفحاتی که به‌احتمال‌زیاد در انجام عملیات بانکی توسط کاربر قربانی دیده می‌شود.

تنها کدی که برای انتقال پول نیاز هست در آن صفحه‌ی HTML وجود داشته باشد تا هکر به هدف خود برسد یک تگ a به‌صورت زیر می‌باشد:

<a href="http://bank.com/transfer.do?acct=3654&amount=52025200">
حتما اینجا کلیک کن تا رایگان دانلود کنی!</a>

جای این متن جذاب می‌تواند هر چیزی مثل قرعه‌کشی، گرفتن یک کد تخفیف بسیار ویژه، خواندن یک خبر بسیار جذاب و… باشد.

هکر می‌تواند حتی از کاربر قربانی کلیکی را دریافت نکند و تنها با کمک دستور زیر که در صفحه HTML قرار داده است با کمک تگ‌های form و img پس از اجرای صفحه درخواست خود را عملی کند.

<img src=”http://bank.com/transfer.do?acct=51151&amount=2121542135″ width=”۰″ height=”۰″ border=”۰″>

همان‌طور که در کد بالا می‌بینید هیچ تصویری به دلیل طول و عرض صفر به کاربر نشان نمی‌دهد اما درخواست با کمک متد GET ارسال‌شده و هکر را به هدفش می‌رساند.

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

سناریو متد POST

طبق توضیحات بالا فهمیدیم که نباید از متد GET برای انجام عملکردهای مهم و مؤثر در سمت سرور استفاده کرد و پیشنهاد دادیم که اقدامات و عملیات بالا را با کمک متد POST انجام دهید اما آسیب‌پذیری CSRF می‌تواند سناریو هایی برای هکرها ایجاد کند تا بتوانند با کمک متد POST نیز به اهداف خود برسند.

برای مثال فرض کنید یک برنامه کاربردی قابلیتی دارد که به کاربر اجازه می‌دهد آدرس ایمیل حساب خود را تغییر دهد. زمانی که کاربر این اقدام را انجام می‌دهد، یک ریکوئست HTTP شبیه درخواست زیر ارسال می‌کند:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

email=wiener@normal-user.com

این درخواست ارسالی شرایط لازم برای آسیب‌پذیری CSRF را دارد زیرا:

  • اقدام تغییر آدرس ایمیل روی یکی از حساب‌های کاربر، اقدامی مطلوب هکر است و می‌تواند با کمک آن پسورد را ریست کرده و کنترل کامل حساب کاربر را به‌دست گیرد.
  • برنامه کاربردی برای نشان دادن کاربر ارسال‌کننده درخواست یا ریکوئست، از یک کوکی سشن استفاده می‌کند زیرا مکانیزم دیگری برای ردیابی نشست‌های کاربر وجود ندارد.
  • هکر به‌راحتی می‌تواند مقادیر پارامترهای موردنیاز در درخواست را با توجه به هدف موردنظر خود تعیین کند.

حال زمانی که شرایط برای حمله با کمک CSRF فراهم‌شده است، هکر با کمک کدهای HTML زیر یک صفحه ایجاد می‌کند:

<html>
  <body>
    <form action="https://vulnerable-website.com/email/change" method="POST">
      <input type="hidden" name="email" value="pwned@evil-user.net" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>

اگر کاربر قربانی از صفحه‌ی HTML ساخته‌شده بازدید کند، اتفاقات زیر را مشاهده خواهد کرد:

  • صفحه‌ی ساخته‌شده توسط هکر باعث ارسال یک درخواست ریکوئست HTTP به وب‌سایت آسیب‌پذیر می‌شود.
  • اگر کاربر قربانی در وب‌سایت آسیب‌پذیر لاگین کرده باشد و از قابلیت SameSite در کوکی‌ها استفاده‌نشده باشد، مرورگر به‌صورت خودکار کوکی‌های نشست را به درخواست ریکوئست اضافه می‌کند.
  • وب‌سایت آسیب‌پذیر ریکوئست درخواست شده را همانند یک درخواست عادی توسط کاربر قربانی پردازش کرده و آدرس ایمیل این کاربر را تغییر می‌دهد.

سناریو متد PUT

امروزه باید پذیرفت که آسیب‌پذیریCSRF تنها با سناریو متدGET و POST اتفاق نمی‌افتد و هکرها می‌توانند متدهای دیگری را برای استفاده از این آسیب‌پذیری مثل سناریو متد PUT بیابند و اهداف خود را برای برنامه‌های کاربردی و سایت‌ها پیاده‌سازی کنند.

برای مثال فرض کنید یک برنامه کاربردی وب مربوط به بانک از متد PUT برای انتقال وجه ۲۰ هزارتومانی برای کاربران خود به‌صورت زیر استفاده می‌کند.

PUT http://bank.com/transfer.do HTTP/1.1
{ "acct":"alikarami", "amount":200000 }

هکر با مشاهده دستور بالا در درخواست ارسال‌شده متوجه می‌شود که اطلاعات به‌صورت JSON منتقل و احراز هویت بر اساس کوکی است. درخواست جعلی از سمت کاربر قربانی موردنظر خود را با کمک دستور XHR به‌صورت زیر می‌سازد:

<script>function put() {    var x = new XMLHttpRequest();    x.open("PUT","http://bank.com/transfer.do",true);    x.setRequestHeader("Content-Type", "application/json");    x.send(JSON.stringify({"acct":"attacker", "amount":50000000})); }</script> <body onload="put()"> 

توجه: XmlHttpRequest یا XHR یک API پراستفاده در فناوری Ajax است که در صفحات وب به کاربران کمک می‌کند که بدون رفرش کردن یا انتخاب گزینه‌ای بتوانند جست‌وجوی دقیق‌تر یا هر عملیات دیگه چون واردکردن نام کاربری و … را انجام دهند

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