دوره SEC542 – بخش سی و یکم

دوره آموزشی SEC542

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

اهمیت JavaScript برای تست نفوذکنندگان وب‌اپلیکیشن

اگرچه مرورگرها، زبان‌هایی مانند VBScript و ActionScript را نیز پشتیبانی می‌کنند، اما ما به دلیل محبوبیت زیاد، JavaScript را انتخاب کرده‌ایم. به دو دلیل، یک تست نفوذ کننده باید درک بالایی از JavaScript داشته باشد.

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

دوم، زمانی که می‌خواهیم حملات XSS را پیاده‌سازی کنیم، باید بتوانیم حداقل یک اسکریپت ساده بنویسیم. این اسکریپت می‌تواند محتوای صفحه را تغییر داده و قربانی را به صفحه‌ای دیگر هدایت کند، کوکی‌های قربانی را بدزد و بسیاری کارهای دیگر انجام دهد. این دوره به ما کمک می‌کند به هر دو هدف برسیم.

JavaScript

در سال 1995 شرکت Netscape یک زبان اسکریپت نویسی سمت کلاینت و داینامیک به نام LiveScript را طراحی و منتشر کرد. نام این زبان در مدت کوتاهی به JavaScript تغییر پیدا کرد. انتخاب این نام باعث شد برخی افراد فکر کنند JavaScript و Java به هم مربوط هستند، در حالی که این طور نیست.

JavaScript و Java دو زبان برنامه نویسی مجزا هستند که توسط مفسرهای متفاوت اجرا می‌شوند. به طور عمده، JavaScript در وب‌سایت‌ها مورد استفاده قرار می‌گیرد اما به خاطر داشته باشید که بسیاری از اپلیکیشن‌های کلاینتی مانند email client ها و pdf reader ها نیز این زبان را پشتیبانی می‌کنند.

استفاده از JavaScript در صفحات وب

در این دوره، تمرکز ما بر روی استفاده JavaScript در صفحات وب خواهد بود. JavaScript می‌تواند به دو روش متفاوت و مجزا در یک صفحه استفاده شود. اولین روش، استفاده از تگ‌‌های script است. کد JavaScript می‌تواند داخل تگ‌های script نوشته شده باشد و یا می‌توان با صفت src به آن اشاره نمود.

روش دوم، استفاده از JavaScript به عنوان صفت در یک تگ HTML است. مثال این روش، رخداد onunload در یک تگ body است. با تعریف این رخداد، پس از unload کردن یک صفحه HTML (مثلا با بستن پنجره مرورگر یا کلیک بر روی یک لینک یا ارسال یک فرم)، کد JavaScript نوشته شده در این رخداد اجرا می‌شود.

inline بودن JavaScript به این معناست که کد JavaScript در کنار کد HTML نوشته شده است. به مثال‌های زیر دقت کنید:

SEC542
SEC542

گاهی نیز کد، از یک document دیگر بارگذاری می شود. به مثال زیر دقت کنید:

SEC542

در یک صفحه HTML، ممکن است هرکدام از این روش‌ها، یا همه آن‌ها با هم، استفاده شده باشد.

مقدمات JavaScript

JavaScript نیز مانند زبان‌های دیگر است. در این زبان هر statement یا دستور، فرمانی به مرورگر می‌دهد. واضح است که هر مرورگر کدهای JavaScript را با کمی تفاوت (نسبت به بقیه مرورگرها) تفسیر می‌کند.

چند نکته قابل توجه راجع به این زبان برنامه نویسی وجود دارد. اول اینکه JavaScript کاملا به بزرگی و کوچکی حروف حساس بوده و به عبارتی دیگر case sensitive می‌باشد. بطور مثال، متغیر “name” با متغیر “Name” متفاوت است. در این زبان نیز مانند سایر زبان‌ها، دستورات مرتبط در یک بلوک کد قرار می‌گیرند. به مثال زیر توجه کنید:

if (location.port != 443) {
alert(“No SSL support! “)
}

در کد بالا، شرط if بررسی می‌کند که وب‌سایت بر روی پورت 443 باز شده باشد در غیر اینصورت کد داخل {} اجرا می‌شود.

در JavaScript، برای تعریف کامنت‌های یک خطی (inline) از // استفاده می‌شود.

// This code causes burning!

همچنین می‌توانید برای تعریف کامنت‌های چندخطی (multi-line) از /* */ استفاده کنید.

/* This code was written by Arthur Dent and Ford Prefect */

دستورات شرطی

اولین نوع دستوری که با هم می‌بینیم، دستورات شرطی if/else است. این دستور، مقدار یک شرط را بررسی کرده و در صورت برقرار بودن شرط، عملی را انجام می‌دهد. مثلا چک می‌کند که اگر user agent کاربر IE باشد، شیء مناسبی از AJAX را load کند. دستور else، در صورت برقرار نبودن شرط if، اجرا می‌شود و نوشتن آن اختیاری است.

if (condition)
{
code if condition is true
}
else
{
code if condition is not true
}

دستور بعدی، دستور switch است. این دستور به برنامه نویس اجازه می‌دهد تا به ازای مجموعه‌ای از شرط‌ها (case)، عملیات مختلفی انجام دهد. هر مجموعه از دستورات با رسیدن به دستور break، پایان می‌یابد. اگر break وجود نداشته باشد، شروط مختلف بررسی و دستورات متناظر آن‌ها اجرا می‌شوند. این امکان وجود دارد تا با تعریف یک شرط Default، در صورت برقرار نبودن هیچ کدام از شروط، عملیات خاصی را انجام دهیم.

switch(n)
{
case 1:
execute code
break;
case 2:
execute code
break;
default:
default code
}

دستورات کنترلی

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

while (i <=10)
{
alert(i)
i++
}

حلقه for هم همین رفتار را دارد تنها با این تفاوت که به جای یک شرط، قطعه کد مورد نظر چندین بار تکرار می‌شود.

for (x = 0; x <= 5; x++)
{
alert(“Knock, knock”);
alert(“Banana”);
}
alert(“Knock, knock”);
alert(“Orange”);
alert(“Orange you glad I didn’t say ‘Banana'”);

متغیرهای JavaScript

متغیرهای JavaScript آزاد بوده و نوع مشخصی ندارند. این بدین معناست که برخلاف برخی زبان‌های برنامه نویسی، در JavaScript متغیرها می‌توانند فارغ از نحوه تعریف شدن خود، هر نوع داده‌ای را در خود نگه دارند. تعریف متغیر در JavaScript با کلیدواژه var و سپس نام متغیر صورت می‌گیرد.

متغیرها می‌توانند در زمان تعریف، مقداردهی شوند مثل var x = “Sarah”; و یا می‌توانند بعدا مقداردهی شوند

مثل x = “Sarah”;


یک نکته جالب درباره متغیرها اینست که اگر بعد از مقداردهی به یک متغیر، دوباره آن را تعریف (declare) کنیم، آن متغیر همچنان مقدار قبلی را در خود نگه می‌‌دارد.

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

توابع

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

function name (var,var){
code to execute
}

توابع می‌توانند بطور ساده اجرا شوند و یا می‌توانند با دستور return، مقداری را به کد برگردانند. همچنین برای فراخوانی توابع از نام آن‌ها استفاده می کنیم. مثلا name();
قطعه کد زیر مربوط به تابعی است که به کاربر هشدار داده و سپس مرورگر را به یک آدرس مشخص، هدایت می‌کند:

function alertRedirect(url) {
alert(“Redirecting…”)
window.location = url
}

مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.

درباره نویسنده: احسان نیک آور

ممکن است دوست داشته باشید