فحص قاعدة البيانات في هجمات حقن SQL

عند استغلال ثغرات حقن 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