
أداة استغلال SQL Injection
#BBQSQL# أداة استغلال حقن SQL الأعمى
يمكن أن يكون استغلال حقن SQL الأعمى مؤلماً. عندما تعمل الأدوات المتاحة، فإنها تعمل بشكل جيد، ولكن عندما لا تعمل، يجب عليك كتابة شيء مخصص. هذا يستغرق وقتًا طويلاً وممل. يمكن لـ BBQSQL مساعدتك في معالجة هذه المشكلات.
BBQSQL هو إطار عمل لحقن SQL الأعمى مكتوب بلغة بايثون. إنه مفيد للغاية عند مهاجمة ثغرات حقن SQL الصعبة. BBQSQL هي أيضًا أداة شبه تلقائية، تسمح بقدر كبير من التخصيص لتلك النتائج الصعبة في حقن SQL. الأداة مصممة لتكون غير مرتبطة بنوع قاعدة البيانات ومتعددة الاستخدامات للغاية. كما أنها تحتوي على واجهة مستخدم بديهية لتسهيل إعداد الهجمات. يتم أيضًا تنفيذ مكتبة Python gevent، مما يجعل BBQSQL سريعًا للغاية.
حاولنا كتابة الأداة بطريقة تجعلها واضحة ذاتيًا عند إعداد هجوم في الواجهة. ومع ذلك، من أجل الدقة قمنا بتضمين ملف README مفصل يجب أن يوفر لك رؤية إضافية حول تفاصيل كل خيار تكوين. شيء يجب ملاحظته هو أن كل خيار تكوين في الواجهة يحتوي على وصف مرتبط به، لذا إذا اخترت تشغيل الأداة دون قراءة هذه الصفحة، فيجب أن تكون قادرًا على شق طريقك خلال هجوم.
على غرار أدوات حقن SQL الأخرى، تقدم معلومات معينة عن الطلب.
يجب تقديم المعلومات المعتادة:
ثم حدد أين يتم الحقن وما هي الصيغة التي نقوم بحقنها. تابع القراءة للحصول على التفاصيل.
يجب أن يكون هذا واضحًا، ولكن مهما يكن. جرب تشغيل:
sudo pip install bbqsql
إذا لم ينجح ذلك، يمكنك التثبيت من المصدر. الأداة تتطلب gevent و requests.
في القائمة سترى مكانًا لخيارات BBQSQL. هنا تحدد الخيارات التالية:
هذا موصوف بالتفصيل أدناه نظرة عامة على صيغة الاستعلام.
اسم ملف لإخراج النتائج إليه. اترك هذا فارغًا إذا كنت لا تريد إخراج إلى ملف.
يستخدم BBQSQL تقنيتين عند إجراء هجوم حقن SQL الأعمى. التقنية الأولى والافتراضية المستخدمة هي binary_search. انظر ويكيبيديا لمزيد من المعلومات.
التقنية الثانية التي يمكنك استخدامها هي frequency_search. يعتمد البحث بالتردد على تحليل اللغة الإنجليزية لتحديد التردد الذي سيظهر به الحرف. طريقة البحث هذه سريعة جدًا ضد البيانات غير الانتروبية، ولكن يمكن أن تكون بطيئة ضد البيانات غير الإنجليزية أو المبهمة.
يمكنك تحديد إما binary_search أو frequency_search كقيمة لهذه المعلمة.
يحدد هذا نوع حقن SQL الذي اكتشفته. هنا يمكنك تعيين أي سمة من استجابة HTTP يجب أن ينظر إليها bbqsql لتحديد صواب/خطأ.
يمكنك تحديد: status_code، url، time، size، text، content، encoding، cookies، headers، أو history
إذا حددت حقن SQL يؤدي إلى رمز حالة مختلف للخادم فاضبط 'status_code' هنا. إذا كان الكوكيز مختلفًا فاضبط 'cookie'. إذا كان حجم الاستجابة مختلفًا فاضبط 'size'. لقد فهمت الفكرة.
التزامن يعتمد على مكتبة gevent في بايثون. من الناحية الوظيفية، يبدو وكأنه يعمل مثل الخيوط ولكن تفاصيل كيفية عمله يمكن رؤيتها في محادثتنا في DefCon هنا [أدخل الرابط]. هذا الإعداد يتحكم في مقدار التزامن لتشغيل الهجوم. هذا مفيد للحد من الطلبات وتسريع أوقات الهجوم. للخوادم عالية الأداء مثل nginx، تمكنا من ضبط التزامن إلى 75. بشكل افتراضي، هذا مضبوط على '30'.
إذا واجهت ثغرة حقن SQL تحتوي على بعض الخصائص الغريبة (مثل عدم إمكانية تضمين أحرف معينة أو عدم عمل وظائف مثل ASCII/CHAR)، فربما وجدت نفسك تكتب سكريبتًا مخصصًا بصيغة الحقن الخاصة بك. BBQSQL يلغي الحاجة إلى البرمجة النصية ويوفر طريقة لك للصق صيغة الاستعلام المخصصة والاستغلال بسهولة.
مدخل الاستعلام هو المكان الذي ستبني فيه استعلامك المستخدم لاستخراج المعلومات من قاعدة البيانات. الافتراض هو أنك قد حددت بالفعل حقن SQL على متغير ضعيف، واختبرت استعلامًا ناجحًا.
فيما يلي مثال على استعلام يمكنك استخدامه لبناء استعلامك.
في هذا المثال، المهاجم يبحث عن تحديد إصدار قاعدة البيانات:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
صيغة الاستعلام تعتمد على عناصر نائبة تخبر BBQSQL بكيفية تنفيذ الهجوم.
تحتاج إلى تقديم العناصر النائبة التالية لكي يعمل الهجوم. بمجرد وضعها في استعلامك، سيقوم bbqSQL بالباقي:
${row_index}: يخبر هذا bbqSQL بتكرار الصفوف هنا. نظرًا لأننا نستخدم LIMIT يمكننا عرض عدد n من الصفوف اعتمادًا على قيمة ${row_index}.
${char_index}: يخبر هذا bbqSQL أي حرف من التحديد الفرعي (subselect) للاستعلام.
${char_val}: يخبر هذا bbqSQL أين يقارن النتائج من التحديد الفرعي للتحقق من النتيجة.
${comparator}: هذه هي الطريقة التي تخبر بها BBQSQL بمقارنة الاستجابات لتحديد ما إذا كانت النتيجة صحيحة أم لا. بشكل افتراضي، يتم استخدام الرمز >.
${sleep}: هذا اختياري ولكنه يخبر bbqSQL أين يقوم بإدراج عدد الثواني للنوم عند إجراء حقن SQL قائم على الوقت.
ليست كل هذه العناصر النائبة مطلوبة. على سبيل المثال، إذا اكتشفت حقن SQL شبه أعمى قائم على القيمة المنطقية (boolean-based)، يمكنك حذف المعلمة ${sleep}.
لدى BBQSQL العديد من معلمات HTTP يمكنك تكوينها عند إعداد هجومك. كحد أدنى، يجب توفير URL، وأين تريد تشغيل استعلام الحقن، والطريقة. الخيارات التالية يمكن تعيينها:
تحدد أين تريد إدراج استعلام الحقن باستخدام القالب ${injection}. بدون قالب الحقن، لن تعرف الأداة أين تدرج الاستعلام.
قدم الملفات التي سيتم إرسالها مع الطلب. اضبط القيمة على المسار وسيتولى BBQSQL فتح/تضمين الملف.
رؤوس HTTP التي سيتم إرسالها مع الطلبات. يمكن أن تكون سلسلة نصية أو قاموسًا. على سبيل المثال:
{"User-Agent":"bbqsql"}
أو
"User-Agent: bbqsql"
قاموس أو سلسلة نصية من الكوكيز التي سيتم إرسالها مع الطلب. على سبيل المثال:
{"PHPSESSIONID":"123123"}
أو
PHPSESSIONID=123123;JSESSIONID=foobar
حدد رابطًا يجب إرسال الطلبات إليه.
هذه قيمة منطقية تحدد ما إذا كانت إعادة توجيه HTTP ستُتبع عند إجراء الطلبات.
حدد وكيل HTTP لاستخدامه في الطلب كقاموس. على سبيل المثال:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
حدد بيانات POST لإرسالها مع الطلب. يمكن أن تكون سلسلة نصية أو قاموسًا. على سبيل المثال:
{"input_field":"value"}
أو
input_field=value
حدد طريقة طلب HTTP. الطرق الصالحة هي:
'get','options','head','post','put','patch','delete'
حدد مجموعة (tuple) من اسم المستخدم وكلمة المرور لاستخدامها في مصادقة HTTP الأساسية. على سبيل المثال:
("myusername","mypassword")
بعد إعداد هجومك في الواجهة، يمكنك تصدير ملف الإعدادات. سترى الخيار عند تشغيل الأداة. ملف الإعدادات المُصدر يستخدم ConfigParser، وهو سهل القراءة. يمكن رؤية مثال لملف إعدادات أدناه:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
هذا مفيد إذا كنت تخطط لاستئناف هجوم أو ربما تعديل الاستعلام فقط دون عناء إعادة تكوين كل خيار.
يمكنك أيضًا استيراد إعدادات من سطر الأوامر أو من واجهة المستخدم. لاستيراد إعدادات من سطر الأوامر فقط قم بتشغيل bbqsql مع الخيارات التالية:
bbqsql -c config_file
عند تحميل ملف إعدادات سواء عبر سطر الأوامر أو واجهة المستخدم، يتم تشغيل نفس إجراءات التحقق من الصحة على المعلمات للتأكد من صحتها.
أحيانًا تحتاج إلى فعل شيء مجنون حقًا. ربما تحتاج إلى تشفير القيم التي تدخل إلى حقل قبل إرسال الطلب أو ربما تحتاج إلى ترميز URL ثلاث مرات. بغض النظر، هذه المواقف تجعل الأدوات الأخرى غير قابلة للاستخدام. يتيح لك BBQSQL تعريف وظائف "خطاف" (hook) ستستدعيها الأداة في نقاط مختلفة خلال الطلب. على سبيل المثال، يمكنك تحديد وظيفة pre_request تأخذ الطلب كوسيطة، وتقوم بأي تحويرات ضرورية، وتعيد الطلب المعدل ليتم إرساله إلى الخادم.
لتنفيذ ذلك، قم بإنشاء ملف بايثون وحدد وظائف الخطاف. أسماء الوظائف المتاحة مذكورة أدناه. في ملف الخطاف الخاص بك، يمكنك تحديد أقل عدد أو أكثر من وظائف الخطاف هذه حسب رغبتك. ثم، في قسم bbqsql_options من القائمة، يمكنك تحديد موقع ملف الخطاف الخاص بك. سيقوم BBQSQL بسحب هذا الملف واستخدام أي خطافات قمت بتعريفها.
من المهم أن يكون لوظائف الخطاف التي تحددها الأسماء الدقيقة المحددة أدناه وإلا لن يعرف BBQSQL أي خطاف يستدعي متى. تستقبل وظيفة args معلمة واحدة تحتوي على جميع الوسيطات المستخدمة لإنشاء طلب HTTP. تستقبل وظيفة pre_request كائن الطلب قبل إرساله. تستقبل وظيفة post_request كائن الطلب بعد إرساله. تستقبل وظيفة response كائن الاستجابة قبل إعادته إلى BBQSQL.
الخطافات التالية متاحة:
args: قاموس بالوسائط التي يتم إرسالها إلى Request().
pre_request: كائن Request، مباشرة قبل إرساله.
post_request: كائن Request، مباشرة بعد إرساله.
response: الاستجابة الناتجة من Request.
لمزيد من المعلومات حول كيفية عمل هذه الخطافات وكيف يجب أن يبدو قاموس hooks الخاص بك، راجع توثيق مكتبة الطلبات حول خطافاتها
قد يبدو ملف خطافات مثال كالتالي:
# file: hooks.py
import time
def pre_request(req):
"""
this hook replaces a placeholder with the current time
expecting the url to look like this:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
قدم أي إصلاحات للأخطاء أو طلبات ميزات إلى https://github.com/Neohapsis/bbqsql/
من فضلك! نرى أن هذه نقطة انطلاق رائعة لبناء إطار عمل كامل لحقن SQL. لا تتردد في عمل Fork للكود ويمكننا دمج تغييراتك إذا كانت مفيدة.
BBQ لذيذة للغاية وكذلك حقن SQL!