بسم الله الرحمن الرحيم :- اليوم انا هشرح درس اكتشاف
ثغرات الحقن بالاسكربت لاكن بطريقة
جديدة ومختلفة :- وده لان انا شايف بعض الناس بيطبقون النوع ده من الثغرات بدون فهم
مبدا عمل الثغرة .. وانا هشرح كل شىء من الصفر لعيون المبتداين :-
اول حاجة :- عشان تفهم
ثغرات الحقن لازم يكون عندك خلفية بسيطة عن 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
يريت يجماعة الى عندو يؤال ميترددش وانا هجاوبه اهم شىء تعم الفائدة للاعضاء.
================================================== =======