
در این بخش از دوره آموزشی SEC542 از موسسه SANS به آشنایی با حملات CSRF یا Cross-Site Request Forgery می پردازیم.
Cross-Site Request Forgery
CSRF حملهای است که تمرکز آن بر روی کاربری نهایی میباشد تا وی یک Action ناخواسته را در یک برنامه وب که هم اکنون در آن احراز هویت شده است، اجرا نماید. این حمله معمولا با مهندسی اجتماعی مانند ارسال یک لینک از طریق ایمیل یا چت همراه است.
نفوذگر ممکن است کاربران را مجبور کند تا عملیات مورد نظر وی را اجرا نمایند. با توجه به اهمیت این حمله، یکی از مراحل تست نفوذ در استاندارد OWASP با عنوان OTG-SESS-005 به موضوع CSRF میپردازد.
حمله CSRF مشابه حمله XSS میباشد اما در این حمله نیازی نیست تا نفوذگر کدهای خود را در برنامه تحت وب Inject نماید. حمله CSRF به سادگی این واقعیت را نشان میدهد که سرورهای وب، به کاربران احراز هویت شده اطمینان دارد و انتقال دستورات غیرمجاز از کلاینت به سرور را بدون اطلاع کاربر امکان پذیر مینماید. سپس این دستورات بر روی سرور با دسترسی کاربر احراز هویت شده اجرا میشود.
به عنوان مثال تصور کنید که یک کاربر به حساب بانکی آنلاین خود وارد میشود. این بانک، اطلاعات احراز هویت را در یک کوکی ذخیره میکند که این اطلاعات تا پایان زمان Session یا خروج کاربر معتبر خواهد بود. فرض کنید ما وب سایتی ایجاد میکنیم که شامل یک اسکریپت است و این اسکریپت میتواند مبلغی را از حساب بانکی کاربر به یک حساب دیگر انتقال دهد. ما محتوای مذکور را به یک وب سایتی که شامل مرجع تصویری به این صفحه میباشد، ارسال میکنیم. در واقع صفحه مورد نظر ما به گونهای ایجاد میشود که دارای تصویری بوده و با مراجعه به صفحه و مشاهده تصویر، اسکریپت مورد نظر ما اجرا میشود.
پس اگر کاربر در حالی که به حساب بانکی خود وارد شده است، این صفحه را باز نماید، اسکریپت با مجوز کاربر اجرا شده و پول وی به حساب ما منتقل خواهد شد.
این حمله میتواند امتیازات مختلفی را بسته به نوع هدف، در اختیار شما قرار دهد. به عنوان مثال اگر اینترفیس وب مربوط به CiscoWorks دارای چنین آسیبپذیری باشد، شما میتوانید مدیریت یک شبکه را در اختیار خود بگیرید.
یکی از کارهایی که توسط توسعه دهندگان برنامههای وب به منظور محدود نمودن چنین حملاتی انجام میشود، استفاده از یک Token در فرمهای ارسال است که با این کار، اطمینان حاصل میشود که درخواستها از فرمهای وب ارسال شدهاند.
لازم به ذکر است، رفع این مشکل در برنامههای وب به عنوان یک اولویت برای توسعه دهندگان وب نیست، زیرا آسیبپذیری CSRF به طور مستقیم بر وب سایت تاثیر نمیگذارد و برای استفاده از آن به یک اکشن از کاربر نیاز میباشد. به همین دلیل درجه اهمیتی که برای این آسیبپذیری در نظر گرفته میشود پایین تر از حملاتی مانند SQL Injection، Command Injection و یا سرریز بافر است.
ولی به صورت کلی نباید این آسیبپذیری را نادیده گرفت، زیرا در این نوع حملات، نفوذگران اغلب از مهندسی اجتماعی بهره میبرند و اکثر سازمانها و کاربران آنها در برابر این حمله آسیبپذیر هستند.
نفوذگر معمولا یک لینک را برای انجام تراکنش با استفاده از پارامترهای قابل پیش بینی ایجاد میکند. سپس این لینک را با روشهای مختلفی برای قربانی ارسال میکند. این لینک میتواند از طریق شبکههای اجتماعی مانند فیس بوک یا انجمنهای پرسش و پاسخ ارسال شود و در شیوهای دیگر نفوذگر میتواند با استفاده از حملاتی مانند DNS Poisoning کاربر را مجبور به مشاهده لینک ایجاد شده نماید. این لینک میتواند یک تگ Image، Iframe، کد جاواسکریپت یا CSS و یا XML باشد و پس از مراجعه کاربر به آن، تراکنش مورد نظر نفوذگر انجام شود.
تصور کنید که یک مدیر شبکه به کنسول وب CiscoWork لاگین میکند. معمولا مدیران شبکه وارد چنین کنسولهای میشوند و ارتباط خود با آنها را در تمام روز نگه میدارند و اقدام به انجام فعالیتهای دیگر مینمایند. در این صورت نفوذگر لینک مخرب خود را در یک وب سایت فناوری اطلاعات قرار میدهد. هنگامیکه مدیر شبکه از وب سایت محبوب خود بازدید میکند و نظرات آن را میبیند، مرورگر وی، اسکریپت ایجاد شده توسط نفوذگر را اجرا نموده و عملیات مورد نظر نفوذگر در CiscoWork را انجام میشود. در این روش نفوذگر میتواند تغییرات در شبکه و یا ایجاد یک درب پشتی را درخواست نماید تا چنین مواردی در حملات بعدی به وی کمک نماید.
نکته: نفوذگران اغلب سایتهای مختلفی را مورد نفوذ قرار میدهند و اقدام به دیفیس آنها نمیکنند. آنها از این وب سایتها برای حملات مشابه مثال بالا استفاده میکنند. نفوذگران ممکن است از وب سایتهای مختلف و بزرگی دسترسی داشته باشند ولی با توجه به اینکه از این وب سایتها میتوان در حملات بعدی استفاده بهتر برد، اقدام به افشای دسترسی یا حتی دیفیس نمیکنند.


