بسم الله الرحمن الرحيم :- اليوم انا هشرح درس اكتشاف 
 ثغرات  الحقن بالاسكربت لاكن بطريقة 
جديدة ومختلفة :- وده لان انا شايف بعض الناس بيطبقون النوع ده من الثغرات بدون فهم  
مبدا عمل الثغرة .. وانا هشرح كل شىء من الصفر لعيون المبتداين :- 
اول حاجة :- عشان تفهم 
 ثغرات  الحقن لازم يكون عندك خلفية بسيطة عن php+mysql  
وانا هشرح خلفية بسيطة عنهم عشان الدرس يكون مفهوم لجميع الاعضاء خاصة المبتداين.. 
=========================
 ملحوظة:-المشفر بالنجوم الاربعة هى كلمة "name"
========================= 
=================
المتغيرات فى php
================ 
قبل مبدا بالمتغيرات هشرح عمل ال echo فى الphp تقوم echo بتطبع النصوص:- 
نشوف الكود :-   
 كود PHP:
    <?php
 
echo "Dolal is here";
 
 
?>    
  
لو وضعنا الكود ده فى ملف مثلا اسمه dolla.php ودخلت بالمتصفح راح تلاقى الجملة  
dolla is here مطبوعة بالصفحة :- طيب مثال اخر ..     
 كود:
 <?php
echo "Dolal love football";
echo "dolla love php";
echo "dolla love sql";
?>
  
طيب الكود ده لو وضعناه بملف dolla.php ودخلنا عليه بالمتصفح هنلاقى تلت جملات مطبوعة  
وهى :-  
dolla love football
dolla love php
dolla love sql  
طيب لو انا مثلا عاوز اغير اسم dolla الى اسم مثلا Nesha واسم dolla ده موجود 
بكثرة فى كود الphp هل معقولة  انى هعد اغير كل اسم dolla واحوله الى nesha 
لا طبعا :- هنا ياتى دور المتغيرات فى ال php :- يرمز للمتغيرات فى ال Php 
بعلامة $ وفايدة المتغير انك بدل متعمل طباعة لاسم معين انك تعمل الطبااعة للمتغير :- 
واما تحب تعدل الاسم الى هينطبع تعدله من المتغير بدل متضطر انك تعدل الاسم يدويا   
طيب نشوف الكود :-   
 كود PHP:
    <?php
 
$name=nesha;
 
echo "$name love football";
 
echo "$name love php";
 
echo "$name love sql";
 
 
?>    
  
طيب عملنا المتغير الى هو $name وحطينا قيمته ب nesha وعلمنا طباعة للمتغير 
لو دخلنا على الملف من المتصفح راح يظهر الجمل الاتية  
nesha love football
nesha love php 
nesha love sql  
طيب تمام عرفنا فايدة المتغير .. فى نوع تانى من المتغيرات وده الاهم وهو المتغيرات ب GET  
========================== 
المتيغرات بGET فى PHP 
======================== 
النوع التانى من المتغيرات هو المتغيرات ب GET والمتغير هنا بيتغير حسب ال URL الى بالمتصفح 
بمعنى انك موش بتعدل عالمتغير من الكود .. انما يتم تغيير المتغير من خلال ال URL طيب نشوف 
الكود :-  
 كود PHP:
    <?php
 
$dolla=$_GET['name'];
 
 
echo $dolla;
 
 
?>    
  
طيب الجديد هنا انى عملت المتغير dolla ب GET بمعنى ان المتغير هتتغير قيمته  
حسب القيمة الى هتدخل فى ال Name من خلال الurl بمعنى نفرض انى وضعت الكود  
بملف اسمه index.php  
وعاوز اطبع مثلا جملة dolla+is+here 
هكتب :- index.php?name=dolla+is+here 
بعد اما اما تضغط انتر راح يتم تسجيل الجملة dolla+is+here بالمتغير dolla  
وراح تتم طباعة المتغير dolla الى هو قيمته  dolla+is+here 
طيب نشوف الصورة    
  
طيب تمام تم طباعة الجملة dolla+is+here  
نفهم من كده ان المتغير dolla بتتغير قيمته حسب الى بندخل فى ال url فى ال Name  
طيب مثلا لو عاوزين نخلى المتغير dolla  قيمته nesha+is+here 
هنكتب 
index.php?name=nesha+is+here   
   
طيب جميل تم تغيير قيمة المتغير الى nesha+is+here وتم طبعها بالمتصفح 
============================================= 
============================ 
مدخل الى عالم ال mysql 
============================ 
لغة ال mysql هى لغة برمجة خاصة بقواعد البينات اول حاجة لازم نعرفها  
انه اى قاعدة تتكون من جداول والجداول تتكون من اعمدة مثلا 
عندنا قاعدة اسمها dolla والقاعدة دى فيها جدولين  
الجدول الاول :admin:- ويتكون من ثلال اعمدة  
id
name
pass 
الجدول التانى :- profile ويتكون من اربع عواميد :- 
id
name
age
job 
======   
    
========  
طيب :- هناك بالقواعد الصفوف والصفوف دى بتبقى القيم بتاعت العواميد 
يعنى مثلا فى جدول admin 
العمود id يحتوى على القيمة رقم عضوية الادمن :1 
العمود name يحتوى على اسم الادمن :dolla 
العمود Pass بيه باس الادمن :123456  
قيم العواميد بتعرض فى شكل صفوف    
   
================================== 
جمل ال select statment فى mysql 
=============================== 
هناك العديد من الاوامر فى Mysql مثل slelect,update,insert 
بس انا هشرح ال select وفايدة جمل ال select هى  
اختيار معلومات معينة من جدول معين بقاعدة معينة لاظهارها  
مثلا لو انا عملت  
 كود:
 select name from admin
  راح يظهر لى اسم الادمن dolla 
طيب لو 
 كود:
 select pass from admin
  راح يظهر ال pass الى هو 123456 
طيب لو عملت    
 كود:
 selct pass,name,id from admin
  راح يظهر لى  
123456
dolla
1
=========================================== 
كود برمجى مكون من php+mysql
=========================================== 
طيب دلوقتى معانا كود بيجمع بين المتغيرات ب GET فى PHP + امر SELECT فى Mysql 
طيب نشوف الكود    
  
طيب نشرح الكود :-  اول حاجة عندنا المتغير id ده متغير ب get يعنى بتتغير قيمته 
حسب القيمة الى هنحطها فى ال url بالمتصفح  
طيب تانى حاجة عندنا $query وده بيتحوى على امر sql من نوع select 
والامر ده بيقوم بختيار ال name وال age وال job من جدول profile اعتمادا  
على ال id دى وظيفة where انها بتجبلك معلومات عن عواميد معينة بدلالة عواميد اخرى  
طيب لو نلاحظ ان امر ال select ده المكتوب فى الكود معتمد على المتغير id الى هنكتبه بالurl 
فملا لو الكود بملف profile.php 
واحنا دخلنا عالملف بالمتصفح وكتبنا  :-  
index.php?id=1  
ايه الى هيحصل هيتم تخزين القيمة 1 بالمتغير get وبالتالى هيتم تخزين القيمة بالمتغير الموجود 
بال query الى 1    
   
طيب بالون الفوشيا تم ادخال القيمة الى ادخلنها من ال url فى المتغير $id وبالتلى 
وبالتالى تم تغييرها بال query  
طيب بعد كتابة index.php?id=1  
ده هيعمل query الى هو:-  
 كود:
 select name,age,job where id=1
  
وده هيكون نتيجته بالصفحة :- 
abdo
20
doctor 
طيب لو كبتنا index.php?id=2 
هتجلنا معلومات الصف رقم 2 الى هى :-  
ahmed
22
engineer 
تمام الى هنا كل شىء واضح :-  نجى بقى لفكرة ال SQL Injection 
=====================================
مدخل الى عالم ال sql injection
==================================== 
اول حاجة معنى sql 
 injection  هو حقن ال sql وده معناه اننا:-  
بنحقن او بنضيف اوامر sql خبيثة الى امر ال sql الموجود اساسا بالاسكربت   
يعنى بدل مكنا بنكتب index.php?id=2 
هنضيف اوامر خبيثة تقوم باحضار pass ال admin من خلال ال union select 
=========================
Union select
========================= 
تستخدم ال union فى جملة ال select لاختيار معلومات عن عواميد من جداول مختلفة 
وشروطها :- 
عدد العواميد ال query الاول يكون مساوى لعدد العواميد بال query ألتانى 
مثلا 
 كود:
 select name,pass from admin union select name,age from profile
  نلاحظ هنا ان فى ال query الاول تم اختيار عمودين من جدول admin 
وبالquery التانى تم اختيار عمودين من جدول profile  
لازم عدد العواميد يكون متساوى فمثلا لو اخترت عمود واحد من جدول ال admin يبقى لازم اختار عمود واحد ايضا من 
جدول profile  
 كود:
 select name from admin union select age from profile
  
