ثغرة SQL Injection
ما هي الـ SQL Injection؟
هي من الثغرات الأمنية التي قد يجلب استغلالها نتائج كارثية، من تسريب لكافة البيانات الخاصة بتطبيق الويب وبيانات المستخدمين من كلمات مرور ومعلومات شخصية أو تفاصيل بطاقات الائتمان المخزنة في قواعد البيانات، حيث تستخدم تطبيقات الويب SQL Queries في عمليات المصادقة للتأكد من بيانات المستخدم ولجلب المعلومات من قاعدة البيانات لإظهار بعض البيانات التي تخص المستخدم أو حتى لعرض تلك المقالة التي تقرؤها الآن، وكل ما يتعلق بإنشاء أو تعديل أو حذف البيانات يتم باستخدام الـ SQL Queries.
ولكن قد يتم استغلال ذلك وحقن الـ SQL بـ Queries قد تؤدي لكشف جميع ما تحتويه قاعدة البيانات أو تعديلها أو حتى حذفها، وذلك ما يجعل الـ SQLi خطراً قد يهدد أمان تطبيقات الويب ويشكل تهديداً لسمعتها وثقة عملائها.
سوف نقوم بإعطاء مثال صغير في البداية لكيفية تجاوز الـ SQL Query، لنفترض أنه لدينا نموذج لتسجيل الدخول يحتوي علي اسم المستخدم وكلمة المرور، عندما يتم إرسال المحتويات يتم تنفيذ Query بهذا الشكل علي سبيل المثال قمنا بإرسال اسم مستخدم Root-X وكلمة مرور Password:
SELECT * FROM users WHERE user='Root-X' AND pass='Password'
الآن ماذا يحدث إذا قمنا بحقن حقل الـ username بـ:
' --
- علامة ‘ لإغلاق علامة تنصيص متغير اسم المستخدم
- وعلامتي — لجعل باقِ الـ Query كتعليق (Comment) لا يمكن تنفيذه
لتصبح الـ Query بهذا الشكل:
SELECT * FROM users WHERE user='' -- AND pass=''
أو يمكن استخدام علامة الـ # بدلاً من الـ — لتكون هكذا:
SELECT * FROM users WHERE user='' # AND pass=''
الآن لما لا نحاول تجاوز المصادقة وتسجيل الدخول دون استخدام اسم مستخدم وكلمة مرور؟
سنقوم بحقن الـ username بـ:
' OR 1=1 #
لتصبح الـ Query بهذا الشكل:
SELECT * FROM users WHERE user='' OR 1=1 # AND pass=''
تم إغلاق علامة التنصيص لمتغير اسم المستخدم ثم تقوم بالتحقق من الشرط الثاني وهو إذا كان 1 = 1 وهذا طبعاً صحيح ثم تنتهي الـ Query بعلامة الـ # لإيقاف الـ Query، من المفترض ان ذلك سيقوم بتجاوز المصادقة وتسجيل الدخول بعدها.
؟SQL Injection Points ما هي الـ
يوجد العديد من النقاط التي تستخدم فيها تطبيقات الويب قواعد البيانات لاسترداد بعض المعلومات لعرضها للمستخدم من ضمنها علي سبيل المثال:
GET Based
يتم هجوم الحقن باستخدام GET Request من خلال متغير في الـ URL علي سبيل المثال:
Example.com/id?=1
يقوم المتغير id باسترداد قيمة = 1 من قاعدة البيانات وذلك ما يجعله مكاناً لاختبار الـ SQLi
POST Based
يتم اختبار الـ SQLi في الـ Forms التي تقوم باستخدام الـ POST Request علي سبيل المثال تجاوز عملية المصادقة من خلال الـ Login Form.
HEADER Based
يوجد في الـ HTTP Request العديد من الـ Headers التي قد يتم اختبار الحقن عليها مثل:
- x-forwarded-for
- user-agent
- referer
Cookie Based
قد يتم أيضا استخدام الـ Cookie لحقن SQL Query.