starting point
مرحبا بكم في منتديات نقطة البدايه(starting point) نسعى لتطوير معلوماتكم الشخصيه في الانترنت نرجو دعمنا بالتسجيل في منتدانا يا زائرنا الكريم او بتسجيل الدخول للمشاركه والتفاعل مع الاعضاء ونشكركم للقراءه

(رساله اداريه‘)
starting point
مرحبا بكم في منتديات نقطة البدايه(starting point) نسعى لتطوير معلوماتكم الشخصيه في الانترنت نرجو دعمنا بالتسجيل في منتدانا يا زائرنا الكريم او بتسجيل الدخول للمشاركه والتفاعل مع الاعضاء ونشكركم للقراءه

(رساله اداريه‘)
starting point
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

starting point

لتعليم كافة فنون الشبكه العنكبوتيه وفنون الحواسيب
 
الرئيسيةأحدث الصورالتسجيلدخول

 

 شرح الحماية من ثغرات SQL Injection (الترقيع)

اذهب الى الأسفل 
كاتب الموضوعرسالة
Admin
Admin
Admin


عدد المساهمات : 130
نقاط : 391
السٌّمعَة : 4
تاريخ التسجيل : 22/08/2013
العمر : 25
الموقع : https://ssom.ahlamontada.com/

شرح الحماية من ثغرات SQL Injection (الترقيع) Empty
مُساهمةموضوع: شرح الحماية من ثغرات SQL Injection (الترقيع)   شرح الحماية من ثغرات SQL Injection (الترقيع) I_icon_minitimeالخميس أغسطس 22, 2013 6:20 pm

بسم الله الرحمن الرحيم،

فى هذا الدرس -بإذن الله- سأستعرض لكم كيفية أكتشاف ثغرات SQL Injection في برامجكم، ومن ثم كيفية الحماية منها وترقيع تلك الثغرات، وسينقسم الدرس إلى جزئين رئيسيين: الأول: إكتشاف الثغرة، والثاني: ترقيع الثغرة.
- إكتشاف الثغرة.
دائمًا ما تكون ثغرات SQL Injection تكون متعلقة بالنماذج التى هى الأخرى مرتبطة بإستعلام متصل بقاعدة البيانات، ولتوضيح ذلك كأبسط مثال على ذلك هو نموذج تسجيل دخول بسيط، سأقوم بعرض الكود المصدرية له الآن.

الكود:

