السلام عليكم ،
الموضوع متداخل ما بين " تطوير تطبيقات الويب " ، وما بين " أمن المعلومات " ، و من محاسن الصدف أني لا أفقه في كليهما شيء ، ولكن لامانع من أن أدلو بدلوي ..
المشكلة
لو فرضنا أن اسمك الحركي هو " هاكر العرب " ، و تقوم بتطوير نظام منتديات بإسم " منتديات الصامد " .. لتقوم ببيعه لاحقاً على كبرى الشركات في العالم .. وهناك " زر " خطير في موقعك مخصص لإدارة الموقع ، مهمته حذف جميع مواضيع منتداك ، حيث يقوم هذا الزر بإرسال هذا الطلب :
index.php?do=deleteAll
طبعاً أنت لست غبياً .. حتى تنسى أهم شيء ممكن تعمله في الصفحة index.php ، حيث من المؤكد أنك ستتأكد أن من يقوم بضغط الزر هو عضو مسجل في المنتدى و لديه الصلاحيات اللازمة :
$do = $CleanParameter($GET['do']);
if ( $do == "deleteALL" )
{
if ($currentMember) // registered user
{
if( $currentMemberPrivileges['deleteAll']) // the user has the privilege
{
$Database->deleteAllTopics();
}
}
}لاحظ أنك قمت بكل شيء من تدقيق على المستخدم ، ومن التأكد أنه يملك الصلاحيات ، بل وحتى قمت بتطهير البارمتر do من أي شوائب قد تؤدي إلى SQL Injection ( اسم "هاكر العرب " لم يأت من فراغ ) .. لكن هل هذا يكفي ؟
لاتنسى أنك ستبيع منتجك لملايين المستخدمين حول العالم ، وكل مستخدم يملك نسخة من نظامك .. فهو بلا شك سيدخل على لوحة التحكم وسيعرف URL أو http request المسؤول عن حذف جميع المواضيع .
ولكن كيف يمكن أن يستفيد من هذه الثغرة ؟ في الحقيقة هو لا يستطيع أن ينفذ هذا request على مواقع أخرى لا يملكها .. ولكن يمكنه وببساطة أن يفتح تذكرة Ticket .. بما أنه " زبون عندك " ، يقول فيها :
اقتباسأخي " هاكر العرب " ،لقد اشتريت منك نظام المنتديات الرائع .. المسمّى "بمنتديات الصامد " ، أعجبني جداً ، لكن هناك وظيفة لم أستطع تنفيذها و في الرابط صورة توضح المشكلة .. أتمنى حلها .. وسأقدم لك ماتريد من مبلغ مالي إن لزم الامر .. تحياتي :
الرابط في الرسالة .. يحتوي على هذا URL :
http://www.alsamid-forums/index.php?do=deleteAll
ولو فرضنا أنك قمت بتخزين جلسة العمل session على موقعك " الصامد " وتستخدم cookies أيضاً ، وهذا شبه مؤكد ( لأنك تدخل على موقعك كل ساعة على الاقل ) .. فهذا يعني أنه وبمجرد نقرك على ذلك الرابط .. فإنه سيتم حذف جميع المواضيع في منتديات " الصامد " ، وعندها أنصحك أن لا تتسمّى بتسميات أنت لست أهلاً لها :P .
ماهو الحل ؟
أحد الحلول التي أعرفها هي باستخدام security key وممكن تجده بإسم Auth Key ، وببساطة تضع لكل شخص سجل دخوله على موقعك key معين ، بحيث من الصعوبة أن يكتشفه أحد ( هذا Key يتغير عند كل عملية تسجيل دخول ) ، و عندها يجب أن يحتوي request على key مطابقة للموجودة في جلسة العمل الحالية session .. وبالتالي سيصبح url و Index.php كالتالي :
// index.php?do=deleteAll&security_key=1111116803f175cba8e08b68c84f37ba
$do = $CleanParameter($GET['do']);
// -- SECURITY KEY
$security_key = $CleanParameter($GET['security_key']);
if ( $do == "deleteALL" )
{
if ($currentMember) // registered user
{
if( $currentMemberPrivileges['deleteAll']) // the user has the privilege
{
if ($security_key == $currentSecurityKey) // SECURITY KEY
$Database->deleteAllTopics();
}
}
}ولا شك و لا ريب ، أن " زبونك المحترم " ، لن يخمّن هذا الـ Key ، ولن يحاول ..
إن كان هناك خطأ في أي معلومة فالرجاء التصحيح فلا تنسى :
اقتباسالموضوع متداخل ما بين " تطوير تطبيقات الويب " ، وما بين " أمن المعلومات " ، و من محاسن الصدف أني لا أفقه في كليهما شيء ، ولكن لامانع من أن أدلو بدلوي ..
المصدر : wikipedia+ Xacker




