ما معنى SQL injection تابع سلسلة Security FAQs

الناقل : elmasry | الكاتب الأصلى : Xacker | المصدر : www.arabteam2000-forum.com

بسم الله الرحمن الرحيم،

1/ ما معنى SQL injection

  • إدخال (حقن) تعليمات SQL في قاعدة بيانات موقع ما من خلال ضعف أمني في برمجة الموقع بأخذ معلومات أو قيم مرتجعة من قبل المستخدم من الصفحة بدون فحصها بحثاً عن الرموز الممنوعة والتي قد تسبب خللاً في الجمل الخاصة بـ SQL عندما يتم إدخال هذه القيم في الحقول المخصصة في قاعدة البيانات.
  • SQL injection يمكن أن يحدث في أي مكان يقوم باسترجاع بيانات من المستخدم، أو يعتمد على قيم معينة يعتبرها المبرمج ثابتة في الصفحة، بينما في حقيقة الأمر يكون المهاجم قد قام بتبديلها بقيم أخرى معتمداً على أن المبرمج قام بإغفال هذه النقطة من خلال حفظ الصفحة لديه وإعادة تشكيلها مرة أخرى reconstruct بقيم مختلفة عما وضعه المبرمج، مثال: استخدام قائمة drop down لعرض مجموعة من الألوان والطلب من المستخدم اختيار لونه المفضل، يمكن للمهاجم حفظ الصفحة وإعادة كتابة شئ مختلف بدلاً من القيم بنفس الـ id المحدد للعنصر.
  • SQL injection يتنوع بين السهل الاستغلال وبين المعقّد الاستغلال.
  • يمكن إعطاء المثال البسيط التالي: جملة SQL في صفحة login.php تقوم باختيار عضوية من جدول بناء على وجود اسم مستخدم في هذا الجدول وتطابق كلمة المرور مع الحقل المناسب
    SELECT id FROM users WHERE name='$name' AND pass='$pass';

وفي الصفحة التي تظهر للمستخدم يوجد نموذج FORM بالشكل التالي:
<form method="post" action="login.php">
        <input type="text" name="name">
        <input type="password" name="pass">
        <input type="submit" value="login">
</form>


عند النقر على زر Submit فإن النموذج يقوم بإرسال قيم الحقول name و pass إلى الصفحة login.php التي تحوي على جملة SQL السابقة.

لو قام المهاجم بإدخال النص التالي كاسم مستخدم (نفرض وجوده في الجدول):
admin

وقام بإدخال كلمة مرور بالشكل:
' or 1=1;--


فما يحصل هو أن القيم أعلاه سيتم إضافتها ضمن جملة SQL كقيم متغيرات لتصبح الجملة أثناء التنفيذ بالشكل التالي:
SELECT id FROM users WHERE name='admin' AND pass='' OR 1=1;--';


لاحظ كيف أنه يتم نفي احتمال كون كلمة السر فارغة من خلال استخدام الشرط المنطقي OR
وتبديله بعبارة محققة دوماً، 1=1
من ثم إدخال ; والتي تعني نهاية الجملة الشرطية
من ثم -- التي تعني اعتبار كل ما يليها كتعليق لا يتم أخذه بعين الاعتبار أثناء التنفيذ (لتجنب الأخطاء التي قد تظهر في جملة SQL معقدة أكثر)

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

يمكن استغلال SQL injection للحصول على صلاحيات، لسرقة جداول كاملة قد تحوي على بيانات شخصية أو بيانات هامة وسرّية (بطاقات الائتمان في موقع تجاري) والعديد من الأمور الأخرى.

<li>بما أن جمل SQL لا تظهر للمهاجم وتختلف من موقع لآخر فيكون هناك عمل ينتظر المهاجم في كتابة استغلالات أكثر تعقيداً من المثال أعلاه للحصول على صلاحيات أو بيانات ما من جدول معين، فمجرد عدم الحصول على اسم الجدول يمنعه من الحصول على المعلومات الموجوده بداخله لذلك يلجئ المهاجم إلى إدخال استغلالات خاطئة عند التنفيذ تحدث خطأ معالجة تجعل السيرفر يقوم بتلفّظ معلومات لمحاولة توضيح الخطأ وسبب حصوله، غالباً ما تحوي هذه الأخطاء على معلومات مهمة للمهاجم كأن يظهر الخطأ التالي:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35


في استغلال خاطئ ( ' having 1=1-- ) يمكن المهاجم من معرفة الجدول والـ column الذي يعمل فيه ومعلومات أخرى أيضاً مثل GROUP BY التي قد تساهم في توسعة دائرة المعرفة الخاصة به!

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