حقن SQL
في هذا القسم ، سنشرح ماهية حقن
SQL ، ووصف بعض الأمثلة الشائعة ، وشرح كيفية
العثور على أنواع مختلفة من الثغرات الأمنية لحقن SQL واستغلالها ، ونلخص كيفية منع حقن
SQL.
ما هو حقن SQL ( SQLi )؟
يعد إدخال SQL ثغرة أمنية على الويب تسمح للمهاجم بالتدخل في
الاستعلامات التي يقوم بها أحد التطبيقات في قاعدة البيانات الخاصة به. يسمح للمهاجم عمومًا بعرض البيانات التي لا
يستطيع عادةً استردادها. قد يشمل ذلك بيانات تخص مستخدمين آخرين ، أو أي
بيانات أخرى يمكن للتطبيق نفسه الوصول إليها. في كثير من الحالات ، يمكن للمهاجم تعديل أو حذف
هذه البيانات ، مما يتسبب في تغييرات مستمرة في محتوى التطبيق أو سلوكه.
في بعض الحالات ، يمكن للمهاجم تصعيد هجوم حقن
SQL لاختراق الخادم الأساسي
أو البنية التحتية الخلفية الأخرى ، أو تنفيذ هجوم رفض الخدمة.
ما هو تأثير هجوم حقن SQL الناجح؟
يمكن أن يؤدي هجوم حقن SQL الناجح إلى الوصول غير المصرح به إلى البيانات
الحساسة ، مثل كلمات المرور أو تفاصيل بطاقة الائتمان أو معلومات المستخدم الشخصية. كانت العديد من انتهاكات البيانات البارزة في
السنوات الأخيرة نتيجة لهجمات حقن SQL ،
مما أدى إلى الإضرار بالسمعة والغرامات التنظيمية. في بعض الحالات ، يمكن للمهاجم الحصول على باب
خلفي دائم في أنظمة المؤسسة ، مما يؤدي إلى حل وسط طويل الأجل يمكن أن يمر دون أن
يلاحظه أحد لفترة طويلة.
أمثلة حقن SQL
هناك مجموعة متنوعة من الثغرات الأمنية والهجمات
والتقنيات الخاصة بحقن SQL والتي تظهر في مواقف مختلفة. تتضمن بعض أمثلة حقن SQL الشائعة ما يلي:
·
استرداد
البيانات المخفية ،
حيث يمكنك تعديل استعلام SQL لإرجاع نتائج إضافية.
·
تخريب منطق
التطبيق ،
حيث يمكنك تغيير استعلام للتدخل في منطق التطبيق.
·
هجمات UNION ، حيث يمكنك استرداد
البيانات من جداول قاعدة بيانات مختلفة.
·
فحص قاعدة
البيانات ،
حيث يمكنك استخراج معلومات حول إصدار قاعدة البيانات وهيكلها.
·
حقن SQL الأعمى ،
حيث لا يتم إرجاع نتائج الاستعلام الذي تتحكم فيه في ردود التطبيق.
استرجاع البيانات المخفية
ضع في اعتبارك تطبيق التسوق الذي يعرض المنتجات
في فئات مختلفة. عندما ينقر المستخدم على فئة الهدايا ، يطلب
متصفحه عنوان URL:
https://insecure-website.com/products؟category=Gifts
يؤدي هذا إلى قيام التطبيق بإجراء استعلام
SQL لاسترداد تفاصيل
المنتجات ذات الصلة من قاعدة البيانات:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
يطلب استعلام SQL هذا من قاعدة البيانات إرجاع:
·
كل التفاصيل (*)
·
من جدول المنتجات
·
حيث تكون الفئة هدايا
- and
released is 1.
تم released = 1 يتم استخدامه لإخفاء المنتجات التي لم يتم
إصدارها. بالنسبة للمنتجات التي لم يتم طرحها ، يُفترض
أنه تم released = 0.
لا ينفذ التطبيق أي دفاعات ضد هجمات حقن
SQL ، لذلك يمكن للمهاجم إنشاء هجوم مثل:
https://insecure-website.com/products؟category=Gifts'--
ينتج عن هذا استعلام SQL:
SELECT * FROM products
WHERE category = 'Gifts'--' AND released = 1
الشيء الرئيسي هنا هو أن تسلسل الشرطة المزدوجة - هو مؤشر تعليق في SQL ،
ويعني أن باقي الاستعلام يتم تفسيره على أنه تعليق. يؤدي هذا إلى إزالة ما تبقى من الاستعلام بشكل
فعال ، لذلك لم يعد يتضمن AND released = 1 هذا يعني أنه يتم عرض جميع المنتجات ، بما في
ذلك المنتجات التي لم يتم طرحها.
للمضي قدمًا ، يمكن للمهاجم أن يتسبب في عرض
التطبيق لجميع المنتجات في أي فئة ، بما في ذلك الفئات التي لا يعرفون عنها:
https://insecure-website.com/products؟category=Gifts'+OR+1=1--
ينتج عن هذا استعلام SQL:
SELECT * FROM products WHERE category = 'Gifts'
OR 1=1--' AND released = 1
سيعيد الاستعلام المعدل جميع العناصر حيث تكون الفئة هدايا أو 1 تساوي 1. نظرًا لأن 1 =
1 تكون دائمًا صحيحة ،
فسيعيد الاستعلام جميع العناصر.
تخريب منطق التطبيق
فكر في تطبيق يتيح للمستخدمين تسجيل الدخول باسم مستخدم وكلمة مرور. إذا قدم المستخدم اسم المستخدم wiener وكلمة
المرور bluecheese ،
يتحقق تطبيق أوراق الاعتماد عن طريق إجراء الاستعلام SQL التالية:
SELECT * FROM users WHERE
username = 'wiener' AND password = 'bluecheese'
إذا كان الاستعلام يعرض تفاصيل المستخدم ، فإن
تسجيل الدخول يكون ناجحًا. خلاف ذلك ، يتم رفضه.
هنا ، يمكن للمهاجم تسجيل الدخول كأي مستخدم بدون كلمة مرور ببساطة
عن طريق استخدام تسلسل تعليق SQL - لإزالة التحقق من كلمة المرور من جملة WHERE في الاستعلام. على سبيل المثال ، يؤدي إرسال اسم المستخدم administrator'-- وكلمة المرور الفارغة إلى الاستعلام التالي:
SELECT * FROM users WHERE username =
'administrator'--' AND password = ''
يقوم هذا الاستعلام بإرجاع المستخدم الذي يكون اسم المستخدم الخاص
به هو administrator ويقوم بتسجيل دخول المهاجم بنجاح باعتباره هذا المستخدم.
استرجاع البيانات من جداول قاعدة البيانات الأخرى
في الحالات التي يتم فيها عرض نتائج استعلام
SQL ضمن استجابات التطبيق ،
يمكن للمهاجم الاستفادة من ثغرة أمنية لإدخال SQL لاسترداد البيانات من جداول أخرى داخل قاعدة
البيانات. يتم ذلك باستخدام الكلمة الأساسية UNION ،
والتي تتيح لك تنفيذ استعلام SELECT إضافي وإلحاق النتائج بالاستعلام الأصلي.
على سبيل المثال ، إذا نفذ أحد التطبيقات
الاستعلام التالي الذي يحتوي على إدخال المستخدم "هدايا":
SELECT name, description
FROM products WHERE category = 'Gifts'
ثم يمكن للمهاجم إرسال الإدخال:
' UNION SELECT username,
password FROM users--
سيؤدي هذا إلى قيام التطبيق بإرجاع جميع أسماء
المستخدمين وكلمات المرور بالإضافة إلى أسماء المنتجات وأوصافها.
فحص قاعدة البيانات
بعد التعرف الأولي على ثغرة أمنية لإدخال
SQL ، من المفيد عمومًا الحصول على بعض المعلومات
حول قاعدة البيانات نفسها. غالبًا ما تمهد هذه المعلومات الطريق لمزيد من
الاستغلال.
يمكنك الاستعلام عن تفاصيل الإصدار لقاعدة
البيانات. تعتمد الطريقة التي يتم بها ذلك على نوع قاعدة
البيانات ، لذا يمكنك استنتاج نوع قاعدة البيانات من أي تقنية تعمل. على سبيل المثال ، في Oracle يمكنك تنفيذ:
SELECT * FROM v$version
يمكنك أيضًا تحديد جداول قاعدة البيانات
الموجودة والأعمدة التي تحتوي عليها. على سبيل المثال ، في معظم قواعد البيانات ،
يمكنك تنفيذ الاستعلام التالي لسرد الجداول:
SELECT * FROM
information_schema.tables
ثغرات أمنية لإدخال لغة SQL العمياء
العديد من أمثلة حقن SQL هي ثغرات أمنية عمياء هذا يعني أن التطبيق لا يعرض نتائج استعلام
SQL أو تفاصيل أي أخطاء في
قاعدة البيانات ضمن استجاباته. لا يزال من الممكن استغلال الثغرات العمياء
للوصول إلى البيانات غير المصرح بها ، ولكن التقنيات المستخدمة بشكل عام أكثر
تعقيدًا وصعوبة في الأداء.
اعتمادًا على طبيعة الثغرة الأمنية وقاعدة
البيانات المعنية ، يمكن استخدام الأساليب التالية لاستغلال الثغرات الأمنية للحقن
العمياء لـ SQL:
·
يمكنك تغيير منطق الاستعلام لإحداث فرق يمكن
اكتشافه في استجابة التطبيق بناءً على حقيقة شرط واحد. قد يتضمن ذلك إدخال شرط جديد في بعض المنطق
المنطقي ، أو إثارة خطأ مشروط مثل القسمة على صفر.
·
يمكنك بشكل مشروط تشغيل تأخير زمني في معالجة
الاستعلام ، مما يتيح لك استنتاج حقيقة الحالة بناءً على الوقت الذي يستغرقه
التطبيق للرد.
·
يمكنك تشغيل تفاعل شبكة خارج النطاق باستخدام تقنيات OAST . هذه التقنية قوية للغاية وتعمل في المواقف التي
لا تعمل فيها التقنيات الأخرى. في كثير من الأحيان ، يمكنك استخراج البيانات مباشرة عبر القناة خارج النطاق ، على سبيل المثال عن
طريق وضع البيانات في بحث DNS لمجال تتحكم فيه.
·
كيفية الكشف عن الثغرات الأمنية حقن SQL
يمكن العثور على غالبية الثغرات الأمنية لحقن
SQL بسرعة وموثوقية
باستخدام أداة فحص الثغرات
الأمنية في Burp
Suite .
يمكن الكشف عن حقن SQL يدويًا باستخدام مجموعة منهجية من الاختبارات
مقابل كل نقطة دخول في التطبيق. هذا عادة ما يتضمن:
·
تقديم شخصية اقتباس مفردة ' والبحث عن الأخطاء أو غيرها من الحالات الشاذة.
·
تقديم بعض بناء الجملة الخاص بـ
SQL الذي يتم تقييمه إلى
القيمة الأساسية (الأصلية) لنقطة الإدخال ، وإلى قيمة مختلفة ، والبحث عن
الاختلافات المنهجية في استجابات التطبيق الناتجة.
·
تقديم شروط منطقية مثل OR 1 = 1 و OR 1 = 2 ، والبحث عن الاختلافات في استجابات التطبيق.
·
إرسال حمولات مصممة لإحداث تأخيرات زمنية عند
تنفيذها ضمن استعلام SQL ،
والبحث عن الاختلافات في الوقت المستغرق للاستجابة.
·
إرسال حمولات OAST المصممة لإطلاق تفاعل شبكة خارج النطاق عند
تنفيذها ضمن استعلام SQL ،
ومراقبة أي تفاعلات ناتجة.
·
حقن SQL في أجزاء مختلفة من الاستعلام
معظم نقاط الضعف حقن SQL تنشأ داخل WHERE بند من SELECT الاستعلام. هذا النوع من حقن SQL مفهوم جيدًا بشكل عام من قبل المختبرين ذوي
الخبرة.
ولكن يمكن أن تحدث الثغرات الأمنية لإدخال
SQL من حيث المبدأ في أي
مكان داخل الاستعلام وضمن أنواع استعلام مختلفة. المواقع الأخرى الأكثر شيوعًا التي يظهر فيها
إدخال SQL هي:
·
في عبارات UPDATE ، ضمن القيم المحدثة أو جملة WHERE .
·
في عبارات INSERT ،
ضمن القيم المدرجة.
·
في عبارات SELECT ، داخل الجدول أو اسم
العمود.
·
في عبارات SELECT ، ضمن جملة ORDER
BY .
حقن SQL من الدرجة الثانية
ينشأ حقن SQL من الدرجة الأولى حيث يأخذ التطبيق مدخلات
المستخدم من طلب HTTP ،
وفي سياق معالجة هذا الطلب ، يدمج الإدخال في استعلام SQL بطريقة غير آمنة.
في حقن SQL من الدرجة الثانية (المعروف أيضًا باسم حقن
SQL المخزن) ، يأخذ التطبيق
مدخلات المستخدم من طلب HTTP ويخزنها للاستخدام في المستقبل. يتم ذلك عادةً عن طريق وضع الإدخال في قاعدة
بيانات ، ولكن لا تظهر ثغرة أمنية في النقطة التي يتم فيها تخزين البيانات. في وقت لاحق ، عند التعامل مع طلب HTTP مختلف ،
يقوم التطبيق باسترداد البيانات المخزنة ودمجها في استعلام
SQL بطريقة غير آمنة.
غالبًا ما ينشأ حقن SQL من الدرجة الثانية في المواقف التي يكون فيها
المطورون على دراية بالثغرات الأمنية لحقن SQL ،
وبالتالي يتعاملون بأمان مع الوضع الأولي للإدخال في قاعدة البيانات. عند معالجة البيانات لاحقًا ، تعتبر آمنة ، حيث
تم وضعها مسبقًا في قاعدة البيانات بأمان. في هذه المرحلة ، يتم التعامل مع البيانات
بطريقة غير آمنة ، لأن المطور يعتقد بشكل خاطئ أنها موثوقة.
العوامل الخاصة بقاعدة البيانات
يتم تنفيذ بعض الميزات الأساسية للغة
SQL بنفس الطريقة عبر منصات
قواعد البيانات الشائعة ، والعديد من الطرق لاكتشاف واستغلال الثغرات الأمنية لحقن
SQL تعمل بشكل متماثل على
أنواع مختلفة من قواعد البيانات.
ومع ذلك ، هناك أيضًا
اختلافات كثيرة بين قواعد البيانات المشتركة. هذا يعني أن بعض تقنيات اكتشاف واستغلال حقن
SQL تعمل بشكل مختلف على أنظمة
أساسية مختلفة. فمثلا:
·
بناء الجملة لسلسلة السلسلة.
·
تعليقات.
·
استعلامات مجمعة (أو مكدسة).
·
واجهات برمجة التطبيقات الخاصة بالمنصة.
·
رسائل خاطئة.
·
كيفية منع حقن SQL
يمكن منع معظم مثيلات حقن
SQL باستخدام استعلامات ذات
معلمات (تُعرف أيضًا باسم العبارات المعدة) بدلاً من تسلسل السلسلة داخل الاستعلام.
الكود التالي عرضة لإدخال
SQL لأن إدخال المستخدم
متسلسل مباشرة في الاستعلام:
String query = "SELECT * FROM products WHERE
category = '"+ input + "'";
Statement statement =
connection.createStatement();
ResultSet resultSet =
statement.executeQuery(query);
يمكن إعادة كتابة هذا الرمز بسهولة بطريقة تمنع
إدخال المستخدم من التدخل في بنية الاستعلام:
PreparedStatement statement
= connection.prepareStatement("SELECT * FROM products WHERE category =
?");
statement.setString(1,
input);
ResultSet resultSet = statement.executeQuery();
يمكن استخدام الاستعلامات ذات المعاملات في أي موقف يظهر فيه إدخال غير موثوق به كبيانات داخل الاستعلام ، بما في ذلك عبارة WHERE والقيم في عبارة INSERT أو UPDATE . لا يمكن استخدامها لمعالجة المدخلات غير الموثوق بها في أجزاء أخرى من الاستعلام ، مثل أسماء الجدول
أو العمود ، أو عبارة ORDER BY . ستحتاج وظائف التطبيق التي تضع بيانات غير موثوق بها في تلك الأجزاء من الاستعلام إلى اتباع نهج
مختلف ، مثل إدراج قيم الإدخال المسموح بها في القائمة البيضاء ، أو استخدام منطق
مختلف لتقديم السلوك المطلوب.
لكي يكون استعلام معلمات فعالًا في منع إدخال
SQL ، يجب أن تكون السلسلة المستخدمة في
الاستعلام دائمًا ثابتة ذات ترميز ثابت ، ويجب ألا تحتوي على أي بيانات متغيرة من
أي أصل. لا تنجذب إلى تحديد كل حالة على حدة ما إذا كان
عنصر البيانات موثوقًا به ، واستمر في استخدام تسلسل السلسلة داخل الاستعلام
للحالات التي تعتبر آمنة. من السهل جدًا ارتكاب أخطاء بشأن الأصل المحتمل
للبيانات ، أو إجراء تغييرات في التعليمات البرمجية الأخرى لانتهاك الافتراضات حول
البيانات الملوثة.
0 Comments:
إرسال تعليق