
در این بخش از دوره آموزشی SEC542 از موسسه SANS به آشنایی با آشنایی با AJAX یا Asynchronous JavaScript and XML می پردازیم.
Asynchronous JavaScript and XML (AJAX)
AJAX تکنولوژی سازنده Web 2.0 است که با بهره گیری از JavaScript و XML کارکرد اپلیکیشنها را پویا میکند. درواقع AJAX قابلیت ارتباط ناهمگام (asynchronous) بین مرورگر و وبسرور را برای ما فراهم میکند. در وبسایتهای قدیمیتر، با کلیک بر روی یک لینک، درخواست کلاینت به سرور فرستاده میشود؛ سرور درخواست را پردازش کرده و به آن پاسخ میدهد. زمانی که مرورگر پاسخ خود را بطور کامل دریافت میکند، آنگاه کل صفحه را با اطلاعات جدید بازنویسی میکند.
JavaScript به کمک AJAX آبجکتهایی از نوع XMLHttpRequest میسازد. این آبجکتها میتوانند بصورت ناهمگام درخواستهای HTTP ارسال کرده و با دریافت پاسخ، صفحه نمایش را با اطلاعات جدید آپدیت کنند. برای مثال، Google Maps را در نظر بگیرید. وقتی که شما به Google Maps میروید، چیزی را سرچ میکنید و روی نقشه جابجا میشوید، مرورگر شما از AJAX استفاده میکند تا بین سرور و مرورگر ارتباطات دو طرفه برقرار کند و عکسهای سازنده نقشه را از سرور دریافت کند. بدین ترتیب، نقشه بصورت پویا تغییر کرده ولی باقی قسمتهای صفحه ایستا بوده و با هر تغییر بازنویسی نمیشود. این قابلیت ما را به مفهوم کارایی نوع thick client نزدیکتر میکند.
XMLHTTPRequest قدرتمند
آبجکت XMLHTTPRequest قلب AJAX است و به JavaScript اجازه میدهد تا برای دریافت دیتا، در پسزمینه درخواست ارسال کند . بدینترتیب قابلیت تعاملی بودن اپلیکیشن افزایش مییابد.
آبجکت XMLHTTPRequest تعدادی متد و property دارد. پنج متد و property مهم برای استفاده از این آبجکت در زیر آورده شده است:
• open
این متد واقعا کانکشن را برقرار نمیکند بلکه مشخصات درخواست (request) از جمله متد و مقصد ارسال درخواست را تعیین میکند.
• send
درخواست مشخص شده را ارسال میکند؛ مشخص میکند با کامل شدن ارتباط و تغییر ready state چه تابعی باید فراخوانی شود.
• readyState
آشنایی با جمع آوری اطلاعات در وب
وضعیت درخواست را تعیین میکند.
• responseText
محتوای پاسخ سرور در این property قرار داده میشود.
به کدهای زیر دقت کنید:

در این مثال، AJAXProcess تابعی است که خودمان نوشتیم تا پس از دریافت پاسخ از سرور اجرا شود.
readyState
readyState یکی از property های آبجکت XMLHTTPRequest است و اغلب در برنامهنویسی AJAX مورد استفاده قرار میگیرد. این property مشخص میکند که پاسخ سرور (به درخواست ارسال شده با XMLHTTPRequest) در چه وضعیتی قرار دارد. readyState میتواند پنج مقدار بگیرد:
0 : درخواست هنوز ساخته نشده است. (uninitialized)
1 : درخواست آماده شده است.
2 : درخواست ارسال شده است.
3 : در انتظار پاسخ است.
4 : پاسخ کامل شده است.
بر اساس این مقادیر عددی، کد اپلیکیشن عملیات مورد نظر برای اجرا شدن را تعیین مینماید.
مثال XMLHTTPRequest
در این بخش کدنویسی یک صفحه HTML ساده را میبینیم که به کمک XMLHTTPRequest یک درخواست HTTP GET ارسال میکند.

