بيت » SQL Injection 101: ما هو SQLi وكيفية منع الهجمات

SQL Injection 101: ما هو SQLi وكيفية منع الهجمات

أغسطس 06, 2022 • الأمن

ما هو حقن SQL

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

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

أنواع حقن SQL

أنواع حقن SQL

حقن SQL داخل النطاق

In-band SQL injection is an attack where the attacker uses the same channel to send and receive queries. In-band means that the response is obtained using the same communications medium. The attacker’s goal is to get the response in a web browser immediately, if possible when carrying out the attack manually with a web browser.

مثال على حقن SQL داخل النطاق

The most common way for an attacker to do an in-band SQL injection is to change the request so they can see the personal information of the current user. This can be done by changing the value sent as part of the request. For example, if the statement was supposed to display the user’s name, the attacker could change it so that their name is displayed instead.

اختر * من المستخدمين حيث معرف المستخدم يشبه 'current_user'

حقن SQL القائم على الخطأ وحقن SQL القائم على الاتحاد هما الشكلان الأكثر شيوعًا لحقن SQL داخل النطاق.

حقن SQL القائم على الخطأ

An error-based SQLi technique is an in-band SQL injection approach that takes advantage of database server error messages to discover the database’s architecture. Error-based SQL injection is the most common type of in-band SQL injection.

مثال على حقن SQL القائم على الخطأ:

إذا حاول مهاجم تسجيل الدخول باستخدام بيانات الاعتماد التالية:

اسم المستخدم: ' OR 'a'='apassword: anything

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

حقن SQL القائم على الاتحاد:

حقن SQL داخل النطاق هو طريقة للحصول على معلومات من موقع ويب باستخدام عامل التشغيل UNION لدمج مخرجات اثنين أو أكثر من بيانات SELECT.

حقن SQL الأعمى

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

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

ينقسم حقن SQL الأعمى إلى حقن SQL الأعمى القائم على المنطق البولياني وحقن SQL الأعمى القائم على الوقت.

حقن SQL الأعمى القائم على المنطق البولياني

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

مثال على حقن SQL الأعمى القائم على المنطق البولياني:

إذا أراد مهاجم معرفة نوع قاعدة البيانات، سيستخدم البيان التالي:

اختر * من المستخدمين حيث معرف المستخدم يشبه 'current_user' و قاعدة البيانات() يشبه '%type%'

إذا كانت قاعدة البيانات MySQL، سيكون الناتج شيئًا مثل هذا:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘and database() like ‘%type%” at line

حقن SQL الأعمى القائم على الوقت

هجوم حقن SQL الأعمى القائم على الوقت هو عندما يتم إرسال أمر SQL إلى الخادم مع رمز يتسبب في تنفيذ الاستعلامات بشكل أبطأ.

Time-based Blind attacks allow attackers to extract data based on access time. Such an attack is known as a blind or inferential injection assault. This is a type of assault in which no data flows between the attacker and the database, but because there is no response, it’s also known as a blind injection attack.

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

مثال على حقن SQL الأعمى

في هذا المثال، يحاول المهاجم تحديد ما إذا كان المستخدم ذو المعرف 999 موجودًا في قاعدة البيانات. للقيام بذلك، يستخدم البيان التالي:

إذا(جزء((اختر كلمة المرور من المستخدمين حيث معرف المستخدم=999),0, طول('secret'))='secret', نوم(30), 'خطأ')

إذا كان المستخدم ذو المعرف 999 موجودًا في قاعدة البيانات وكلمة مروره هي secret، فإن التطبيق سينام لمدة 30 ثانية. سيعيد التطبيق false إذا لم يكن المستخدم موجودًا في قاعدة البيانات.

حقن SQL خارج النطاق

قد يرسل شخص يريد سرقة البيانات شفرة SQL إلى خادم قاعدة البيانات بطريقة ليست جزءًا من الاتصال المعتاد بين الخادم وأجهزة الكمبيوتر الأخرى. يمكن القيام بذلك عن طريق إرسال معلومات إلى الخادم عبر طلبات DNS أو HTTP.

The app’s response will not be affected by whether or not any data is returned, whether or not there is a problem with the database, or how long it takes to execute the query. Out-of-band can be used in network interactions to fire events at will. Depending on an injected condition, these may be activated conditionally to gain knowledge one bit at a time.

Data can also leak via several networking protocols from network interactions. The visual represents the request sent from the web application to the app’s database.

مثال على حقن SQL خارج النطاق

في هذا المثال، يحاول المهاجم تحديد ما إذا كان مستخدم محدد موجودًا في قاعدة البيانات. للقيام بذلك، يستخدم البيان التالي:

SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'' INTO OUTFILE '/var/opt/databases/$filename.php'; --

سيعيد التطبيق معرف المستخدم إذا كان المستخدم موجودًا في قاعدة البيانات. إذا لم يكن المستخدم موجودًا في قاعدة البيانات، فإن التطبيق سينشئ ملفًا يحتوي على شفرة PHP يمكن استخدامها لتنفيذ أوامر النظام. يمكن للمهاجم بعد ذلك استخدام هذا الملف لتشغيل الأوامر على الخادم.

كيفية منع حقن SQL

