عند استغلال ثغرات حقن SQL ، غالباً ما يكون من الضروري جمع بعض المعلومات حول قاعدة البيانات نفسها. يتضمن ذلك نوع قاعدة البيانات وإصدارها (version) ، و محتويات قاعدة البيانات من حيث الجداول والأعمدة التي تحتوي عليها.
الاستعلام عن نوع و إصدار قاعدة البيانات:
تُوفر قواعد البيانات المختلفة طرقاً مختلفة للاستعلام عن إصدارها (version). وغالباً ما تحتاج إلى تجربة استعلامات مختلفة للعثور على واحد يفي بالغرض، مما يسمح لك بتحديد نوع قاعدة البيانات وإصدارها.
والاستعلامات الخاصة بتحديد إصدار قاعدة البيانات لبعض أنواع قواعد البيانات الشائعة كما يلي:
نوع قاعدة البيانات (Database type) | الاستعلام (Query) |
Microsoft, MySQL | SELECT @@version |
Oracle | SELECT * FROM v$version |
PostgreSQL | SELECT version() |
على سبيل المثال، يمكنك استخدام هجوم UNION مع الإدخال التالي:
' UNION SELECT @@version--
قد يؤدي ذلك إلى إرجاع خرج (output) كما يلي، مما يؤكد أن قاعدة البيانات هي Microsoft SQL Server ، ويعطي الإصدار المستخدم :
Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
سرد (listing أو تعداد) محتويات قاعدة البيانات:
تحتوي معظم أنواع قواعد البيانات (باستثناء Oracle) على مجموعة من طرق العرض تسمى مخطط المعلومات (information schema) التي توفر معلومات حول قاعدة البيانات.
يمكنك الاستعلام عن information_schema.tables لسرد الجداول في قاعدة البيانات :
SELECT * FROM information_schema.tables
هذا يعيد (يُرجِع) خرجاً (output) كما يلي:
TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE |
MyDatabase | dbo | Products | BASE TABLE |
MyDatabase | dbo | Users | BASE TABLE |
MyDatabase | dbo | Feedback | BASE TABLE |
يشير هذا الخرج (output) إلى وجود ثلاثة جداول (tables) ، تسمى products و users و Feedback.
يمكنك بعد ذلك الاستعلام عن information_schema.columns لسرد الأعمدة في الجداول المفردة (كل جدول على حدى):
SELECT * FROM information_schema.columns WHERE table_name = 'Users'
و هذا سيُرجِع الخرج (output) التالي:
TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | DATA_TYPE |
MyDatabase | dbo | Users | UserId | int |
MyDatabase | dbo | Users | Username | varchar |
MyDatabase | dbo | Users | Password | varchar |
يُظهِر هذا الخرج الأعمدة الموجودة في الجدول المحدد ونوع البيانات لكل عمود.
نظير (أو مُعادل equivalent) مخطط المعلومات (information schema) في Oracle:
في Oracle ، يمكنك الحصول على نفس المعلومات من خلال استعلامات مختلفة قليلاً.
يمكنك سرد الجداول عن طريق الاستعلام عن all_tables:
SELECT * FROM all_tables
ويمكنك سرد الأعمدة عن طريق الاستعلام عن all_tab_columns :
SELECT * FROM all_tab_columns WHERE table_name = 'USERS'
المصدر: https://portswigger.net/web-security/sql-injection/examining-the-database