طريقة اكتشاف وترقيع ثغرة SQL Injection الاكثر انتشاراً لاختراق جميع المواقع المصابه بها بكل سهوله ! المحترف العراقي : العاب برامج ويندوز شروحات | PROFESSIONAL IRAQI

Header Ads

طريقة اكتشاف وترقيع ثغرة SQL Injection الاكثر انتشاراً لاختراق جميع المواقع المصابه بها بكل سهوله !

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

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


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

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


' --

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

ahmed2ubuntu@gmail.com' --

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

SELECT count(`user_id`) FROM `users` WHERE `user_email`='{$email}' -- ' AND `user_pass`='{$pass}'

ليصبح ما بعد {$email} مجرد تعليق لا قيمة له ، فيبحث عن وجود البريد فقط دون وجود كلمة السر.



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





- ترقيع الثغرة.


الحل بسيط جدًا وهو إضافة 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.

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

ليست هناك تعليقات

Post Top Ad

Post Bottom Ad