<?php
mysql_connect("localhost","user_name","user_password");
mysql_select_db("user_system");
if(isset($_POST['email'])):
$email = $_POST['email'];
$pass = sha1($_POST['pass']);
$users = mysql_query("SELECT count(`user_id`) FROM `users` WHERE
`user_email`='{$email}' AND `user_pass`='{$pass}'"); $total = mysql_result($users,0);
endif;
if(isset($total)):
if($total == 0){
echo "Incorrect Password";
}else{
echo "Access Granted!";
}
endif;
?>

أعتقد واضحة جدًا، المشكلة فى ثغرات SQL Injection هى كلمة AND فى الإستعلام، فى الجزء الخاص بالتحقق WHERE ، ولكن كيف تقوم بالكشف عن الثغرة؟ حسنًا اتبع تلك الخطوات البسيطة:
1- اختر الحقل المقصود به أول عمود بعد كلمة WHERE وهنا المقصود user_email ، فنذهب إلى الحقل الخاص بإدخال الايميل فى النموذج.
2- قم بكتابة اى قيمة موجودة لهذا العمود فى قاعدة البيانات، أى قم بإدخال اسم أى ايميل موجود فى قاعدة البيانات ثم الصق به مباشرة هذا الرمز.

الكود:
' --
وهذا الرمز هو ' ثم مسافة ثم علامتين من - ثم مسافة أخرى!
أى إذا كانت قاعدة البيانات تحتوى على هذا الايميل omersalm1@gmail.com فنكتب:

الكود:
ويمكنك الآن إهمال الحقل الثاني وهو كلمة السر، فتكتب به اى كلمة تريدها سواءًا كانت صحيحة أم خاطئة، أو يمكنك ألا تكتب به أى شيء أصلاً ، وعند تسجيلك للدخول سيتم تسجيل الدخول بنجاح وعرض رسالة Access Granted ! فإذا تم عرض رسالة Access Granted وتم تسجيل الدخول إذًا يوجد فى هذا النموذج ثغرة SQL Injection وعليك ترقيعها فورًا !
سبب الثغرة أنه بكتابة ' -- يتم التعديل على استعلام SQL ليصبح بالشكل التالي:

الكود:
SELECT count(`user_id`) FROM `users` WHERE `user_email`='{$email}' -- ' AND `user_pass`='{$pass}'
ليصبح ما بعد {$email} مجرد تعليق لا قيمة له ، فيبحث عن وجود البريد فقط دون وجود كلمة السر.
- ترقيع الثغرة.
الحل بسيط جدًا وهو إضافة Back Slash بعد البريد الإلكتروني مباشرة ، أى يصبح الإستعلام هكذا.

الكود:
SELECT count(`user_id`) FROM `users` WHERE `user_email`='$email\' -- ' AND `user_pass`='{$pass}'
وبذلك يتم حل المشكلة، ولكن يستحسن أن تتم إضافة \ تلقائيًا وذلك عبر إدخال المتغير $email فى دالة mysql_real_escape_string ، فيمكنك عمل ذلك عند سحبك للإيميل من النموذج.

الكود:
$email = mysql_real_escape_string($_POST['email']);
وبذلك فى الإستعلام يتم إضافة \ بعد الإيميل مباشرة ليتم تلافي إستغلال تلك الثغرة من قبل المتسللين، ولكن توجد هنا مشكلة أخرى، وهى أن أحيانًا على بعض السيرفرات التي ستستخدم برنامجك يوجد حماية تلقائية لتلك الثغرة عبر إضافة \ تلقائيًا دون الحاجة إلى استخدام دالة mysql_real_escape_string ، عندئذٍ سيتم إضافة \\ وفى تلك الحالة فسيتم عمل الثغرة مرة أخرى دون أدنى مشاكل !
وحل تلك المشكلة هى التحقق عبر دالة get_magic_quote_gpc فإذا كانت تقوم بتحويل TRUE فيتم إدخال متغير الايميل فى الدالة stripslashes حتى يتم حذف الـBack slashes الموجودة به.

الكود:
if(get_magic_quote_gpc()):
$_POST['email'] = stripslashes($_POST['email'];
endif;
ولكن ما رأيك ان يتم إختصار كل هذه الكود؟؟ ... فلنقم بإنشاء دالة تقوم بالتحقق من الشرط الماضي، ثم تقوم الدالة بإرجاع المتغير الذي تم إدخاله فى الدالة بعد إدخاله فى دالة mysql_real_escape_string وهذا طبعًا بعد التحقق.

الكود:
function ares($input){
if(get_magic_quotes_gpc()){
$input = stripslashes($input);
}
return mysql_real_escape_string($input);
}
ثم الآن تصبح الشيفرة كاملةً هكذا:

الكود:
function ares($input){
if(get_magic_quotes_gpc()){
$input = stripslashes($input);
}
return mysql_real_escape_string($input);
}
mysql_connect("localhost","user_name","user_password");
mysql_select_db("user_system");
if(isset($_POST['email'])):
$email = ares($_POST['email']);
$pass = sha1($_POST['pass']);
$users = mysql_query("SELECT count(`user_id`) FROM `users` WHERE
`user_email`='{$email}' AND `user_pass`='{$pass}'"); $total = mysql_result($users,0);
endif;
if(isset($total)):
if($total == 0){
echo "Incorrect Password";
}else{
echo "Access Granted!";
}
endif;
والآن تأكد من أن الثغرة مرقعة 100% Smile ، الجدير بالذكر أن تلك الطريقة هى الطريقة المُستخدمة لترقيع ثغرة فى PHPAcademy.

لم أقم بوضع شيفرة النموذج Form ، فقم بوضعه أنت.*

ونتهى الشرح وكان معكم سالم
الرجوع الى أعلى الصفحة اذهب الى الأسفل
https://ssom.ahlamontada.com
 
شرح الحماية من ثغرات SQL Injection (الترقيع)
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1
 مواضيع مماثلة
-
» اغلاق ثغرات الجهاز
» ثغرة Xss في كل نسخ الجيل 3.6 - الترقيع في الداخل
» تحميل برنامج الحماية من فيروسات الفلاشات USB Disk Security 6.2 مجانا
» تحميل برنامج الحماية من الفيروسات F-Secure Internet Security 2013 مجانا

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
starting point :: قسم حماية المواقع والسيرفرات :: قسم ترقيع الثغرات-
انتقل الى: