ثغرات SQL injection

لن تجد اليوم موقع على الانترنت لا يستخدم تطبيق يتعامل مع قواع البيانات , ان كانت شبكة اجتماعية مثل فيسبوك فمعلومات المستخدمين لابد من تسجيلها في قاعدة البيانات , وان كنت  تتحدث عن بنك فالسندات و بيانات العملاء كلها مسجلة في قواعد البيانات من اسماء و ارقام بطاقات ائتمان وصولا الى ارقام الضمان الاجتماعي … الخ

 على سبيل المثال عند الدخول الى موقع فيسبوك  فان الصفحة الرئيسية يقوم بتوليدها سكربت مكتوب بلغة php, بعدها ستقوم بادخال معلومات الدخول اسم المستخدم و كلمة المرور و الضغط على  login ما يحدث هو ان المتصفح يقوم بارسال المعلومات بطريقة تدعى POST الى سيرفر الويب حيث يوجد سكربت يقوم بالتحقق من المعلومات  وذلك بالاتصال بقاعدة البيانات و التي قد تكون على نفس السيرفر او في سرفر آخر  هذا التحقق يتمثل في انشاء طلب Request , كأن يسأل السكربت قاعدة البيانات هل يوجد مستخدم لديه هذه المعلومات ؟ بعدها يجيب محرك قاعدة البيانات Database Engine نعم يوجد او لايوجد ,  هذا هو السيناريو الذي يحدث في صفحات الدخول  على العموم  فيما يتعلق بثغرات SQLi فيمكن ان   نقول بأنها طريقة لخداع تطبيق الويب من أجل ان يصرح لنا بدخول غير مشروع  مع ملاحظة بسيطة هذا النوع من الثغرات لا يتواجد في قاعدة البيانات وانما في التطبيق الذي يتعامل   معها ,  خداع التطبيق هو ان تقوم بادخال رموز لها دلالة و معنى لمحرك قاعدة البيانات مما يغير من معنى الطلب  لنرجع الى الطلب الماضي :

هل اسم المسخدم هذا : ahoss  موجود و ان كان كذلك هل كلمة سره هي : 12345 ؟

هنا سيتم التحقق تصور معي ان يأتي هكر ويقوم بادراج مجموعة من الرموز ليتحول الطلب الى :

هل اسم المستخدم هذا :ahoss موجود؟

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

في الصفحة السابقة عند ادخال اسم المستخدم و كلمة المرور الصحيحة ستقوم بنقلك الى صفحة  اخرى تثبت نجاح العملية كما في الصورة التالية :

الحالة الثانية هي عند ادخال معلومات غير صحيحة ستظهر الرسالة التالية :

الآن لنلقي نظرة على السكربت الذي يقوم بالتحقق من الهوية :

اتمنى ان تكون لديك خلفية بسيطة عن لغة PHP , سأشرح الكود السابق, السطران السابع و الثامن يمثلان دوال الاتصال بقاعدة البيانات اما السطر العاشر فهو يمثل تحقق من ارسال شيئ من الفورم  عن طريق دالة isset فاذا تم ارسال اسم مستخدم و كلمة مرور سيتم دخول في البلوك, اما في السطر  14 فقد حجزت متغير query وضعت فيه الطلب الذي سيتم تنفيذه  منطق SQL بسيط جدا لاحظو معي الجملة :

 

هذه تعليمة بسيطة مفادها : قم باختيار جميع الحقول اذا كان حقل اسم المستخدم يساوي قيمة المتغير usr و ايضا اذا كان حقل كلمة السر يساوي قيمة المتغير pass  ,  ركزو معي جيدا  عبارة AND  الكبيرة تعني وجوب تحقق الشرطين اي ان يكون الاسم موجود و كلمة السر الصحيحة والا فلن يتم ارجاع اي شيئ , كيف يمكننا التلاعب بهذا السطر او هذه التعليمة لكي يتم تجاوز التحقق من كلمة المرور ؟ هنا يبدأ عمل SQLi

عندما تقوم بادخال اسم المستخدم و كلمة المرور سيتم ادراجهما في التعليمة السابقة لنفرض ان اسم المستخدم هو ahoss وكلمة السر هي 12345 ستصبح التعليمة بالشكل التالي

بعدها سيتم ارسالها الى محرك قاعدة البيانات ليقوم بتنفيذها , لدي الآن سؤال هل توجد طريقة يمكنني ان اجعل بها التعليمة تبدو هكذا :

التعليمة السابقة تعني اختر كل شيئ اذا كان اسم المستخدم يساوي ahoss وكلمة السر تساوي لا شيئ , طبعا هذا لن يتحق  , و لكن في آخر التعليمة هناك عبارة OR  و التي تعني او … بما ان الشرط الاول لن يتححق فهناك امكانية تحقق الشرط الذي بعد OR و هو شرط بالفعل متحقق لان 1 يساوي 1

و لهذا ستكون التعليمة كلها صحيحة  الصورة التالية توضح لكم كل شيئ :

و الآن لاستغلال الضعف الامني في التطبيق الماضي يكفي ادخال كلمة السر التالية :

ثغرات SQLi كما ترون معقدة بعض الشيئ و تحتاج الى الكثير من البحث و ايضا دراسة كيفية تعامل  تطبيقات الويب مع البيانات الممرة لها  و دراسة semantic  لغة SQL  ايضا  مفيد جدا ,بالنسبة لطرق الحماية منها يتم ذلك بترشيح ما يدخله المستخدم عن طريق خوارزميات مخصصة او عن طريق دوال  مبنية في لغة البرمجة مثلا في لغة PHP  توجد دالة mysql_real_escape التي تقوم بابعاد الرموز التي من شأنها تغيير معنى semantic  تعليمة SQL و ذلك بضافة \ لتعطيلها  .

مع تحياتي…

أضف تعليق

Filed under Uncategorized

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار ووردبريس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

Google photo

أنت تعلق بإستخدام حساب Google. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s