كأن واجهة تسجيل الدخول مأخوذة من Cpanel

أيضا موقعك به ثغرة SQLi !!

POC

http://www.sfhati.com/?id=1%27%20AND%20SLEEP(5)%20%23

نعم تم أخذ تصاميم كثيرة من عدة أماكن في لحظة ما يمكن تغيير التصميم ولكن المهم كان عندي هو فكرة النظام وعند إكتمال الشرح سيتم إعطاء نسخ تجريبيه لتكتمل الصورة , بالنسبه للثغره لم أفهمها ... مع أني قمت بعمل فلترة لجيمع المتغيرات من خلال هذا الكود البسيط :

 function filter_vars($var, $i = 1) {
   $search = array('%', '[', ']');
   $replace = array('%', '[', ']');
   $var = str_replace($search, $replace, $var);
   if ($i) {
       $var = htmlspecialchars(strip_tags(@addslashes($var)));
   }
   return $var;
}

هل لديك أي إضافة أو مساعدة بهذا الخصوص ؟ وشكرا مرة أخرى

كود الفلترة هذا لا يفلتر أي شي في حالة نسيت إستدعاء الدالة بهذه الطريقة

   filter_vars($_GET['id'],true);

إذا كنت متأكد أنك تريد إستقبال رقم في المتغير

   $_GET['id'] 

حاول تحويله لرقم لتفادي أي مشكل

 $_GET['id'] = intval($_GET['id']);

أشكر سرعه الرد :)

الداله السابقة يتم تنفيذها من خلال هذا الكود

 /* * ******************************** request vars****************************************** */
 foreach ($_REQUEST as $KEy => $VAl) {   
    if (is_array($_REQUEST[$KEy])) {
        foreach ($_REQUEST[$KEy] as $KEy1 => $VAl1) {
            if (is_array($$KEy)) {
                $$KEy = array_merge($$KEy, array($KEy1 => filter_vars($VAl1)));
            } else {
                $$KEy = array($KEy1 => filter_vars($VAl1));
            }
        }
    } else {
        $$KEy = filter_vars($VAl);
    }
 }

على كل قمت بإضافة الداله mysql_real_escape_string وتم الموضوع ولكني أفكر في إعادة النظر في المتغيرات المرسله بحيث يكون لها تحقيق خاص حول محتواها كما ذكرت إذا كان المتغير رقمي فيجب أن يتم التحقيق من أنه رقمي وهكذا بالنسبه لباقي المتغيرات .

سؤال : بعد ما يمر المتغير العام $_REQUEST في هذه الحلقة هل تستعمل

  $_REQUEST['id'] 

أم تستعمل المتغير $id الذي ينشء بعد دخوله الحلقة ؟

بصفة عامة طريقتك هذه ليست امنة إطلاقا فأنت تعطي المستخدم القدرة على إنشاء متغيرات كما يحب مثلا : نفترض أنك عندك هذا التحقق :

if(isset($admin)){
    $_SESSION['admin'] = true;
}

أستطيع جعل هذا الشرط صحيح بمجرد إستدعاء رابط يحتوي ?admin=1

لا تثق إطلاقا في مدخلات المستخدم

الكود نوعا ما معقد هندسيا , فالأمور ليست كما تظهر في الدوال التي أرسلتها فهناك حزمه من المتغيرات مصنفه على أنها قادمه من المستخدم فإذا تم إستدعاء أي متغير غير موجود في هذه الحزمه فلن يتم التعرف عليه ... هذه الفكرة فقط لإمكانيه التحكم بجميع المتغيرات القادمه وفلترتها دون الحاجه لفلترة كل متغير بشكل منفصل وفي حال أردت كمبرمج أن تعتمد على الأمان بإستخدام $_GET فلا بأس فهي لم تتأثر اما إذا استخدمت المثال السابق

if(isset($admin)){ 

فيجب أن تتخذ التدابير اللازمه بتصفير المتغير بداية الكود

 $admin=''; 

الفلترة صحيحه ولكن هناك كود في جلب الإضافات استخدمت فيه

 $id = $_GET[id];

فقمت بتعديله ليصبح كالتالي : $id = filter_vars($_GET[id]);

وإنتهت المشكله :) أرجو منك تجربة صفحات أخرى أو متغيرات أخرى وإعطائي النتائج إذا كان بالإمكان ... وأشكرك مرة أخرى

تصحيح للجواب الأول : كدت أنسى أن php يعتبر 1 مساوي ل true إذا

 filter_vars() 

ستعمل رغم بدون تعيين المتغير الثاني $i

مجلة المحتوى العربي (صفحتي)

موقع صفحتي خاص بأدوات لمطوري المواقع ومجله محتوى عربيه

236 متابع