مبحث یکم : مقدمه و تاریخچه
مبحث دوم: مراحل نفوذ کردن / جلوگیری از نفوذ
مبحث سوم: حملات شبکه ای
مبحث چهارم - کار عملی
مبحث پنجم - DHCP
مبحث ششم - وب و حملات مطرح در آن
مبحث هفتم - حملات DoS
مبحث هشتم - سیستم عامل
مبحث نهم - مهندسی اجتماعی
مبحث دهم - Vulnerability (آسیب پذیری)

حمله CSRF چگونه کار می کند؟

فرض کنید در یکی از سایت های شبکه اجتماعی مثل Facebook, Google+ و … شما می توانید پروفایل خود را active یا deactivate کنید و یا عکس های خود را طوری تنظیم کنید که فقط به public یا friend نمایش داده شود. فرض کنید در یکی از این سایت ها لینک activation پروفایل آن به صورت www.site.com/activation=1&cid=test است. یعنی وقتی می خواهید پروفایل خود را active کنید لینک به آن صورت در می آید. حال نفوذگری می خواهد این پروفایل را active کند. User و pass آن پروفایل را هم ندارد. سوء استفاده ای که از آن لینک می توان انجام داد بدین گونه است که مثلاً نفوذگر یک ایمیل به فرد مورد نظر خود (که می خواهد پروفایل آن را به حالت غیرفعال ببرد) ارسال می کند و لینک بالا را در آن قرار می دهد و به گونه ای کاربر را جذب می کند که روی آن لینک کلیک کند (مثلاً برای مشاهده یک عکس و یا ….). فرض کنید که در آن لحظه کاربر در حال کار کردن با سایت شبکه اجتماعی خود نیز هست یعنی کوکی آن وجود دارد. وقتی کاربر روی آن لینک کلیک می کند باعث می شود تغییر در فعالسازی پروفایل شبکه اجتماعی اش رخ دهد ( این کار با استفاده از کدهای اسکریپتی مثل document.location.replace=www.site.com/activation=1&cid=test  نیز می تواند انجام گیرد. صرفاً کافی است به نحوی آن لینک load شود. با load شدن آن لینک انگار کاربر روی دکمه تغییر فعالسازی پروفایل خود در سایت شبکه اجتماعی اش کلیک کرده است. به این حمله CSRF می گویند. یعنی یک درخواست جعل شده.

چه زمانی این اتفاق می افتد؟ زمانی که از متود GET استفاده شده باشد تا بتوان URL را فهمید و این لینکی که برای هر کاری است یک لینک ساده ای باشد. یعنی قالب لینک (pattern= الگوی) ثابت باشد.

اما اگر برای تغییر پیغام confirm از کاربر گرفته شود این حمله جواب نمی دهد. البته باز لینک خود confirm هم نباید دارای الگو باشد (یا مثلاً از متود Post استفاده کند که نتوان الگوی آن را درآورد).

برای مثال در سایت mail.yahoo.com بعد از login یک عدد تصادفی در لینک قرار داده می شود که یک عدد رندوم است. البته این عدد رندوم را هم سعی می کنند bypass کنند (هیچ چیزی کاملاً تصادفی نیست و همه به شرایطی وابسته اند و الگوی عدد تصادفی را هم می توان درآورد).

حمله CSRF در  web goat هم می گوید یک ایمیلی به فلانی بفرستید. این ایمیل شامل لینکی است.

CSRF در پایه ای ترین حالت یعنی به یک fake page و deface page عمل redirect انجام دهیم. یعنی: یه زمانی است که در صفحه اول سایتی XSS پیدا می کنیم یعنی می توانیم کدی را قرار دهیم و در آن صفحه اجرا شود. این عملاً خطرناک ترین حالت XSS است. در این حالت کدی را می توان قرار داد که کوکی را بگیرد و یا اگر آدمی باشد که بدخواه باشد چند کار می تواند بکند: 1- کدی قرار می دهد که یک عکس بزرگ در سایت load شود که در این عکس نوشته سایت شما هک شد. یا می تواند آن را redirect کند.

خطرناک ترین حالت XSS استخراج کوکی است که منجر به session-hijacking می شود. زمانی که من داده ای را روی سایت هدف خواسته باشم که فقط دسترسی userها و admin آن سایت به آن وجود دارد. در آنجا هم می توان XSS زد که مثلاً کوکی admin یا کوکی یک کاربر خاص را بیرون بکشم و login کنم و داده مورد نظر خود را بیرون بکشم.

کاربرد دیگر این است که سعی کنیم یک کد معمولی را load کنیم. فرضاً یک XSS را روی 500 سرور پیدا کرده ام و کدی در آنها قرار داده ام که هر کس آن سایت ها را می بیند به سایت abc.com هم یک request داده می شود تا آمار بازدید کنندگانش بالا رود.

اگر در ایمیل خود محتوایی مثل </script><script>alert(‘Hi’)</script><script> قرار دهید و آن را بفرستید وقتی گیرنده آن را دریافت می کند این کد اعمال نمی شود. (باز کردن اسکریپت خودمان) (بستن اسکریپت قبلی)

چون Yahoo، Gmail جلوی این کدها را می گیرند. در فاروم ها (forum) هم جلوی این کار گرفته می شود. در حد اسکریپتی برای بزرگ و کوچک کردن فونت شاید جواب دهد اما اسکریپتی مثل alert و … جواب نمی دهد. در خیلی جاها حتی در پنجره چت هم XSS زده شده است.

تمرین عملی در کلاس مطرح شده است (مربوط به قرار دادن XSS در یک سایت فرضی).

نکته خارج از بحث: پاک کردن اطلاعات (رکورد) جدول در پایگاه داده. فرض کنید می خواهیم کاربر با ID برابر 132 را از جدول users حذف کنیم. کد آن به صورت زیر است:

;mysql>delete from users where id=132

برای مثال اگر می خواهید در یکی از فیلدهای یک فرم ثبت نام XSS انجام دهید و کدی را وارد کنید، دقت کنید که سایز کد باید کمتر از سایر آن فیلد باشد تا در آن، جا بگیرد. مثلاً فیلد آدرس، فیلد خوبی است چون عموماً سایز آن را بزرگ تعیین می کنند.

دقت کنید مثلاً به جای فیلد username، کد زیر را وارد می کنید:

(<script>alert(“Hello”);</script

این عبارتی که به جای username وارد می کنیم در نهایت در یک دستور sql قرار می گیرد. آن دستور sql هم یک where دارد که ممکن است در where آن یک شرط حاوی “ (double quotation) وجود داشته باشد. حال double quotation که شما در کد اسکریپت قرار داده اید ممکن است باعث شود از نظر ساختاری (syntax error) به error برخورد کنید.

 “<Where “<script>alert(“Hello”);</script

در نتیجه وقتی می خواهید XSS کنید کاراکترهای مشترکش با SQL را باید با backslash (\) بی اثر کنید.مثلاً .alert (\”Hello\”); البته بستگی به سرور دارد که آن کاراکتر خاص در آن چگونه بی اثر می شود. غالباً     ‘، “، \ و ; توسط back slash (\) برای زبان های sql بی اثر می شوند.

 

اسکرول به بالا