ثغرة 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 التي قد يتم اختبار الحقن عليها مثل:

  1. x-forwarded-for
  2. user-agent
  3. referer

قد يتم أيضا استخدام الـ Cookie لحقن SQL Query.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *