مقالة عن SQL injection

 



حقن SQL

في هذا القسم ، سنشرح ماهية حقن SQL ، ووصف بعض الأمثلة الشائعة ، وشرح كيفية العثور على أنواع مختلفة من الثغرات الأمنية لحقن SQL واستغلالها ، ونلخص كيفية منع حقن SQL.


ما هو حقن SQL ( SQLi )؟

يعد إدخال SQL ثغرة أمنية على الويب تسمح للمهاجم بالتدخل في الاستعلامات التي يقوم بها أحد التطبيقات في قاعدة البيانات الخاصة بهيسمح للمهاجم عمومًا بعرض البيانات التي لا يستطيع عادةً استردادهاقد يشمل ذلك بيانات تخص مستخدمين آخرين ، أو أي بيانات أخرى يمكن للتطبيق نفسه الوصول إليهافي كثير من الحالات ، يمكن للمهاجم تعديل أو حذف هذه البيانات ، مما يتسبب في تغييرات مستمرة في محتوى التطبيق أو سلوكه.

في بعض الحالات ، يمكن للمهاجم تصعيد هجوم حقن SQL لاختراق الخادم الأساسي أو البنية التحتية الخلفية الأخرى ، أو تنفيذ هجوم رفض الخدمة.

 

 

ما هو تأثير هجوم حقن SQL الناجح؟

 

يمكن أن يؤدي هجوم حقن SQL الناجح إلى الوصول غير المصرح به إلى البيانات الحساسة ، مثل كلمات المرور أو تفاصيل بطاقة الائتمان أو معلومات المستخدم الشخصيةكانت العديد من انتهاكات البيانات البارزة في السنوات الأخيرة نتيجة لهجمات حقن SQL ، مما أدى إلى الإضرار بالسمعة والغرامات التنظيميةفي بعض الحالات ، يمكن للمهاجم الحصول على باب خلفي دائم في أنظمة المؤسسة ، مما يؤدي إلى حل وسط طويل الأجل يمكن أن يمر دون أن يلاحظه أحد لفترة طويلة.

 

LAB:- شرح SQL injection  



أمثلة حقن 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 تكون دائمًا صحيحة ، فسيعيد الاستعلام جميع العناصر.  

 

 

 LAB:- شرح SQL injection  


 

تخريب منطق التطبيق                       

 

فكر في تطبيق يتيح للمستخدمين تسجيل الدخول باسم مستخدم وكلمة مرورإذا قدم المستخدم اسم المستخدم 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--

 

سيؤدي هذا إلى قيام التطبيق بإرجاع جميع أسماء المستخدمين وكلمات المرور بالإضافة إلى أسماء المنتجات وأوصافها.

 

 LAB:- شرح SQL injection  


 

فحص قاعدة البيانات

بعد التعرف الأولي على ثغرة أمنية لإدخال 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 تعمل بشكل مختلف على أنظمة أساسية مختلفةفمثلا:

 

·    بناء الجملة لسلسلة السلسلة.

·    تعليقات.

·    استعلامات مجمعة (أو مكدسة).

·    واجهات برمجة التطبيقات الخاصة بالمنصة.

·    رسائل خاطئة.

·     


LAB:- شرح SQL injection  




كيفية منع حقن 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 ، يجب أن تكون السلسلة المستخدمة في الاستعلام دائمًا ثابتة ذات ترميز ثابت ، ويجب ألا تحتوي على أي بيانات متغيرة من أي أصللا تنجذب إلى تحديد كل حالة على حدة ما إذا كان عنصر البيانات موثوقًا به ، واستمر في استخدام تسلسل السلسلة داخل الاستعلام للحالات التي تعتبر آمنةمن السهل جدًا ارتكاب أخطاء بشأن الأصل المحتمل للبيانات ، أو إجراء تغييرات في التعليمات البرمجية الأخرى لانتهاك الافتراضات حول البيانات الملوثة.



 


About Toulay

    Blogger Comment
    Facebook Comment

0 Comments:

إرسال تعليق