SQL-инъекции: Исследование базы данных атаками

Источник: «Examining the database in SQL injection attacks»
При эксплуатации уязвимостей SQL-инъекций часто необходимо собрать некоторую информацию о самой базе данных. Это включает тип и версию программного обеспечения базы данных, а также содержимое базы данных с точки зрения содержащихся в ней таблиц и столбцов.

Запрос типа и версии базы данных

Различные базы данных предоставляют разные способы запроса своей версии. Вам часто приходится пробовать разные SQL-запросы, чтобы найти работающий, позволяющий определить как тип, таки версию программного обеспечения базы данных.

Запросы для определения версии базы данных некоторых популярных типов баз данных следующие:

Тип базы данныхSQL-запрос
Microsoft, MySQLSELECT @@version
OracleSELECT * FROM v$version
PostgreSQLSELECT 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'

Дополнительные материалы

Предыдущая Статья

Laravel: Девять типичных ошибок новичков

Следующая Статья

Новое в Symfony 6.3 — Ограничение надёжности пароля