خنقتونا خنقتونا
random

آخر الأخبار

random
random
جاري التحميل ...

شرح ثغرة SQL Injection: دليلك الكامل للسيطرة على قواعد البيانات | 2025

شرح ثغرة SQL Injection
 

شرح ثغرة SQL Injection: دليلك الكامل للسيطرة على قواعد البيانات

مقدمة:

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

بعد أن كشفنا أسرار [ثغرة XSS](رابط مقال XSS) و [ثغرة IDOR](رابط مقال IDOR)، حان الوقت لمواجهة "الوحش الأكبر" في عالم ثغرات الويب. استعد للغوص في واحدة من أقدم وأقوى وأخطر الثغرات الأمنية على الإطلاق.


الجزء الأول: الأساسيات - ما هي لغة SQL وقواعد البيانات؟

قبل أن نتعلم كيف "نحقن"، يجب أن نفهم أولاً ما الذي يتم حقنه وأين.

  • قاعدة البيانات (The Database): هي العقل المدبر لأي تطبيق ويب. إنها مكان منظم وآمن يتم فيه تخزين كل شيء: معلومات المستخدمين، كلمات المرور، المنتجات، التعليقات، الرسائل. فكر فيها كخزنة بيانات عملاقة منظمة في جداول (Tables) دقيقة، تشبه جداول Excel ولكنها أكثر قوة.

  • لغة SQL (Structured Query Language): هي اللغة الرسمية التي نستخدمها للتحدث مع قاعدة البيانات. إنها مجموعة من الأوامر التي تسمح لنا بالتفاعل مع هذه "الخزنة". أشهر هذه الأوامر:

    • SELECT: "أرني البيانات" (مثلاً، SELECT username, password FROM users WHERE user_id = 1).

    • INSERT: "أضف هذه البيانات الجديدة".

    • UPDATE: "عدّل هذه البيانات الموجودة".

    • DELETE: "احذف هذه البيانات".


الجزء الثاني: الخدعة - ما هي ثغرة SQL Injection (SQLi)؟

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

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

تشبيه بسيط لفهم الفكرة

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


"SELECT * FROM users WHERE username = '" + userInput + "';"


إذا أدخل مستخدم عادي اسمه "Ahmed"، سيصبح الأمر النهائي:


"SELECT * FROM users WHERE username = 'Ahmed';" (وهذا طبيعي).


لكن ماذا لو أدخل مهاجم هذا الـ Payload: ' OR 1=1-- ؟


سيصبح الأمر النهائي:


"SELECT * FROM users WHERE username = '' OR 1=1--';"


التحليل:

  • ': يغلق علامة التنصيص الخاصة باسم المستخدم.

  • OR 1=1: يضيف شرطًا جديدًا يكون صحيحًا دائمًا (1=1).

  • --: يخبر قاعدة البيانات بتجاهل كل ما يأتي بعده (لإلغاء أي أجزاء متبقية من الأمر الأصلي).

النتيجة؟ لقد خدع المهاجم قاعدة البيانات لتنفذ أمرًا يعني: "أعطني كل البيانات من جدول المستخدمين لأن الشرط 1=1 صحيح دائمًا"، مما قد يؤدي إلى تسجيل دخوله كأول مستخدم في قاعدة البيانات (غالبًا الأدمن).


الجزء الثالث: الترسانة - أشهر أنواع SQL Injection 

  1. In-Band SQLi (الحقن الذي ترى نتائجه):

    • Error-Based SQLi: تعتمد على حقن Payloads تجبر قاعدة البيانات على إظهار رسائل خطأ. هذه الأخطاء غالبًا ما تكشف عن معلومات حساسة حول هيكل قاعدة البيانات، مثل أسماء الجداول والأعمدة.

    • UNION-Based SQLi: النوع الأقوى والأشهر. يسمح للمهاجم باستخدام الكلمة المفتاحية UNION لدمج نتائج استعلامه الخبيث (مثل قائمة بجميع كلمات المرور) مع نتائج الاستعلام الأصلي الشرعي، وعرضها مباشرة على الصفحة.

  2. Inferential SQLi (الحقن الاستنتاجي أو الأعمى):

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

    • Boolean-Based Blind SQLi: أنت تحقن شرطًا، إذا كان صحيحًا، تعرض الصفحة محتوى طبيعيًا، وإذا كان خاطئًا، تعرض الصفحة محتوى مختلفًا أو فارغًا.

    • Time-Based Blind SQLi: أنت تحقن أمرًا يجبر قاعدة البيانات على الانتظار لعدد معين من الثواني (مثل sleep(5)) إذا كان الشرط صحيحًا. إذا تأخر تحميل الصفحة، فأنت تعرف أن إجابتك "نعم".


