تزریق اسکریپت های سمت کاربر (Cross Site Scripting)
در این گونه حملات مهاجم بر روی نقطه ضعف برنامه شما برای کار با ورودی های کاربر که می توانند یک کد HTML یا جاوااسکریپت باشند متمرکز می شود.
$filename="aa";
if (isset($HTTP_POST_VARS['comment'])
and !empty($HTTP_POST_VARS ['comment'])){
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open aa file";
exit;
}
if (fwrite($handle, $_POST['comment']."\n") === FALSE) {
echo "Cannot write to file";
exit;
}
echo "Success";
fclose($handle);
}
?>
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>
این برنامه یک ورودی از کاربر می گیرد و آن را برروی یک فایل ذخیره می کند.سپس محتویات فایل را که ورودیکاربران است را خوانده و بر روی صفحه نمایش میدهد.استفادهاز یک فایل برای ذخیره اطلاعات اینجا صرفا برای ساده ترکردن اسکریپت بوده تا برنامه نویسان سایر زبان ها همبتوانند بدون مشکل کد ها را متوجه شوند.فرق چندانی بین ایناسکریپت و اسکریپتی که از دیتابیس برای ذخیره اطلاعاتاستفاده میکند در موضوع مورد بحث نیست.
تا اینجای کار همه چیز عادیست . حال بیایید عبارت زیر را به برنامه بدهیم:
This is the HTML code injection
همان گونه که مشاهده می کنید تگ H1 نیز بعنوان محتویات عبارت در فایل (یا دیتابیس) ذخیره شده است و در نمایش به علت این که مرورگر آن را تفسیر می کند در فرمت خروجی تاثیر گذار خواهد بود.به سورس خروجی برنامه نگاه کنید:
Success, wrote
hi
This is the first HTML injection
<
br />
بنابراین می توان تگ های HTML را در این برنامه وارد کرده و مرورگر را به تفسیر آن ها واداشت.این امر در مورد جاوا اسکریپت و امثالهم نیز صادق است.من عبارت زیر را به برنامه میدهم.
و پس از ارسال آن برنامه چه چیزی نمایش میدهد؟!:
همان گونه که پیشتر اشاره کردم ایده کلی این گونه حملات استفاده از زبان های کلاینت ساید برای حمله به کاربران استفاده کننده از برنامه یا وب سایت است.
حال تصورش را بکنید که یک مهاجم چگونه می تواند از تگ هایی مثل IFRAME , OBJECT , FORM,SCRIPT ?و ... سواستفاده کند.
$filename="1";
$value=$ HTTP_POST_****IE["Test****ie"]+1;
set****ie("Test****ie", $value, time()+3600);
if (isset($HTTP_POST_VARS ['comment'])
and !empty($HTTP_POST_VARS ['comment'])){
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($handle, $_POST['comment']."\n") === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
echo "Success, wrote";
fclose($handle);
}
?>
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>
این برنامه دقیقا ًمثل برنامه قبلی عمل می کند با این تفاوت که یک کوکی ست می کند و با هر بار بازدید کاربر به مقدار کوکی فوق یکی اضافه می نماید.توجه کنید بسیاری از سیستم های اعتبار سنجی برای اعتبار سنجی کاربران از کوکی استفاده می نمایند.بنابراین اطلاعات ذخیره شده در کوکی می تواند در صورت دزدیده شدن به یک مهاجم امکان جعل هویت به عنوان کاربر معتبر را بدهد.ما در ادامه مقاله سعی در دزدیدن مقدار کوکی ست شده توسط برنامه مثال بالا می نماییم.
با وارد کردن کد زیر می توان به کوکی ها و مقادیر آن ها دسترسی داشت.
و با وارد کردن کد زیر مهاجم می تواند کوکی ها را بوسیله اسکریپتی که در وب سایت خود نوشته بدزدد!
کد دزدیدن کوکی ها مثلا می تواند کد زیر باشد که مهاجم با قرار دادن آن در وب سایت خود و انتقال مرورگر به آن می تواند کوکی ها را در یک فایل یا دیتا بیس ذخیره کرده و از آن ها سو استفاده کند.