[CENTER][IMG]http://amrmekkawy.com/blog/wp-content/uploads/2009/10/php-logo.jpg[/IMG]
السلام عليكم
درس معتقدش شوفته فى منتدى عربى قبل كده
نوع بسيط من الثغرات لكن قوى نوعا
بيعتمد على الـ[COLOR="Blue"]Register_globals[/COLOR]
خطورة الثغره دى انها ممكن تتعامل بيها فى السيشون تبع البى اتش بى او الكوكيز او البوست اى حاجه
هههه
[COLOR="red"]مثال بسيط
[/COLOR][PHP]
$user='faris';
$pass='sec4ever';
if($user==$_POST['usr'] and $pass==$_POST['pwd'])
{
$loggedin = true;
}
if ($loggedin)
{
echo 'logged in succesfully';
}
else
{
echo "login error";
}
?>
[/PHP]
كود بيتأكد من اليوزر والباسوورد
لو صح الاتنين بيضيف باراميتر اسمه loggedin
وبعدين بعد كده السكربت بيتأكد اذا الباراميتر loggedin موجود
بيكتب logged in successfully
اذا مش موجود الباراميترloggedin بيطبع error
ايه المشكله؟؟
المشكله انو لو الـ register_global = on
بيقدر اى مستخدم يضيف الباراميتر loggedin يدوى
زى كده مثلا
[COLOR="blue"]vuln.php?loggedin=whatever
[/COLOR]جرب كده
هتلاقى طبع لك logged in
من غير ما تكتب يوزر وباس
مثال للثغره دى
[COLOR="blue"]ثغرة الـwhmcs
[/COLOR]http://www.exploit-db.com/exploits/17999/
مثال آخر لتنفيذ الثغره فى [COLOR="Red"]السيشون [/COLOR]ودى [COLOR="red"]خطيره [/COLOR]جدا
[PHP]{$_SESSION['admin']}
You are in admin panel";
} else {
echo "Not logged in :)";
}
?>[/PHP]
بتشوف السيشون تبع الادمن
لو موجود فيها المتغير admin
ايا كانت قيمته بقى
بتدخلك اللوحه زى الفل
لو مش موجود بيانات الادمن فى السيشون
بتطبع لك not logged in
اوك
ازاى نستغلها؟؟
ببساطه شديده
[COLOR="Blue"]reg.php?_SESSION[admin]=fa
[/COLOR]هتلاقيه طبع رسالة الترحيب وكله تمام
على فكره سكربتات كتير بتستخدم طريقة السيشون دى فى التأكد من ان المستخدم داخل اللوحه :)
مثال للتطبيق
[url]http://sourceforge.net/projects/ananta/files/stable/Gazelle%201.0%20stable/Ananta_Gazelle1.0.zip/download[/url]
[COLOR="Red"]كيفية الحمايه من الثغره؟
[/COLOR]
[COLOR="red"]الحل الأول
[/COLOR] تعديل ملف الـphp.ini
ابحث عن
register_global
وخليها
register_globals = Off
[COLOR="Red"]الحل التانى
[/COLOR]فى السكربت تبعك تخلى الديفولت او الوضع العادى تبع السكربت انو يكون الباراميتر ده ملغى
يعنى يكون loggedin=false
مثال
[PHP]
$user='faris';
$pass='sec4ever';
$loggedin = false;
if($user==$_POST['usr'] and $pass==$_POST['pwd'])
{
$loggedin = true;
}
if ($loggedin)
{
echo 'logged in succesfully';
}
else
{
echo "login error";
}
?>
[/PHP]
كل اللى عملناه ضفنا السطر
$loggedin = false;
بكده الباراميتر ده مش هيتفعل ويكون true غير اما المستخدم يكتب اليوزر والباسوورد صح
[COLOR="red"]الحل الثالث
[/COLOR]بسيط ويوفر وقت
[PHP]function unregister_globals()
{
if (!ini_get('register_globals'))
{
return false;
}
foreach (func_get_args() as $name)
{
foreach ($GLOBALS[$name] as $key=>$value)
{
if (isset($GLOBALS[$key]))
unset($GLOBALS[$key]);
}
}
}
unregister_globals('_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');[/PHP]
حط الكود ده فى اى ملف بتعمل له انكلود فى السكربت تبعك
وبتكون فى امان من المشكله دى :)
اى استفسار موجود ان شاء الله
بالتوفيق للجميع
Faris/.[/CENTER]