Detecting CSRF
شناسایی حمله CSRF یا Cross-Site Request Forgery دشوار است زیرا این حمله بر صفحاتی متکی است که بخشی از برنامه تحت وب نیستند. معمولا CSRF توسط اسکنرهای امنیتی کمتر شناسایی میشود و بنابراین برای شناسایی آن باید از تکنیکهای دستی استفاده نمود.
به منظور شناسایی این حمله ابتدا باید منطق برنامه را بررسی کنید که این مورد با توجه به جمع آوری اطلاعات انجام شده صورت میگیرد. سپس صفحاتی که یک عمل حساس انجام میدهند و دارای پارامترهای قابل پیش بینی هستند را شناسایی نمایید. در ادامه یک سند HTML ایجاد نمایید که حاوی تگهایی است که به صفحه حساس مورد نظر اشاره دارد. در این بخش استفاده از تگهای IMG و IFRAME پیشنهاد میگردد. سپس به برنامه وب لاگین نموده و سعی کنید به صفحه ایجاد شده دسترسی پیدا کنید. سپس تایید کنید که آیا Action مورد نظر شما اجرا میشود یا خیر.
Attacking CSRF
Exploit نمودن آسیبپذیری CSRF یا Cross-Site Request Forgery همواره یک فرآیند دستی میباشد. هنگامیتست نفوذگر این آسیبپذیری را در برنامه وب کشف میکند، باید یک صفحه سفارشی ایجاد کند که حاوی یک لینک به Transaction آسیبپذیر میباشد. این صفحه معمولا دارای تگهایی مانند IMG یا IFRAME میباشد. البته شما میتوانید از هر تگ و یا اسکریپتی که بدون تعامل کاربر اجرا میشود نیز استفاده نمایید. سپس نفوذگر باید این لینک را به قربانی برساند تا هنگامیکه یک Session فعال وجود دارد، قربانی وارد لینک ایجاد شده گردد.
در طی برخی از تستها، این کار با فریب مشتری (مهندسی اجتماعی) انجام میشود. بعد از اینکه قربانی به لینک مورد نظر مراجعه کرد، تست نفوذگر باید تایید کند که حمله رخ داده است. اگرچه ایجاد این صفحه بسیار ساده به نظر میرسد ولی به خاطر داشته باشید که تست نفوذگر باید آسیبپذیریهای متعددی را تست نماید.
ZAP and CSRF
در حال حاضر ابزار ZAP دارای قابلیت ساختن یک صفحه برای حملات CSRF میباشد که میتواند برای تست نفوذ مفید باشد. در این قابلیت به جای استفاده از تگهایی مانند IMG یا IFRAME، ابزار ZAP یک فرم ایجاد میکند که شامل مقادیر ارائه شده توسط صفحهای است که برای تولید فرم از آن استفاده میشود. البته در این مرحله نیاز به کوشش و خطای تست نفوذگر میباشد تا دقیقا مواردی که لازم است منجر به موفقیت در حمله CSRF شود را شناسایی نماید.
فرم ایجاد شده توسط ابزار ZAP بسیار مفید بوده و مقدار زمان لازم برای ساختن PoC را کاهش میدهد. البته این صفحه برای انجام عملیات مورد نظر ما نیاز به کلیک بر روی دکمه Submit دارد که باید توسط قربانی صورت گیرد. انجام این فرآیند توسط قربانی امری بعید به نظر میرسد ولی به صورت کلی از این روش اغلب برای اثبات آسیبپذیری در فرآیند تست نفوذ استفاده میشود ولی برای انجام حمله میتوانید از قابلیتهایی مانند XHR یا XMLHTTPRequest استفاده نمایید.