بسم الله الرحمن الرحيم،
1/ ما معنى SQL injection
وفي الصفحة التي تظهر للمستخدم يوجد نموذج 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 هو أحد الأنواع عندما يقوم مدير الموقع بتعطيل إظهار معلومات نتيجة استعلامات خاطئة، فلا يظهر شئ للمهاجم، حينها يكون عليه أن يقوم بعمل أكثر وربما يكون من المستحيل بالنسبة له الحصول على نتيجة عندما تفشل محاولاته جميعها في إعطائه ما يريد.