SQL Injection دليلك الكامل للسيطرة على قواعد البيانات
يا صاحبي، تخيل إنك تقدر تخدع "أمين المكتبة" مش بس إنه يديك أي كتاب عايزه، لا ده كمان يديك مفاتيح المكتبة كلها! ده بالظبط اللي بيحصل مع ثغرة SQL Injection.
الأساسيات
يعني إيه SQL وقواعد البيانات أصلاً؟
قبل ما نتعلم إزاي "نحقن"، لازم الأول نفهم إيه اللي بيتحقن ده وفين بيروح!
قاعدة البيانات (Database)
دي العقل المدبر لأي موقع! فيها كل حاجة متخزنة: اليوزرات، الباسوردات، المنتجات، الرسايل... كل حاجة!
تخيلها زي خزنة عملاقة منظمة في جداول (Tables) زي Excel بس أقوى بكتير.
لغة SQL
دي اللغة الرسمية اللي بنتكلم بيها مع قاعدة البيانات. زي ما بتكلم واحد بالعربي، بتكلم الـ Database بالـ SQL.
SELECT * FROM users WHERE id = 1
🔧 أشهر أوامر SQL
الخدعة
يعني إيه SQL Injection؟
📖 التعريف البسيط
ثغرة SQL Injection بتحصل لما الموقع يسيب المستخدم يدخل بيانات، والبيانات دي تترمي جوا أمر SQL من غير ما تتفلتر أو تتنضف.
يعني المهاجم بي"حقن" أوامر SQL خبيثة جوا الأمر الأصلي، ويخدع قاعدة البيانات تنفذ اللي هو عايزه مش اللي المبرمج كتبه!
🎭 تشبيه بسيط عشان تفهم
تخيل إن المبرمج كتب كود بياخد اسم اليوزر ويدور عليه في الداتابيز كده:
"SELECT * FROM users WHERE username = '" + userInput + "';"
لو المستخدم كتب: Ahmed
👍 تمام! بيدور على اليوزر اللي اسمه Ahmed
لو المهاجم كتب: ' OR 1=1--
💥 كارثة! الـ Query أصبح معناه "هات كل اليوزرز!"
🔍 تحليل الـ Payload
النتيجة: المهاجم خدع الداتابيز إنها ترجع كل اليوزرز بدل يوزر واحد، وممكن يدخل كأول يوزر (غالباً الـ Admin)!
الترسانة
أشهر أنواع SQL Injection
🟢 In-Band SQLi
الحقن اللي بتشوف نتايجه
Error-Based
بتحقن Payload يخلي الداتابيز تظهر رسالة خطأ فيها معلومات حساسة.
UNION-Based
بتستخدم UNION عشان تدمج نتايجك (زي الباسوردات) مع نتايج الموقع الأصلية!
🔵 Blind SQLi
الحقن الأعمى (الاستنتاجي)
Boolean-Based
بتسأل أسئلة "أيوا/لا" وتستنتج الإجابة من سلوك الصفحة.
Time-Based
بتجبر الداتابيز تستنى (زي SLEEP(5)). لو اتأخرت، يبقى الإجابة "أيوا"!
الصيد
إزاي تكتشف الثغرة؟
اختبار الـ Apostrophe
أدخل ' في أي حقل إدخال أو Parameter. لو ظهر خطأ SQL، يبقى 90% في ثغرة!
?id=1'
اختبار الـ Boolean
جرب AND 1=1 (صفحة عادية) و AND 1=2 (صفحة مختلفة).
?id=1 AND 1=1?id=1 AND 1=2
اختبار الـ Time
لو مفيش فرق مرئي، جرب SLEEP(). لو الصفحة اتأخرت، يبقى Vulnerable!
?id=1' AND SLEEP(5)-- -
نصيحة مهمة
مش كل الحقول ظاهرة! دور كمان في: URL Parameters, Cookies, HTTP Headers (User-Agent, Referer), وحتى JSON APIs!