==================================================  ===
استخراج اسم+رقم العضوية +باص الادمن
==================================================  ===
طيب نرجع لموضوعنا تانى دلوقتى يجماعة احنا عارفين اننا بنتحكم فى قيمة المتغير id من خلال ال url 
index.php?id=2 
طيب هنا بقى انا هحقن ال query الى بالاسكربت من خلال ال Union select  
احنا عارفين ان ال query الاول بيطلب تلت عواميد ال age,name,job طيب دلوقتى انا حقن 
query  خبيث هيجيب باص الادمن  بالصفحة :D 
نشوف هكتب ايه :-  
 كود:
 index.php?id=2 union select id,name,pass from admin
  
بعد متدوس انتر الى هيحصل للكود البرمجى  
  
طيب طبعا بعد اما تدوس انتر بالمتصفح معلومات الادمن هتظهر بالصفحة 
1
dolla
123456 
============================================= 
التعليقات فى Mysql
============================================= 
فى بعض الاحيان يكون الكود البرمجى :-   
  
group by age هترتب نتيجة العمر والوظيفة والاسم حسب العمر 
  
طيب دلوقتى فى مشكلة قدامنا ان فى جملة group by age بعد المتغير $id يعنى الجملة دى هتنضاف بعد الquery بتاعنا   
 كود:
 index.php?id=2 union select id,name,pass from admin
  هيصبح الكود :-   
   
طيب دلوقتى جملة ال group by age تم اضافتها لل query وطبعا ده هيخلى ال query بتاعنا failed يفشل :D 
واحنا عاوزين نتلاشى الجملة group by age يعنى نخليها ملهاش تاثير  
من هنا ياتى دور التعليقات :- comments   
التعليقات وظيفتها هى :- اهمال جملة معينة فى ال query اى جعلها مجرد تعليق :- ومن ثم لا يكون لها اى تاثير وممكن نستخدم فى التعليق فى Mysql  
طيب نشوف 
هنعمل ايه :-  
 كود:
 index.php?id=2 union select id,name,pass from admin/*
  ضيفنا علامة التعليق وبكده جملة group by age هتقع بعد علامة ال /* وموش هيكون لها اى تاثير :D    
   
==================================================  ========= 
طيب فى مشكلة كمان ساعات بتقابلنا فى ال sql 
 injection  اننا موش بنقدر نشوف نتيجة ال query بتاعنا فى من خلال union select 
وده ياما بسبب ان مفيش مكان يتسع لنتيجة ال query بتاعنا الى ضيفناه بالصفحة :- الفكرة انى هخلى ال query الاول يفشل يعنى هخليه قيمته false 
وبالطريقة دى نتيجة الكويرى الاول موش هتظهر :- فممكن نشوف نتيجة الكويرى بتاعنا الى احنا ضفناه فى امكان ظهور نتائج الكويرى الاول :d 
طيب ازاى نخلى الكويرى الاول failed او نخليه يفشل هنضيف قيمة موش موجودة بالقاعدة مثلا زى  
-2 
واحنا عارفين ان مفيش رقم id بالسالب يعنى كده بخلى الكويرى قيمته false او بالبلدى بخلى الكويرى خطا  
نشوف  
 كود:
 index.php?id=-2 union select id,name,pass from admin/*
  والكود البرمجى هيكون   
   
طبعا الكويرى اصبح الاول   
 كود:
 SELECT name,age,job FROM profile WHERE id=-2
  وزى محنا عارفين مفيش رقم id بالسالب يعنى من الاخر الquery خطا مية المية وبكده مفيش نتيجة هترجع :- 
وبالتالى نتيجة الquery  بتاعنا الى هو بيجيب باص الادمن واسمه ورقم عضويته هتظهر مكان نتيجة ال query الاول  
================================ 
ممكن كمان نضيف and 1=0 عشان نخلى قيمة الكويرى خطا 
 كود:
 index.php?id=2 and 1=0 union select id,name,pass from admin/*
    
لحماية المتغيرات الرقمية  من اضافة النصوص نستخدم الدالة intval() فهى تقوم بالتحقق من ان المتغير 
رقمى وترفض اى نص يتم اضافته من المستخدم...    
  
طبعا تعمدت انى لا اضع دوال الاتصال بالقاعدة بالكود البرمجة ووضعته كروكى يعنى مبسط جدا حتى اسهل الفكرة 
للمبتداين  
=======================================  
طيب جميل .. بكده ينتهى الدرس وترقبوا الجزء التانى منه بازن الله تعالى ... اخوكم DOoOoOoLLA 
يريت يجماعة الى عندو يؤال ميترددش وانا هجاوبه اهم شىء تعم الفائدة للاعضاء. 
==================================================  =======