06/03/2025
بما إن ناس كتير كانت بتتلغبط أو شايف ال sql injection صعبه عليها
فتعالى اقولك الحل
أولا لازم نعرف ايه هي ال sql :
نقدر نقول هي اختصار ل Structured Query Language
بالمعني البسيط خالص هي لغة ليها نظام معين بتساعدنا إننا نتحكم في قواعد البيانات بحيث إننا نقدر نعرض وندخل ونحدد داتا بشكل سهل
طيب إيه ال Structure أو البنيه بتاعتها ؟
سيرفر عليه قواعد بيانات كل قاعدة ليها جداول وكل جدول جواه عواميد والعواميد دي جواها داتا
كدة بالظبط :
Database -> Tables -> Columns -> Data
يعني مثال لو عندنا موقع بيستخدم الداتا بيز وعنده يوزوز ف ممكن يبقي عنده داتا بيز للموقع وجواها جدول اسمه users وجواه عواميد زى username , password , email وكل الكلام دا
نيجي لل DBMS : هي اختصار ل Database Management System
يعني هي نظام بيساعدك تتحكم في قواعد البيانات لو جينا مثلا لحاجه زى Mysql , Sqlite ف دول DBMS والاتنين شغالين علي نظام sql اللي شرحنا البنيه بتاعته فوق ولكن ممكن يبقي فيه اختلاف في شكل ال Syntax او الQuery اللي بتتفذ
ايه هي ال Query : هي الأمر اللي بكتبه عشان ينفذلي حاجه علي الداتا بيز
طيب ايه هي ال Sqli بشكل عام ؟
لما بيكون عندي براميتر ال Developer بياخده وبيستخدمه انه يجيب حاجه أو يدخل حاجه للداتا بيز وبياخده من غير ما يفلتره ف أنا ساعتها أقدر أعمل Inject لل Query بتاعتي وتتنفذ عنده ع السيرفر مع ال Query بتاعته
ايه هي ال Inforamtion_schema ؟
دي داتا بيز موجوده في ال mysql موجود فيها كل حاجه خاصه بكل الداتا بيزز الموجوده يعني كل داتا بيز فيها الجداول الفلانيه وكل جدول فيه العواميد الفلانيه
ايه أشهر أوامر ال SQL اللي بنستخدمها ؟
select : بنعرض بيها الداتا
select username from users;
insert : بدخل بيها داتا للداتا بيز
insert into users (username) values ('ahmed');
فيه حاجه مهمه اسمها union ودي من اسمها يعني اتحاد يعني بقدر أخلي الناتج بتاعي عباره عن مجموع أكتر من query بشرط إنهم يكونو نفس عدد ال columns في كل طرف يعني أحدد عدد عواميد متساوية في كل query
order by : بقدر من خلالها أرتب الناتج بتاعي عن طريق العواميد
Order by 1 ;
وبتستخدم أحيانا لمعرفه عدد العواميد اللي في الجدول
ايه أنواعها ؟
لو بقدر أشوف ناتج ال Query قدامي ف دي ساعتها مش Blind أو يمكن ليها اسم تاني انا مش متذكره الحقيقه
وفيه نوع تاني انا مش بشوف ناتج الQuery قدامي ولكن أربطه بحاجه تانيه زى اني بقوله لو الحرف الأول من الباسورد بتاع اليوزر الفلاني صح رجعلي الناتج الطبيعي بتاع الصفحه لو مش صح مش هيرجعلك حاجه أو بديله معاه حاجه زى sleep مثلا وبشوف لو الرد اتاخر والنوع دا اسمه Blind
ايه الأضرار اللي ممكن تنتج عن وجود الثغرة دي ؟
بكل بساطة أول حاجه ممكن تتعمل هي تسريب الداتا
لو اليوزر بتاع الداتا بيز ليه صلاحيات عاليه ممكن يتم قراءة ملفات من السيستم وممكن تتحول لأعلي ضرر اللي هو إن ال Attacker يقدر من خلالها ينفذ أوامر علي السيستم RCE وممكن يحصل حاجه زى Authentication bypass
لو خدنا مثال ان فيه مبرمج بيستخدم ال query دي في ال login عنده :
select * from users where username='Ahmed' and password='ahmed reda';
طبعا مكان ahmed دا اليوزر نيم والباسورد بتوعنا ف هو بياخدهم وبيشوف لو فيه ناتج راجع ف بيعملي تسجيل دخول في الحاله دي انا لو اليوزر مش مفلتر اليوزر نيم او الباسورد اللي مديهمله وجيت أنا اديتله اليوزر نيم كدة : ' or 1=1 #
ف الquery هتبقي كدة
select * from users where username='' or 1=1 #' and password='ahmed reda';
وفي الحقيقه هنا ال # دا يعني كومنت يعني كل اللي بعده مش بيتنفذ يعني ال query اللي هتتنفذ فعلا علي الداتا بيز هي دي :
select * from users where username='' or 1=1
يعني بقول هاتلي كل العواميد من الجدول اللي اسمه users لما يكون ال username='' أو 1=1 وطبعا بما إن 1=1 ف هو هيجيبلي كل اللي في الداتا بيز وهيحصل login bypass وهخش بأول يوزر نيم موجود في الداتا بيز وطبعا نقدر نتحكم في اليوزر اللي هنخش بيه عن طريق إني لو عارف اليوزر نيم ف هديله اليوزر نيم كدة : admin' #
select * from users where username='admin' #
ف انا كدة هخش باليوزر اللي اسمه ادمن وممكن لو مش عارف اقعد اقلب في القيم اللي موجود في الداتا بيز عن طريق ال limit
select * from users where username='' or 1=1 limit 0,1;
هبدأ أزود قيمة ال 0 اللي هو المكان بتاعي وأقلب في اليوزرز
و لو عايز تشوف الجزء التانى متنساش تتابعنا