TO DONATE : BTC => 1BU6R1C4AQ77LjLZswQNKFwAupw61i88Kn || PM => U4089661


اهم قوانين :1- منع الردود الباهتة مثل شكرااااا و أخواتها 2- لا يسمح بالمشاحنات الطائفية باآ شكل من الأشكال 3- عدم استعمال الألفاظ التافهة و الكلام البذىء 4- عدم وضع معرفات التواصل الأجتماعى بالردود 5- الأطلاع على كامل القوانين واجب 


العودة   الحماية للأبد -Security 4 Ever > قسم البرمجـــة > لغة الترميز

لغة الترميز قسم مختص بلغة الترميز مثل :
HTML and HTML5, XHTML, XML, AJAX, CSS, JavaScript

 
أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 03-12-2012, 05:19 PM
الصورة الرمزية CorSica
CorSica
عضو مميز
 
حـالة التــواجـد : CorSica غير متواجد حالياً
تاريخ التسجيل: Dec 2012
مكـان الإقامـة : في البطيمة
الجــــنــــــس: ذكـر
الــهـــوايـــــة: JIL_FM
المشاركات: 130
شكراً:255
تم شكره 299 مرة في 64 مشاركة
معدل تقييم المستوى: 0
CorSica بدون تقييم
افتراضي شرح الحماية من ثغرات SQL Injection

بسم الله الرحمن الرحيم،
فى هذا الدرس -بإذن الله- سأستعرض لكم كيفية أكتشاف ثغرات 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- قم بكتابة اى قيمة موجودة لهذا العمود فى قاعدة البيانات، أى قم بإدخال اسم أى ايميل موجود فى قاعدة البيانات ثم الصق به مباشرة هذا الرمز.

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

كود:
[email protected]' --
ويمكنك الآن إهمال الحقل الثاني وهو كلمة السر، فتكتب به اى كلمة تريدها سواءًا كانت صحيحة أم خاطئة، أو يمكنك ألا تكتب به أى شيء أصلاً ، وعند تسجيلك للدخول سيتم تسجيل الدخول بنجاح وعرض رسالة 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% ، الجدير بالذكر أن تلك الطريقة هى الطريقة المُستخدمة لترقيع ثغرة فى PHPAcademy.
ملاحظات:
1- لم أقم بوضع شيفرة النموذج Form ، فقم بوضعه أنت.
2- طريقة تسجيل الدخول التي قمت بشرحها سابقًا فى هذه التدوينة تستخدم خوارزمية محمية من تلك الثغرة، فإذا كنت تستخدم الطريقة التى قمت بشرحها مسبقًا فلا عليك بهذا الدرس.

الشرح منقول للافادة  
رد مع اقتباس
24 أعضاء قالوا شكراً لـ CorSica على المشاركة المفيدة:
  #2  
قديم 18-12-2012, 05:24 AM
الصورة الرمزية Virus_Z
Virus_Z
Lord Of Spam
 
حـالة التــواجـد : Virus_Z غير متواجد حالياً
تاريخ التسجيل: Apr 2012
مكـان الإقامـة : Web Hacking
الجــــنــــــس: ذكـر
الــهـــوايـــــة: Hacking
المشاركات: 100
شكراً:33
تم شكره 181 مرة في 61 مشاركة
معدل تقييم المستوى: 0
Virus_Z بدون تقييم
افتراضي رد: شرح الحماية من ثغرات SQL Injection

موضوع مميز جدا بصراحة احيك على طرحة

 

 

 

رد مع اقتباس

الكلمات الدلالية (Tags)
من, الحماية, ثغرات, injection, شرح, security vulnerabilities, sql


الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 
أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
[شرح فيديو] حـماية مشروعك من ثغرات SQL Injection Mr.DoZ أساسيات حماية وتطوير السكريبتات 0 20-06-2015 04:20 AM
لا تستخفون في ثغرات الـSql Injection O_o x0Slotleet قسم نقاشات الاختراق والحمايه 37 23-09-2013 08:37 PM
الحماية من ثغرات Cross Site Scripting x0Slotleet أساسيات حماية وتطوير السكريبتات 5 12-05-2012 12:38 PM


الساعة الآن 02:48 AM