در کد بالا، xhr.open() با منابع و پارامترهای اعلام شده، یک درخواست GET ساخته و آن را ناهمگام (true) قرار میدهد. xhr.send() موجب میشود تا درخواست ارسال شود و سپس تابع فراخوانی شده در onreadystatechange منتظر دریافت پاسخ میماند تا اجرا شود.
Mash-Ups
یکی از محبوبترین ویژگیهای Web 2.0، mash-up ها هستند. با این ویژگی، یک اپلیکیشن دو یا چند سایت دیگر را با خصوصیات سایت خود ترکیب میکند تا اپلیکیشن قویتری به کاربر ارائه دهد. قانون same origin policy که پیشتر راجع به آن صحبت کردیم مشکلاتی را برای این دسته از اپلیکیشنها ایجاد میکند. به همین دلیل بسیاری از اپلیکیشنهای mash-up (ترکیبی) دارای قابلیتهای پراکسی هستند تا درگیر محدودیتهای ناشی از این قانون نشوند.
Same Origin
قانون Same Origin هنوز هم اپلیکیشنهای AJAX را تحت تاثیر خود قرار میدهد. این بدان معناست که JavaScript تنها به دیتایی دسترسی دارد که مبدا آن با مبدا JavaScript اجرا شده یکی باشد. زمانی که آبجکت XMLHttpRequest ساخته میشود، فقط میتواند به سروری که اسکریپت از روی آن گرفته شده، درخواست ارسال کند. یکی بودن مبدا (Same Origin) شامل یک یکی بودن هاست، پروتکل و پورت میباشد.

ویژگیهای Mash-Up Proxy
اپلیکیشنهای یاد شده در بخش قبل معمولا درون خود قابلیتهایی مانند پراکسی را پیادهسازی میکنند. به این ترتیب، درخواستهای کاربران را با کد سمت کلاینت گرفته و از سایت مورد نظر پاسخ دریافت میکنند. زمانی که کد سمت کلاینت به کاربر بازگردانده میشود، به نظر میرسد که اطلاعات از اپلیکیشن mash-up گرفته شده است و بدین ترتیب محدودیتهای قانون Same Origin دور زده میشود.

مشکلات Mash-Up Proxy
مشکل اصلی، کنترل آدرس URL است که پراکسی از آن استفاده میکند. اگر ما بتوانیم مقدار پارامتر URL را عوض کنیم، آنگاه ممکن است بتوانیم کارهای دیگری نیز انجام دهیم. این پارامتر معمولا بخشی از یک درخواست GET یا POST است و میتوانیم با سوءاستفاده از آن، به سایت دیگری دسترسی یابیم مثلا اپلیکیشنهای واقع در شبکه داخلی که بطور مستقیم آنها را نمیتوانیم ببینیم، یا میتوانیم برای پیادهسازی حمله XSS، کدهای مخرب JavaScript را بازیابی و اجرا کنیم. این امکان نیز وجود دارد که اپلیکیشن برای جلوگیری از وقوع حملات، رشته URL را چک کند.
محدوده حملات AJAX
همه حملات معمول مانند SQLi و XSS در مقابل اینترفیسهای AJAX نیز کار میکنند ولی پیادهسازی آنها به دلیل وجود حجم زیادی از کدهای سمت کلاینت که منطق و روال اپلیکیشن را پیاده میکنند، آسانتر است. بدین ترتیب درک منطق اپلیکیشن و سوءاستفاده از آن نیز برای مهاجم راحتتر میگردد.
AJAX حملات جدیدی را معرفی نمیکند اما نقاط ورودی بیشتری را برای تست در اختیار ما قرار میدهد. قابل ذکر است به دلیل آنکه توابع اپلیکیشن توسط کدهای سمت کلاینت فراخوانی میشوند، حملات CSRF نیز در این اپلیکیشنها قابل پیادهسازی است.
AJAX Mapping
map کردن اپلیکیشنهای AJAX در بسیاری موارد دشوارتر است. این به آن دلیل است که خیلی از قابلیتهای اپلیکیشن توسط کدهای سمت کلاینت فراخوانی شده یا به صورت داینامیک تولید میشوند (مانند لینکها). ابزارهای مورد استفاده ما، برای پردازش و ارزیابی این کدها طراحی نشدهاند. به همین دلیل تست نفوذ کننده باید بصورت دستی سایت را بررسی کند تا مطمئن شود همه قابلیتها و کارکردهای اپلیکیشن شناسایی شده است. ابزارهای Burp و ZAP (با AJAX Spider) معمولا خروجی بهتری در map کردن این دسته از اپلیکیشنها ارائه میدهند.
AJAX Exploitation
اکسپلویت اپلیکیشنهای AJAX همانند اپلیکیشنهای غیر AJAX بوده و دشواری بیشتری ندارد. مشکلاتی که به آنها برمیخوریم همان مسائلی هستند که پیشتر مورد بحث قرار گرفتند. مثلا اگر ابزار ما نتواند ضعفهای امنیتی را شناسایی کند، بالطبع نمیتواند آنها را اکسپلویت کند. بهترین راه اینست که بصورت دستی باگها را پیدا کرده و برای اکسپلویت به ابزار بدهیم. برای مثال، SQLMap در آرگومانهای ورودیاش پارامتر مورد نظر برای حمله را از کاربر قبول میکند.
مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.