الجزء الرابع: الصيد - منهجية اكتشاف ثغرات SQLi 

  • الاختبار الكلاسيكي (The Apostrophe Test): هذه هي خطوتك الأولى دائمًا. أدخل علامة تنصيص فردية (') في أي حقل إدخال أو پارامتر في الرابط. إذا ظهر خطأ متعلق بقاعدة البيانات (SQL Syntax Error, ODBC Error...)، فهذه علامة قوية جدًا على وجود الثغرة بنسبة 90%.

  • اختبارات Boolean المنطقية: جرب حقن Payloads منطقية لمعرفة ما إذا كان سلوك الصفحة يتغير.

    • ' OR 1=1-- (يجب أن يعيد كل شيء)

    • ' AND 1=2-- (يجب ألا يعيد أي شيء)

  • التعليقات (Comments): استخدم رموز التعليقات (-- أو #) للتخلص من بقية استعلام SQL الأصلي والتحكم في ما يتم تنفيذه.


الجزء الخامس: الدمار - التأثير الحقيقي لثغرة SQL Injection 

تأثير هذه الثغرة ليس مجرد تسريب بيانات، بل يمكن أن يكون كارثيًا:

  • سرقة قاعدة البيانات بالكامل (Database Exfiltration): سحب جميع الجداول والبيانات، بما في ذلك معلومات المستخدمين، كلمات المرور، تفاصيل البطاقات الائتمانية، والأسرار التجارية.

  • تجاوز المصادقة (Authentication Bypass): تسجيل الدخول كأي مستخدم، بما في ذلك الأدمن، دون الحاجة إلى كلمة مرور.

  • فقدان سلامة البيانات (Data Integrity Loss): القدرة على تعديل (UPDATE) أو حذف (DELETE) أي بيانات في قاعدة البيانات.

  • السيطرة على الخادم (Remote Code Execution - RCE): في بعض قواعد البيانات والإعدادات الخطيرة، يمكن للمهاجم استغلال الثغرة لتنفيذ أوامر على نظام تشغيل الخادم نفسه، مما يمنحه سيطرة كاملة.


الجزء السادس: الدرع - كيف يمنع المطورون ثغرات SQLi؟ 

على عكس ما قد يبدو، فإن الدفاع ضد SQL Injection واضح ومباشر إذا تم تطبيقه بشكل صحيح.

الحل الأمثل: Parameterized Queries (أو Prepared Statements) 

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

  1. إرسال قالب الأمر: يرسل المطور "هيكل" أمر SQL إلى قاعدة البيانات مع علامات استفهام (?) بدلاً من البيانات الفعلية. مثال: SELECT * FROM users WHERE username = ?;

  2. إرسال البيانات بشكل منفصل: يرسل المطور مدخلات المستخدم بشكل منفصل.


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


الجزء السابع: ما وراء الأساسيات - تقنيات SQLi متقدمة 

  • Second-Order SQL Injection: هجوم خادع حيث لا يتم تنفيذ الـ Payload الضار فورًا. يقوم المهاجم بحقن Payload يتم تخزينه في قاعدة البيانات بشكل يبدو آمنًا في البداية. لاحقًا، عندما يقوم جزء آخر من التطبيق باستدعاء هذه البيانات المخزنة واستخدامها في استعلام جديد، يتم تنفيذ الهجوم.

  • Out-of-Band (OOB) SQL Injection: تقنية متقدمة تستخدم عندما يكون الحقن "أعمى" تمامًا ولا يمكنك الاعتماد على استجابة HTTP. هنا، تجبر قاعدة البيانات على إجراء اتصال شبكي خارجي (مثل طلب DNS) إلى خادم تتحكم فيه، لإرسال البيانات المسروقة.


الجزء الثامن: السلاح الأقوى - مقدمة إلى أداة SQLMap 

لا تكتمل أي مناقشة حول SQLi دون ذكر SQLMap.

  • ما هي؟ هي أداة مفتوحة المصدر مكتوبة بلغة بايثون، تقوم بأتمتة عملية اكتشاف واستغلال ثغرات SQL Injection بشكل كامل.

  • ماذا تفعل؟ بمجرد إعطائها رابطًا مصابًا، يمكن لـ SQLMap أن:

    • تحدد نوع قاعدة البيانات.

    • تستخرج أسماء قواعد البيانات، الجداول، الأعمدة، والبيانات.

    • تحاول كسر كلمات المرور المجزأة.

    • في بعض الحالات، تحصل على Shell على الخادم.

  • تحذير: SQLMap أداة قوية للغاية. استخدامها على أي نظام دون إذن صريح هو عمل غير قانوني. يجب على الباحثين الأخلاقيين استخدامها فقط ضمن نطاق برامج الـ Bug Bounty المسموح بها.


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


في دليلنا القادم، سنستكشف عالمًا مختلفًا من الهجمات مع ثغرة CSRF، التي تجبر المستخدمين على تنفيذ إجراءات لا يريدونها دون علمهم. كن مستعدًا

والآن، شاركنا في التعليقات: ما هي المعلومة الأكثر إثارة للصدمة التي تعلمتها عن قوة ثغرة SQL Injection اليوم؟

عن الكاتب

Mahmoud Salman

التعليقات


اتصل بنا

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

تابع المدونة من هنا

مواقيت الصلاة من هنا

مشاركة مميزة

شرح ثغرة SQL Injection: دليلك الكامل للسيطرة على قواعد البيانات | 2025

شرح ثغرة SQL Injection   شرح ثغرة SQL Injection: دليلك الكامل للسيطرة على قواعد البيانات مقدمة: تخيل أنك تستطيع خداع أمين الأرشيف في مكتبة ض...

جميع الحقوق محفوظة

خنقتونا