The best way to protect against SQL injection attacks is to use input validation, prepared statements, and parametrized queries. The code should never make direct use of the user’s input. Developers must sanitize all input instead of simply web form inputs such as login forms. Single quotes should be eliminated from any questionable code components. It’s also a good idea to hide database problems on live sites to avoid inadvertently revealing them. SQL injection may provide information about a database system that attackers can use to their advantage.

If you find a problem with your website, you should take it offline immediately and contact your hosting provider. They can help you determine whether or not your site has been compromised and what steps you need to take to fix the problem. In the meantime, ensure that all of your website’s users know about the problem and change their passwords as soon as possible.

نصائح الوقاية لتجنب حقن SQL

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

1) استخدام الإجراءات المخزنة المبنية بشكل صحيح

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

Prepared statements help ensure that a query’s goal is not changed, even if someone tries to give SQL instructions.

2) التحقق من صحة الإدخال باستخدام قائمة السماح

SQL queries use bind variables in specific places for data. For example, if you’re using Python, you would use the %s عنصر نائب. يمكنك استخدام تعبير عادي للتحقق من صحة إدخال المستخدم مقابل قائمة السماح لما هي الأحرف المسموح بها في كل متغير ربط.

If you’re using JavaScript, you can use \w لمطابقة الأحرف الأبجدية الرقمية والشرطة السفلية.

يجب أن تكون قائمة السماح محددة قدر الإمكان لتجنب الإيجابيات الكاذبة.

For example, if you’re looking for a US phone number, you would use the following regular expression:

/^\d{11}$/

This would match a string of 11 digits that could be a phone number. If someone tried to submit something like ‘أبجديف‘, it would not match, and the input would be invalid.

This will help make sure your data is safe and sound. If you need to use values from code instead of user parameters, that’s okay too!

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

3) استخدام قوائم السماح

لا تقم بتصفية إدخال المستخدم بناءً على قوائم الحظر للأحرف السيئة. استخدام قوائم السماح للأحرف الجيدة المتوقعة في الحقول المحددة هو أكثر فعالية. سيوقف ذلك هجمات حقن SQL قبل أن تبدأ.

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

4) استخدام الأنظمة الأكثر تحديثًا

لا يحتوي PHP على حماية من SQLi في منصات تطوير الويب القديمة. استخدم أحدث إصدار من بيئة البرمجة، اللغة، والتقنيات المرتبطة المتاحة. بدلاً من PHP، استخدم PDO في هذا المثال.

5) فحص تطبيق الويب الخاص بك بانتظام

يمكن أن تكون حقن SQL صعبة للغاية في الاكتشاف. من المهم فحص تطبيق الويب الخاص بك بانتظام بحثًا عن الثغرات.

6) تطبيق مبدأ الأقل امتيازًا

مبدأ الأقل امتيازًا هو مفهوم أمني يقيد المستخدمين إلى الحد الأدنى من الوصول الذي يحتاجونه لأداء وظيفتهم. يشمل ذلك تحديد عدد الحسابات التي يمتلكها المستخدمون والامتيازات التي تمتلكها تلك الحسابات.

أقل تقييد على الوظائف (LRF) هو ممارسة ومفهوم تقييد حقوق المستخدمين، الحسابات، والعمليات الحاسوبية إلى الموارد الضرورية فقط للمهام الأساسية والمقبولة. يساعد ذلك في الحفاظ على حقوق المستخدمين أو مستويات التصريح الأدنى، وهو أمر حيوي للأشخاص لأداء وظائفهم بفعالية.

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

SQL Injection – Frequently asked questions

 
ما هو أكثر أنواع حقن SQL شيوعًا؟

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

ما هو أفضل دفاع ضد حقن SQL؟

أفضل دفاع ضد حقن SQL هو استخدام الاستعلامات ذات المعلمات. يستخدم هذا النوع من الاستعلامات قيمًا بديلة للمعلمات، والتي يتم توفيرها في وقت لاحق. تتيح هذه الطريقة لقاعدة البيانات التمييز بين شفرة المصدر والمعلومات.

كيف يتم اكتشاف حقن SQL؟

يمكن اكتشاف حقن SQL بطرق عدة. إحدى الطرق هي استخدام جدار حماية تطبيقات الويب (WAF). الـ WAF هو قطعة من الأجهزة أو البرمجيات التي تقع بين تطبيق الويب والإنترنت. يقوم بفحص حركة المرور للكشف عن الأنشطة الخبيثة ويمكنه حجب هجمات حقن SQL.

ما هو حقن SQL من الدرجة الثانية؟

يحدث حقن SQL من الدرجة الثانية عندما يتمكن المهاجم من حقن حمولة يتم تخزينها بواسطة تطبيق الويب ثم تنفيذها لاحقًا. هذا النوع من الهجوم أكثر صعوبة في تحقيقه لأن المهاجم يجب أن يكون لديه طريقة لتفعيل تنفيذ الحمولة المخزنة.

ما هو حقن SQL الأعمى؟

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

ما هو استعلام مكدس؟

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

ما هو حقن SQL القائم على الخطأ؟

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

الصورة الرمزية للمؤلف

حماية

أدمن كاتبة كبيرة في قسم تكنولوجيا الحكومة. كتبت سابقًا في PYMNTS وThe Bay State Banner، وحصلت على درجة البكالوريوس في الكتابة الإبداعية من جامعة كارنيجي ميلون. وهي تقيم خارج بوسطن.

arArabic